]> Zhao Yanbai Git Server - minix.git/commitdiff
<sys/socket.h>, <netinet/{in,tcp,udp,udp_var}.h>
authorBen Gras <ben@minix3.org>
Fri, 6 Dec 2013 14:56:45 +0000 (15:56 +0100)
committerLionel Sambuc <lionel@minix3.org>
Mon, 3 Mar 2014 19:47:03 +0000 (20:47 +0100)
. 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

14 files changed:
drivers/uds/ioc_uds.c
lib/libc/net/minix/getpeereid.c
lib/libc/sys-minix/getpeername.c
lib/libc/sys-minix/getsockname.c
lib/libc/sys-minix/recvfrom.c
lib/libc/sys-minix/socket.c
libexec/ftpd/ftpd.c
sys/netinet/Makefile
sys/netinet/in.h
sys/netinet/tcp.h
sys/netinet/udp.h
sys/netinet/udp_var.h
sys/sys/socket.h
test/test56.c

index 762bfd6f63ce2b8276f1997b08da0d0fdd3e1c9b..0a49e9ad02059ca51287ada8f2f6968139746e9a 100644 (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;
index 775256f8fb2818f8747823a15bc6a57d55feb118..7638c12ba3dad1714171a3b0f633177a214c84ac 100644 (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
index a537685efa358d7f315b9176ec140b633e1a9426..35097c57e2f9eea90ae83c7f0bcdc348b8dc964e 100644 (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))
index 84b55a845eb08d7a3c1844eb59ea92cf528df2dc..7eb06114c1053d94b6500a940e7383564976b7be 100644 (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))
index 0cc6633219da783167d3cba5610bb95a1ac03f84..5f5a19b9eb20afad0b402d17ab639b9117dbd5c3 100644 (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);
index cc00596a0c4e298e90ed7be6ccf40ab9e77b8ec3..9f18838478ddaa6561b75a1a56e98b2811e9bacc 100644 (file)
@@ -2,7 +2,7 @@
 #include "namespace.h"
 
 #ifdef __weak_alias
-__weak_alias(socket, _socket)
+__weak_alias(socket, __socket30)
 #endif
 
 #include <errno.h>
index 01792f004b8f69b203aed7a2e174019ea36f1c35..4d9f1ece53ed28ce2d69b692746ae4747e293db9 100644 (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>
index 8057410808407d5923ab0de5426fd509b059b75c..b8f61d8c131e825af3e5283c02b0ae93f392a05e 100644 (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>
index 8bbc394787dbb9e7376cf1da19a463a5b545af8f..d606ced4d5c341ec868d9383bdce4ce58283c663 100644 (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_ */
index 17a0540d3d05923271afd86e5008fb140e33177a..d987f2e2941d4a2855ee07c29d2fd7828fc5c847 100644 (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
 #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_ */
index ece7d0ed71e092632ebb5a12585cbeadc366ea6a..c8c10ecddcf1ed587cc08105dce87425306f0933 100644 (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 */
index b4e7fabade3162bbb78be540ab19d30e3cc9426e..49c1306772c59de019cead45df93a356042b17f0 100644 (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
index d5c3deb64c3cbad4a169924e3630f25622b5d74d..3acea3ae3681761d3c6318af4b466476dd506bc4 100644 (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_ */
index 88e0c49e7691b043d006cde16db4cc0ed8dc42e9..8fbf9488bb0f6f771b381d24e51d7d6aa0b0d55c 100644 (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;