<sys/socket.h>, <netinet/{in,tcp,udp,udp_var}.h>

. add sa_len to sockaddr, sin_len to sockaddr_in
	. rename SCM_CREDENTIALS to SCM_CREDS
	. retire PF_FILE (same as PF_UNIX)

Change-Id: Id3ec63fe2556fc7ceb48de8ad4e80736df3ddfc7
This commit is contained in:
Ben Gras 2013-12-06 15:56:45 +01:00 committed by Lionel Sambuc
parent dda632a24f
commit 01624e6f86
14 changed files with 365 additions and 104 deletions

View file

@ -791,7 +791,7 @@ recv_cred(devminor_t minor, struct ancillary *data,
cmsg->cmsg_len = CMSG_LEN(sizeof(struct uucred));
cmsg->cmsg_level = SOL_SOCKET;
cmsg->cmsg_type = SCM_CREDENTIALS;
cmsg->cmsg_type = SCM_CREDS;
memcpy(CMSG_DATA(cmsg), &data->cred, sizeof(struct uucred));
return OK;

View file

@ -2,6 +2,7 @@
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/ucred.h>
/*
* get the effective user ID and effective group ID of a peer

View file

@ -95,6 +95,7 @@ static int _tcp_getpeername(int sock, struct sockaddr *__restrict address,
sin.sin_family= AF_INET;
sin.sin_addr.s_addr= tcpconfp->nwtc_remaddr;
sin.sin_port= tcpconfp->nwtc_remport;
sin.sin_len = sizeof(sin);
len= *address_len;
if (len > sizeof(sin))
@ -122,6 +123,7 @@ static int _udp_getpeername(int sock, struct sockaddr *__restrict address,
sin.sin_family= AF_INET;
sin.sin_addr.s_addr= udpopt->nwuo_remaddr;
sin.sin_port= udpopt->nwuo_remport;
sin.sin_len = sizeof(sin);
len= *address_len;
if (len > sizeof(sin))

View file

@ -111,6 +111,7 @@ static int _tcp_getsockname(int fd, struct sockaddr *__restrict address,
sin.sin_family= AF_INET;
sin.sin_addr.s_addr= tcpconf->nwtc_locaddr ;
sin.sin_port= tcpconf->nwtc_locport;
sin.sin_len= sizeof(sin);
len= *address_len;
if (len > sizeof(sin))
@ -140,6 +141,7 @@ static int _udp_getsockname(int fd, struct sockaddr *__restrict address,
sin.sin_family= AF_INET;
sin.sin_addr.s_addr= udpopt->nwuo_locaddr ;
sin.sin_port= udpopt->nwuo_locport;
sin.sin_len= sizeof(sin);
len= *address_len;
if (len > sizeof(sin))

View file

@ -117,6 +117,7 @@ static ssize_t _tcp_recvfrom(int sock, void *__restrict buffer, size_t length,
sin.sin_family= AF_INET;
sin.sin_addr.s_addr= tcpconfp->nwtc_remaddr;
sin.sin_port= tcpconfp->nwtc_remport;
sin.sin_len= sizeof(sin);
len= *address_len;
if (len > sizeof(sin))
len= sizeof(sin);
@ -170,6 +171,7 @@ static ssize_t _udp_recvfrom(int sock, void *__restrict buffer, size_t length,
sin.sin_family= AF_INET;
sin.sin_addr.s_addr= udpoptp->nwuo_remaddr;
sin.sin_port= udpoptp->nwuo_remport;
sin.sin_len= sizeof(sin);
len= *address_len;
if (len > sizeof(sin))
len= sizeof(sin);
@ -216,6 +218,7 @@ static ssize_t _udp_recvfrom(int sock, void *__restrict buffer, size_t length,
sin.sin_family= AF_INET;
sin.sin_addr.s_addr= io_hdrp->uih_src_addr;
sin.sin_port= io_hdrp->uih_src_port;
sin.sin_len= sizeof(sin);
len= *address_len;
if (len > sizeof(sin))
len= sizeof(sin);

View file

@ -2,7 +2,7 @@
#include "namespace.h"
#ifdef __weak_alias
__weak_alias(socket, _socket)
__weak_alias(socket, __socket30)
#endif
#include <errno.h>

View file

@ -113,10 +113,8 @@ __RCSID("$NetBSD: ftpd.c,v 1.198 2012/06/19 06:06:34 dholland Exp $");
#include <sys/resource.h>
#include <netinet/in.h>
#ifndef __minix
#include <netinet/in_systm.h>
#include <netinet/ip.h>
#endif
#define FTP_NAMES
#include <arpa/ftp.h>

View file

@ -1,5 +1,5 @@
INCSDIR= /usr/include/netinet
INCS+= in.h tcp.h
INCS+= in.h tcp.h in_systm.h ip.h
.include <bsd.kinc.mk>

View file

@ -1,4 +1,4 @@
/* $NetBSD: in.h,v 1.86 2009/09/14 10:36:50 degroote Exp $ */
/* $NetBSD: in.h,v 1.87 2012/06/22 14:54:35 christos Exp $ */
/*
* Copyright (c) 1982, 1986, 1990, 1993
@ -234,14 +234,6 @@ struct in_addr {
/*
* Socket address, internet style.
*/
#ifdef __minix
struct sockaddr_in
{
sa_family_t sin_family;
in_port_t sin_port;
struct in_addr sin_addr;
};
#else /* !__minix */
struct sockaddr_in {
uint8_t sin_len;
sa_family_t sin_family;
@ -249,11 +241,9 @@ struct sockaddr_in {
struct in_addr sin_addr;
__int8_t sin_zero[8];
};
#endif /* !__minix */
#define INET_ADDRSTRLEN 16
#ifndef __minix
/*
* Structure used to describe IP options.
* Used to store options internally, to pass them to a process,
@ -269,13 +259,11 @@ struct ip_opts {
__int8_t ip_opts[40]; /* actually variable in size */
#endif
};
#endif /* __minix */
/*
* Options for use with [gs]etsockopt at the IP level.
* First word of comment is data type; bool is stored in int.
*/
#ifndef __minix
#define IP_OPTIONS 1 /* buf/ip_opts; set/get IP options */
#define IP_HDRINCL 2 /* int; header is included with data */
#define IP_TOS 3 /* int; IP type of service and preced. */
@ -287,10 +275,9 @@ struct ip_opts {
#define IP_MULTICAST_IF 9 /* in_addr; set/get IP multicast i/f */
#define IP_MULTICAST_TTL 10 /* u_char; set/get IP multicast ttl */
#define IP_MULTICAST_LOOP 11 /* u_char; set/get IP multicast loopback */
#endif /* !__minix */
#define IP_ADD_MEMBERSHIP 12 /* ip_mreq; add an IP group membership */
#define IP_DROP_MEMBERSHIP 13 /* ip_mreq; drop an IP group membership */
#ifndef __minix
#define IP_PORTALGO 18 /* int; port selection algo (rfc6056) */
#define IP_PORTRANGE 19 /* int; range to use for ephemeral port */
#define IP_RECVIF 20 /* bool; receive reception if w/dgram */
#define IP_ERRORMTU 21 /* int; get MTU of last xmit = EMSGSIZE */
@ -299,16 +286,13 @@ struct ip_opts {
#endif
#define IP_RECVTTL 23 /* bool; receive IP TTL w/dgram */
#define IP_MINTTL 24 /* minimum TTL for packet or drop */
#endif /* !__minix */
#ifndef __minix
/*
* Defaults and limits for options
*/
#define IP_DEFAULT_MULTICAST_TTL 1 /* normally limit m'casts to 1 hop */
#define IP_DEFAULT_MULTICAST_LOOP 1 /* normally hear sends if a member */
#define IP_MAX_MEMBERSHIPS 20 /* per socket; must fit in one mbuf */
#endif /* !__minix */
/*
* Argument structure for IP_ADD_MEMBERSHIP and IP_DROP_MEMBERSHIP.
@ -318,7 +302,6 @@ struct ip_mreq {
struct in_addr imr_interface; /* local IP address of interface */
};
#ifndef __minix
/*
* Argument for IP_PORTRANGE:
* - which range to search when port is unspecified at bind() or connect()
@ -502,14 +485,12 @@ struct ip_mreq {
{ "stats", CTLTYPE_STRUCT }, \
}
#endif /* _NETBSD_SOURCE */
#endif /* __minix */
/* INET6 stuff */
#define __KAME_NETINET_IN_H_INCLUDED_
#include <netinet6/in6.h>
#undef __KAME_NETINET_IN_H_INCLUDED_
#ifndef __minix
#ifdef _KERNEL
/*
* in_cksum_phdr:
@ -617,6 +598,5 @@ sockaddr_in_alloc(const struct in_addr *addr, in_port_t port, int flags)
return sa;
}
#endif /* _KERNEL */
#endif /* __minix */
#endif /* !_NETINET_IN_H_ */

View file

@ -1,4 +1,4 @@
/* $NetBSD: tcp.h,v 1.28 2007/12/25 18:33:47 perry Exp $ */
/* $NetBSD: tcp.h,v 1.30 2012/01/07 20:20:22 christos Exp $ */
/*
* Copyright (c) 1982, 1986, 1993
@ -37,29 +37,30 @@
#include <sys/featuretest.h>
#if defined(_NETBSD_SOURCE)
#include <sys/types.h>
typedef u_int32_t tcp_seq;
typedef uint32_t tcp_seq;
/*
* TCP header.
* Per RFC 793, September, 1981.
* Updated by RFC 3168, September, 2001.
*/
struct tcphdr {
u_int16_t th_sport; /* source port */
u_int16_t th_dport; /* destination port */
uint16_t th_sport; /* source port */
uint16_t th_dport; /* destination port */
tcp_seq th_seq; /* sequence number */
tcp_seq th_ack; /* acknowledgement number */
#if BYTE_ORDER == LITTLE_ENDIAN
/*LINTED non-portable bitfields*/
u_int8_t th_x2:4, /* (unused) */
uint8_t th_x2:4, /* (unused) */
th_off:4; /* data offset */
#endif
#if BYTE_ORDER == BIG_ENDIAN
/*LINTED non-portable bitfields*/
u_int8_t th_off:4, /* data offset */
uint8_t th_off:4, /* data offset */
th_x2:4; /* (unused) */
#endif
u_int8_t th_flags;
uint8_t th_flags;
#define TH_FIN 0x01
#define TH_SYN 0x02
#define TH_RST 0x04
@ -68,9 +69,9 @@ struct tcphdr {
#define TH_URG 0x20
#define TH_ECE 0x40
#define TH_CWR 0x80
u_int16_t th_win; /* window */
u_int16_t th_sum; /* checksum */
u_int16_t th_urp; /* urgent pointer */
uint16_t th_win; /* window */
uint16_t th_sum; /* checksum */
uint16_t th_urp; /* urgent pointer */
} __packed;
#define TCPOPT_EOL 0
@ -115,5 +116,18 @@ struct tcphdr {
* User-settable options (used with setsockopt).
*/
#define TCP_NODELAY 1 /* don't delay send to coalesce packets */
#define TCP_MAXSEG 2 /* set maximum segment size */
#define TCP_KEEPIDLE 3
#ifdef notyet
#define TCP_NOPUSH 4 /* reserved for FreeBSD compat */
#endif
#define TCP_KEEPINTVL 5
#define TCP_KEEPCNT 6
#define TCP_KEEPINIT 7
#ifdef notyet
#define TCP_NOOPT 8 /* reserved for FreeBSD compat */
#endif
#define TCP_MD5SIG 0x10 /* use MD5 digests (RFC2385) */
#define TCP_CONGCTL 0x20 /* selected congestion control */
#endif /* !_NETINET_TCP_H_ */

View file

@ -1,4 +1,4 @@
/* $NetBSD: udp.h,v 1.15 2012/01/07 20:20:12 christos Exp $ */
/* $NetBSD: udp.h,v 1.16 2012/06/22 14:54:35 christos Exp $ */
/*
* Copyright (c) 1982, 1986, 1993
@ -48,7 +48,6 @@ struct udphdr {
/* socket options for UDP */
#define UDP_ENCAP 100
#define UDP_RFC6056ALGO 200
/* Encapsulation types */
#define UDP_ENCAP_ESPINUDP_NON_IKE 1 /* draft-ietf-ipsec-nat-t-ike-00/01 */

View file

@ -1,4 +1,4 @@
/* $NetBSD: udp_var.h,v 1.37 2011/09/24 17:18:17 christos Exp $ */
/* $NetBSD: udp_var.h,v 1.38 2012/06/22 14:54:35 christos Exp $ */
/*
* Copyright (c) 1982, 1986, 1989, 1993
@ -75,7 +75,6 @@ struct udpiphdr {
#define UDPCTL_RECVSPACE 3 /* default recv buffer */
#define UDPCTL_LOOPBACKCKSUM 4 /* do UDP checksum on loopback */
#define UDPCTL_STATS 5 /* UDP statistics */
#define UDPCTL_RFC6056 6 /* RFC 6056 algorithm selection */
#define UDPCTL_MAXID 7
#define UDPCTL_NAMES { \
@ -85,7 +84,6 @@ struct udpiphdr {
{ "recvspace", CTLTYPE_INT }, \
{ "do_loopback_cksum", CTLTYPE_INT }, \
{ "stats", CTLTYPE_STRUCT }, \
{ "rfc6056", CTLTYPE_INT }, \
}
#ifdef _KERNEL

View file

@ -120,10 +120,22 @@ typedef _BSD_SSIZE_T_ ssize_t;
#define SO_ACCEPTCONN 0x0002 /* socket has had listen() */
#define SO_REUSEADDR 0x0004 /* allow local address reuse */
#define SO_KEEPALIVE 0x0008 /* keep connections alive */
#define SO_TYPE 0x0010 /* get socket type */
#define SO_DONTROUTE 0x0010 /* just use interface addresses */
#define SO_BROADCAST 0x0020 /* permit sending of broadcast msgs */
#define SO_USELOOPBACK 0x0040 /* bypass hardware when possible */
#define SO_LINGER 0x0080 /* linger on close if data present */
#define SO_OOBINLINE 0x0100 /* leave received OOB data in line */
#define SO_REUSEPORT 0x0200 /* allow local address & port reuse */
/* SO_OTIMESTAMP 0x0400 */
#define SO_NOSIGPIPE 0x0800 /* no SIGPIPE from EPIPE */
#define SO_ACCEPTFILTER 0x1000 /* there is an accept filter */
#define SO_TIMESTAMP 0x2000 /* timestamp received dgram traffic */
#ifdef __minix
#define SO_PASSCRED 0x100000
#define SO_PEERCRED 0x200000
#endif
#define SO_PASSCRED 0x0012
#define SO_PEERCRED 0x0014
/*
* Additional options, not kept in so_options.
@ -135,8 +147,27 @@ typedef _BSD_SSIZE_T_ ssize_t;
/* SO_OSNDTIMEO 0x1005 */
/* SO_ORCVTIMEO 0x1006 */
#define SO_ERROR 0x1007 /* get error status and clear */
#define SO_TYPE 0x1008 /* get socket type */
#define SO_OVERFLOWED 0x1009 /* datagrams: return packets dropped */
#define SO_NOHEADER 0x100a /* user supplies no header to kernel;
* kernel removes header and supplies
* payload
*/
#define SO_SNDTIMEO 0x100b /* send timeout */
#define SO_RCVTIMEO 0x100c /* receive timeout */
/*
* Structure used for manipulating linger option.
*/
struct linger {
int l_onoff; /* option on/off */
int l_linger; /* linger time in seconds */
};
struct accept_filter_arg {
char af_name[16];
char af_arg[256-16];
};
/*
* Level number for (get/set)sockopt() to apply to socket itself.
@ -165,7 +196,7 @@ typedef _BSD_SSIZE_T_ ssize_t;
#define AF_LAT 14 /* LAT */
#define AF_HYLINK 15 /* NSC Hyperchannel */
#define AF_APPLETALK 16 /* Apple Talk */
#define AF_ROUTE 17 /* Internal Routing Protocol */
#define AF_OROUTE 17 /* Internal Routing Protocol */
#define AF_LINK 18 /* Link layer interface */
#if defined(_NETBSD_SOURCE)
#define pseudo_AF_XTP 19 /* eXpress Transfer Protocol (no AF) */
@ -191,44 +222,44 @@ typedef _BSD_SSIZE_T_ ssize_t;
#endif
#define AF_BLUETOOTH 31 /* Bluetooth: HCI, SCO, L2CAP, RFCOMM */
#define AF_IEEE80211 32 /* IEEE80211 */
#define AF_MAX 33
#ifndef gid_t
typedef __gid_t gid_t; /* group id */
#define gid_t __gid_t
#endif
#ifndef uid_t
typedef __uid_t uid_t; /* user id */
#define uid_t __uid_t
#endif
#if defined(__minix) && !defined(_STANDALONE)
#include <sys/ucred.h>
#endif
#define AF_MPLS 33 /* MultiProtocol Label Switching */
#define AF_ROUTE 34 /* Internal Routing Protocol */
#define AF_MAX 35
/*
* Structure used by kernel to store most
* addresses.
*/
struct sockaddr
{
sa_family_t sa_family;
char sa_data[8]; /* Big enough for sockaddr_in */
struct sockaddr {
__uint8_t sa_len; /* total length */
sa_family_t sa_family; /* address family */
char sa_data[14]; /* actually longer; address value */
};
#if defined(_KERNEL)
/*
* Structure used by kernel to pass protocol
* information in raw sockets.
*/
struct sockproto {
u_short sp_family; /* address family */
u_short sp_protocol; /* protocol */
};
#endif /* _KERNEL */
#if 1
/*
* RFC 2553: protocol-independent placeholder for socket addresses
*/
#define _SS_MAXSIZE 128
#define _SS_ALIGNSIZE (sizeof(__int64_t))
#define _SS_PAD1SIZE (_SS_ALIGNSIZE - 1)
#define _SS_PAD2SIZE (_SS_MAXSIZE - 1 - \
#define _SS_PAD1SIZE (_SS_ALIGNSIZE - 2)
#define _SS_PAD2SIZE (_SS_MAXSIZE - 2 - \
_SS_PAD1SIZE - _SS_ALIGNSIZE)
#if (_XOPEN_SOURCE - 0) >= 500 || defined(_NETBSD_SOURCE)
struct sockaddr_storage {
__uint8_t ss_len; /* address length */
sa_family_t ss_family; /* address family */
char __ss_pad1[_SS_PAD1SIZE];
__int64_t __ss_align;/* force desired structure storage alignment */
@ -237,6 +268,7 @@ struct sockaddr_storage {
#define sstosa(__ss) ((struct sockaddr *)(__ss))
#define sstocsa(__ss) ((const struct sockaddr *)(__ss))
#endif /* _XOPEN_SOURCE >= 500 || _NETBSD_SOURCE */
#endif /* 1 */
/*
* Protocol families, same as address families for now.
@ -244,7 +276,6 @@ struct sockaddr_storage {
#define PF_UNSPEC AF_UNSPEC
#define PF_LOCAL AF_LOCAL
#define PF_UNIX PF_LOCAL /* backward compatibility */
#define PF_FILE PF_LOCAL /* Minix compatibility */
#define PF_INET AF_INET
#define PF_IMPLINK AF_IMPLINK
#define PF_PUP AF_PUP
@ -287,6 +318,160 @@ struct sockaddr_storage {
#define PF_MAX AF_MAX
#if defined(_NETBSD_SOURCE)
#ifndef gid_t
typedef __gid_t gid_t; /* group id */
#define gid_t __gid_t
#endif
#ifndef uid_t
typedef __uid_t uid_t; /* user id */
#define uid_t __uid_t
#endif
/*
* Socket credentials.
*/
struct sockcred {
uid_t sc_uid; /* real user id */
uid_t sc_euid; /* effective user id */
gid_t sc_gid; /* real group id */
gid_t sc_egid; /* effective group id */
int sc_ngroups; /* number of supplemental groups */
gid_t sc_groups[1]; /* variable length */
};
/*
* Compute size of a sockcred structure with groups.
*/
#define SOCKCREDSIZE(ngrps) \
(sizeof(struct sockcred) + (sizeof(gid_t) * ((ngrps) - 1)))
#endif /* _NETBSD_SOURCE */
#if defined(_NETBSD_SOURCE)
/*
* Definitions for network related sysctl, CTL_NET.
*
* Second level is protocol family.
* Third level is protocol number.
*
* Further levels are defined by the individual families below.
*/
#define NET_MAXID AF_MAX
#define CTL_NET_NAMES { \
{ 0, 0 }, \
{ "local", CTLTYPE_NODE }, \
{ "inet", CTLTYPE_NODE }, \
{ "implink", CTLTYPE_NODE }, \
{ "pup", CTLTYPE_NODE }, \
{ "chaos", CTLTYPE_NODE }, \
{ "xerox_ns", CTLTYPE_NODE }, \
{ "iso", CTLTYPE_NODE }, \
{ "emca", CTLTYPE_NODE }, \
{ "datakit", CTLTYPE_NODE }, \
{ "ccitt", CTLTYPE_NODE }, \
{ "ibm_sna", CTLTYPE_NODE }, \
{ "decnet", CTLTYPE_NODE }, \
{ "dec_dli", CTLTYPE_NODE }, \
{ "lat", CTLTYPE_NODE }, \
{ "hylink", CTLTYPE_NODE }, \
{ "appletalk", CTLTYPE_NODE }, \
{ "oroute", CTLTYPE_NODE }, \
{ "link_layer", CTLTYPE_NODE }, \
{ "xtp", CTLTYPE_NODE }, \
{ "coip", CTLTYPE_NODE }, \
{ "cnt", CTLTYPE_NODE }, \
{ "rtip", CTLTYPE_NODE }, \
{ "ipx", CTLTYPE_NODE }, \
{ "inet6", CTLTYPE_NODE }, \
{ "pip", CTLTYPE_NODE }, \
{ "isdn", CTLTYPE_NODE }, \
{ "natm", CTLTYPE_NODE }, \
{ "arp", CTLTYPE_NODE }, \
{ "key", CTLTYPE_NODE }, \
{ "ieee80211", CTLTYPE_NODE }, \
{ "mlps", CTLTYPE_NODE }, \
{ "route", CTLTYPE_NODE }, \
}
struct kinfo_pcb {
__uint64_t ki_pcbaddr; /* PTR: pcb addr */
__uint64_t ki_ppcbaddr; /* PTR: ppcb addr */
__uint64_t ki_sockaddr; /* PTR: socket addr */
__uint32_t ki_family; /* INT: protocol family */
__uint32_t ki_type; /* INT: socket type */
__uint32_t ki_protocol; /* INT: protocol */
__uint32_t ki_pflags; /* INT: generic protocol flags */
__uint32_t ki_sostate; /* INT: socket state */
__uint32_t ki_prstate; /* INT: protocol state */
__int32_t ki_tstate; /* INT: tcp state */
__uint32_t ki_tflags; /* INT: tcp flags */
__uint64_t ki_rcvq; /* U_LONG: receive queue len */
__uint64_t ki_sndq; /* U_LONG: send queue len */
union {
struct sockaddr _kis_src; /* STRUCT: local address */
char _kis_pad[256 + 8]; /* pad to max addr length */
} ki_s;
union {
struct sockaddr _kid_dst; /* STRUCT: remote address */
char _kid_pad[256 + 8]; /* pad to max addr length */
} ki_d;
__uint64_t ki_inode; /* INO_T: fake inode number */
__uint64_t ki_vnode; /* PTR: if associated with file */
__uint64_t ki_conn; /* PTR: control block of peer */
__uint64_t ki_refs; /* PTR: referencing socket */
__uint64_t ki_nextref; /* PTR: link in refs list */
};
#define ki_src ki_s._kis_src
#define ki_dst ki_d._kid_dst
#define PCB_SLOP 20
#define PCB_ALL 0
#endif /* _NETBSD_SOURCE */
#if defined(_NETBSD_SOURCE)
/*
* PF_ROUTE - Routing table
*
* Three additional levels are defined:
* Fourth: address family, 0 is wildcard
* Fifth: type of info, defined below
* Sixth: flag(s) to mask with for NET_RT_FLAGS
*/
#define NET_RT_DUMP 1 /* dump; may limit to a.f. */
#define NET_RT_FLAGS 2 /* by flags, e.g. RESOLVING */
#define NET_RT_OOIFLIST 3 /* old NET_RT_IFLIST (pre 1.5) */
#define NET_RT_OIFLIST 4 /* survey interface list */
#define NET_RT_IFLIST 5
#define NET_RT_MAXID 6
#define CTL_NET_RT_NAMES { \
{ 0, 0 }, \
{ "dump", CTLTYPE_STRUCT }, \
{ "flags", CTLTYPE_STRUCT }, \
{ 0, 0 }, \
{ 0, 0 }, \
{ "iflist", CTLTYPE_STRUCT }, \
}
#endif /* _NETBSD_SOURCE */
/*
* Maximum queue length specifiable by listen(2).
*/
#ifndef SOMAXCONN
#define SOMAXCONN 128
#endif
/*
* Message header for recvmsg and sendmsg calls.
* Used value-result for recvmsg, value only for sendmsg.
@ -301,10 +486,35 @@ struct msghdr {
int msg_flags; /* flags on received message */
};
#define MSG_OOB 0x0001 /* process out-of-band data */
#define MSG_PEEK 0x0002 /* peek at incoming message */
#define MSG_DONTROUTE 0x0004 /* send without using routing tables */
#define MSG_EOR 0x0008 /* complete record */
#define MSG_OOB 0x0001 /* process out-of-band data */
#define MSG_PEEK 0x0002 /* peek at incoming message */
#define MSG_DONTROUTE 0x0004 /* send without using routing tables */
#define MSG_EOR 0x0008 /* data completes record */
#define MSG_TRUNC 0x0010 /* data discarded before delivery */
#define MSG_CTRUNC 0x0020 /* control data lost before delivery */
#define MSG_WAITALL 0x0040 /* wait for full request or error */
#define MSG_DONTWAIT 0x0080 /* this message should be nonblocking */
#define MSG_BCAST 0x0100 /* this message was rcvd using link-level brdcst */
#define MSG_MCAST 0x0200 /* this message was rcvd using link-level mcast */
#define MSG_NOSIGNAL 0x0400 /* do not generate SIGPIPE on EOF */
#if defined(_NETBSD_SOURCE)
#define MSG_CMSG_CLOEXEC 0x0800 /* close on exec receiving fd */
#define MSG_NBIO 0x1000 /* use non-blocking I/O */
#define MSG_WAITFORONE 0x2000 /* recvmmsg() wait for one message */
struct mmsghdr {
struct msghdr msg_hdr;
unsigned int msg_len;
};
#endif
/* Extra flags used internally only */
#define MSG_USERFLAGS 0x0ffffff
#define MSG_NAMEMBUF 0x1000000 /* msg_name is an mbuf */
#define MSG_CONTROLMBUF 0x2000000 /* msg_control is an mbuf */
#define MSG_IOVUSRSPACE 0x4000000 /* msg_iov is in user space */
#define MSG_LENUSRSPACE 0x8000000 /* address length is in user space */
/*
* Header for ancillary data objects in msg_control buffer.
* Used for additional information with/about a datagram
@ -318,37 +528,55 @@ struct cmsghdr {
/* followed by u_char cmsg_data[]; */
};
#define CMSG_FIRSTHDR(mhdr) \
( (mhdr)->msg_controllen >= sizeof(struct cmsghdr) ? \
(struct cmsghdr *)(mhdr)->msg_control : \
(struct cmsghdr *)NULL )
/* given pointer to struct cmsghdr, return pointer to data */
#define CMSG_DATA(cmsg) \
((u_char *)(void *)(cmsg) + __CMSG_ALIGN(sizeof(struct cmsghdr)))
#define CCMSG_DATA(cmsg) \
((const u_char *)(const void *)(cmsg) + \
__CMSG_ALIGN(sizeof(struct cmsghdr)))
#define CMSG_ALIGN(len) \
( (len % sizeof(long) == 0) ? \
len : \
len + sizeof(long) - (len % sizeof(long)) )
/*
* Alignment requirement for CMSG struct manipulation.
* This basically behaves the same as ALIGN() ARCH/include/param.h.
* We declare it separately for two reasons:
* (1) avoid dependency between machine/param.h, and (2) to sync with kernel's
* idea of ALIGNBYTES at runtime.
* without (2), we can't guarantee binary compatibility in case of future
* changes in ALIGNBYTES.
*/
#define __CMSG_ALIGN(n) (((n) + __ALIGNBYTES) & ~__ALIGNBYTES)
#ifdef _KERNEL
#define CMSG_ALIGN(n) __CMSG_ALIGN(n)
#endif
#define CMSG_NXTHDR(mhdr, cmsg) \
( ((cmsg) == NULL) ? CMSG_FIRSTHDR(mhdr) : \
(((unsigned char *)(cmsg) + CMSG_ALIGN((cmsg)->cmsg_len) \
+ CMSG_ALIGN(sizeof(struct cmsghdr)) > \
(unsigned char *)((mhdr)->msg_control) + \
(mhdr)->msg_controllen) ? \
(struct cmsghdr *)NULL : \
(struct cmsghdr *)((unsigned char *)(cmsg) + \
CMSG_ALIGN((cmsg)->cmsg_len))) )
/* given pointer to struct cmsghdr, return pointer to next cmsghdr */
#define CMSG_NXTHDR(mhdr, cmsg) \
(((char *)(cmsg) + __CMSG_ALIGN((cmsg)->cmsg_len) + \
__CMSG_ALIGN(sizeof(struct cmsghdr)) > \
(((char *)(mhdr)->msg_control) + (mhdr)->msg_controllen)) ? \
(struct cmsghdr *)0 : \
(struct cmsghdr *)(void *)((char *)(cmsg) + \
__CMSG_ALIGN((cmsg)->cmsg_len)))
#define CMSG_DATA(cmsg) \
( (unsigned char *)(cmsg) + CMSG_ALIGN(sizeof(struct cmsghdr)) )
/*
* RFC 2292 requires to check msg_controllen, in case that the kernel returns
* an empty list for some reasons.
*/
#define CMSG_FIRSTHDR(mhdr) \
((mhdr)->msg_controllen >= sizeof(struct cmsghdr) ? \
(struct cmsghdr *)(mhdr)->msg_control : \
(struct cmsghdr *)0)
#define CMSG_SPACE(l) (CMSG_ALIGN(sizeof(struct cmsghdr)) + CMSG_ALIGN(l))
#define CMSG_LEN(l) (CMSG_ALIGN(sizeof(struct cmsghdr)) + (l))
#define CMSG_SPACE(l) (__CMSG_ALIGN(sizeof(struct cmsghdr)) + __CMSG_ALIGN(l))
#define CMSG_LEN(l) (__CMSG_ALIGN(sizeof(struct cmsghdr)) + (l))
/* "Socket"-level control message types: */
#define SCM_RIGHTS 0x01
#define SCM_CREDENTIALS 0x02
#define SCM_SECURITY 0x04
#define SCM_RIGHTS 0x01 /* access rights (array of int) */
#if defined(_NETBSD_SOURCE)
/* 0x02 timestamp (struct timeval50) */
#define SCM_CREDS 0x04 /* credentials (struct sockcred) */
#define SCM_TIMESTAMP 0x08 /* timestamp (struct timeval) */
#endif
/*
* Types of socket shutdown(2).
@ -359,9 +587,31 @@ struct cmsghdr {
#include <sys/cdefs.h>
#ifdef _KERNEL
static inline socklen_t
sockaddr_getlen(const struct sockaddr *sa)
{
return sa->sa_len;
}
__BEGIN_DECLS
int __cmsg_alignbytes(void);
struct sockaddr *sockaddr_copy(struct sockaddr *, socklen_t,
const struct sockaddr *);
struct sockaddr *sockaddr_externalize(struct sockaddr *, socklen_t,
const struct sockaddr *);
struct sockaddr *sockaddr_alloc(sa_family_t, socklen_t, int);
const void *sockaddr_const_addr(const struct sockaddr *, socklen_t *);
void *sockaddr_addr(struct sockaddr *, socklen_t *);
const struct sockaddr *sockaddr_any(const struct sockaddr *);
const struct sockaddr *sockaddr_any_by_family(int);
const void *sockaddr_anyaddr(const struct sockaddr *, socklen_t *);
int sockaddr_cmp(const struct sockaddr *, const struct sockaddr *);
struct sockaddr *sockaddr_dup(const struct sockaddr *, int);
void sockaddr_free(struct sockaddr *);
__END_DECLS
#endif /* _KERNEL */
#ifndef _KERNEL
__BEGIN_DECLS
int accept(int, struct sockaddr * __restrict, socklen_t * __restrict);
@ -371,6 +621,8 @@ int getpeername(int, struct sockaddr * __restrict, socklen_t * __restrict);
int getsockname(int, struct sockaddr * __restrict, socklen_t * __restrict);
int getsockopt(int, int, int, void *__restrict, socklen_t * __restrict);
int listen(int, int);
int paccept(int, struct sockaddr * __restrict, socklen_t * __restrict,
const sigset_t * __restrict, int);
ssize_t recv(int, void *, size_t, int);
ssize_t recvfrom(int, void *__restrict, size_t, int,
struct sockaddr * __restrict, socklen_t * __restrict);
@ -382,9 +634,20 @@ ssize_t sendmsg(int, const struct msghdr *, int);
int setsockopt(int, int, int, const void *, socklen_t);
int shutdown(int, int);
int sockatmark(int);
int socket(int, int, int);
int socket(int, int, int)
#if !defined(__LIBC12_SOURCE__) && !defined(_STANDALONE)
__RENAME(__socket30)
#endif
;
int socketpair(int, int, int, int *);
__END_DECLS
#if defined(_NETBSD_SOURCE)
int sendmmsg(int, struct mmsghdr *, unsigned int, unsigned int);
struct timespec;
int recvmmsg(int, struct mmsghdr *, unsigned int, unsigned int,
struct timespec *);
#endif
__END_DECLS
#endif /* !_KERNEL */
#endif /* !_SYS_SOCKET_H_ */

View file

@ -45,6 +45,7 @@
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/ucred.h>
#include <sys/stat.h>
#include <sys/time.h>
#include <sys/types.h>
@ -306,8 +307,8 @@ void test_header(void)
test_fail("SUN_LEN(&sun) should be 5");
}
if (PF_UNIX != PF_LOCAL || PF_UNIX != PF_FILE || PF_UNIX != AF_UNIX) {
test_fail("PF_UNIX, PF_LOCAL, PF_FILE, and AF_UNIX");
if (PF_UNIX != PF_LOCAL || PF_UNIX != AF_UNIX) {
test_fail("PF_UNIX, PF_LOCAL and AF_UNIX");
}
}
@ -2242,7 +2243,7 @@ void test_scm_credentials(void)
cmsg = CMSG_NXTHDR(&msg2, cmsg)) {
if (cmsg->cmsg_level == SOL_SOCKET &&
cmsg->cmsg_type == SCM_CREDENTIALS) {
cmsg->cmsg_type == SCM_CREDS) {
memcpy(&cred, CMSG_DATA(cmsg), sizeof(struct uucred));
break;