glibc (2.38)

(root)/
include/
bits/
socket.h
       1  /* System-specific socket constants and types.  Linux version.
       2     Copyright (C) 1991-2023 Free Software Foundation, Inc.
       3     This file is part of the GNU C Library.
       4  
       5     The GNU C Library is free software; you can redistribute it and/or
       6     modify it under the terms of the GNU Lesser General Public
       7     License as published by the Free Software Foundation; either
       8     version 2.1 of the License, or (at your option) any later version.
       9  
      10     The GNU C Library is distributed in the hope that it will be useful,
      11     but WITHOUT ANY WARRANTY; without even the implied warranty of
      12     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
      13     Lesser General Public License for more details.
      14  
      15     You should have received a copy of the GNU Lesser General Public
      16     License along with the GNU C Library; if not, see
      17     <https://www.gnu.org/licenses/>.  */
      18  
      19  #ifndef __BITS_SOCKET_H
      20  #define __BITS_SOCKET_H
      21  
      22  #ifndef _SYS_SOCKET_H
      23  # error "Never include <bits/socket.h> directly; use <sys/socket.h> instead."
      24  #endif
      25  
      26  #define __need_size_t
      27  #include <stddef.h>
      28  
      29  #include <sys/types.h>
      30  
      31  /* Type for length arguments in socket calls.  */
      32  #ifndef __socklen_t_defined
      33  typedef __socklen_t socklen_t;
      34  # define __socklen_t_defined
      35  #endif
      36  
      37  /* Get the architecture-dependent definition of enum __socket_type.  */
      38  #include <bits/socket_type.h>
      39  
      40  /* Protocol families.  */
      41  #define PF_UNSPEC	0	/* Unspecified.  */
      42  #define PF_LOCAL	1	/* Local to host (pipes and file-domain).  */
      43  #define PF_UNIX		PF_LOCAL /* POSIX name for PF_LOCAL.  */
      44  #define PF_FILE		PF_LOCAL /* Another non-standard name for PF_LOCAL.  */
      45  #define PF_INET		2	/* IP protocol family.  */
      46  #define PF_AX25		3	/* Amateur Radio AX.25.  */
      47  #define PF_IPX		4	/* Novell Internet Protocol.  */
      48  #define PF_APPLETALK	5	/* Appletalk DDP.  */
      49  #define PF_NETROM	6	/* Amateur radio NetROM.  */
      50  #define PF_BRIDGE	7	/* Multiprotocol bridge.  */
      51  #define PF_ATMPVC	8	/* ATM PVCs.  */
      52  #define PF_X25		9	/* Reserved for X.25 project.  */
      53  #define PF_INET6	10	/* IP version 6.  */
      54  #define PF_ROSE		11	/* Amateur Radio X.25 PLP.  */
      55  #define PF_DECnet	12	/* Reserved for DECnet project.  */
      56  #define PF_NETBEUI	13	/* Reserved for 802.2LLC project.  */
      57  #define PF_SECURITY	14	/* Security callback pseudo AF.  */
      58  #define PF_KEY		15	/* PF_KEY key management API.  */
      59  #define PF_NETLINK	16
      60  #define PF_ROUTE	PF_NETLINK /* Alias to emulate 4.4BSD.  */
      61  #define PF_PACKET	17	/* Packet family.  */
      62  #define PF_ASH		18	/* Ash.  */
      63  #define PF_ECONET	19	/* Acorn Econet.  */
      64  #define PF_ATMSVC	20	/* ATM SVCs.  */
      65  #define PF_RDS		21	/* RDS sockets.  */
      66  #define PF_SNA		22	/* Linux SNA Project */
      67  #define PF_IRDA		23	/* IRDA sockets.  */
      68  #define PF_PPPOX	24	/* PPPoX sockets.  */
      69  #define PF_WANPIPE	25	/* Wanpipe API sockets.  */
      70  #define PF_LLC		26	/* Linux LLC.  */
      71  #define PF_IB		27	/* Native InfiniBand address.  */
      72  #define PF_MPLS		28	/* MPLS.  */
      73  #define PF_CAN		29	/* Controller Area Network.  */
      74  #define PF_TIPC		30	/* TIPC sockets.  */
      75  #define PF_BLUETOOTH	31	/* Bluetooth sockets.  */
      76  #define PF_IUCV		32	/* IUCV sockets.  */
      77  #define PF_RXRPC	33	/* RxRPC sockets.  */
      78  #define PF_ISDN		34	/* mISDN sockets.  */
      79  #define PF_PHONET	35	/* Phonet sockets.  */
      80  #define PF_IEEE802154	36	/* IEEE 802.15.4 sockets.  */
      81  #define PF_CAIF		37	/* CAIF sockets.  */
      82  #define PF_ALG		38	/* Algorithm sockets.  */
      83  #define PF_NFC		39	/* NFC sockets.  */
      84  #define PF_VSOCK	40	/* vSockets.  */
      85  #define PF_KCM		41	/* Kernel Connection Multiplexor.  */
      86  #define PF_QIPCRTR	42	/* Qualcomm IPC Router.  */
      87  #define PF_SMC		43	/* SMC sockets.  */
      88  #define PF_XDP		44	/* XDP sockets.  */
      89  #define PF_MCTP		45	/* Management component transport protocol.  */
      90  #define PF_MAX		46	/* For now..  */
      91  
      92  /* Address families.  */
      93  #define AF_UNSPEC	PF_UNSPEC
      94  #define AF_LOCAL	PF_LOCAL
      95  #define AF_UNIX		PF_UNIX
      96  #define AF_FILE		PF_FILE
      97  #define AF_INET		PF_INET
      98  #define AF_AX25		PF_AX25
      99  #define AF_IPX		PF_IPX
     100  #define AF_APPLETALK	PF_APPLETALK
     101  #define AF_NETROM	PF_NETROM
     102  #define AF_BRIDGE	PF_BRIDGE
     103  #define AF_ATMPVC	PF_ATMPVC
     104  #define AF_X25		PF_X25
     105  #define AF_INET6	PF_INET6
     106  #define AF_ROSE		PF_ROSE
     107  #define AF_DECnet	PF_DECnet
     108  #define AF_NETBEUI	PF_NETBEUI
     109  #define AF_SECURITY	PF_SECURITY
     110  #define AF_KEY		PF_KEY
     111  #define AF_NETLINK	PF_NETLINK
     112  #define AF_ROUTE	PF_ROUTE
     113  #define AF_PACKET	PF_PACKET
     114  #define AF_ASH		PF_ASH
     115  #define AF_ECONET	PF_ECONET
     116  #define AF_ATMSVC	PF_ATMSVC
     117  #define AF_RDS		PF_RDS
     118  #define AF_SNA		PF_SNA
     119  #define AF_IRDA		PF_IRDA
     120  #define AF_PPPOX	PF_PPPOX
     121  #define AF_WANPIPE	PF_WANPIPE
     122  #define AF_LLC		PF_LLC
     123  #define AF_IB		PF_IB
     124  #define AF_MPLS		PF_MPLS
     125  #define AF_CAN		PF_CAN
     126  #define AF_TIPC		PF_TIPC
     127  #define AF_BLUETOOTH	PF_BLUETOOTH
     128  #define AF_IUCV		PF_IUCV
     129  #define AF_RXRPC	PF_RXRPC
     130  #define AF_ISDN		PF_ISDN
     131  #define AF_PHONET	PF_PHONET
     132  #define AF_IEEE802154	PF_IEEE802154
     133  #define AF_CAIF		PF_CAIF
     134  #define AF_ALG		PF_ALG
     135  #define AF_NFC		PF_NFC
     136  #define AF_VSOCK	PF_VSOCK
     137  #define AF_KCM		PF_KCM
     138  #define AF_QIPCRTR	PF_QIPCRTR
     139  #define AF_SMC		PF_SMC
     140  #define AF_XDP		PF_XDP
     141  #define AF_MCTP		PF_MCTP
     142  #define AF_MAX		PF_MAX
     143  
     144  /* Socket level values.  Others are defined in the appropriate headers.
     145  
     146     XXX These definitions also should go into the appropriate headers as
     147     far as they are available.  */
     148  #define SOL_RAW		255
     149  #define SOL_DECNET      261
     150  #define SOL_X25         262
     151  #define SOL_PACKET	263
     152  #define SOL_ATM		264	/* ATM layer (cell level).  */
     153  #define SOL_AAL		265	/* ATM Adaption Layer (packet level).  */
     154  #define SOL_IRDA	266
     155  #define SOL_NETBEUI	267
     156  #define SOL_LLC		268
     157  #define SOL_DCCP	269
     158  #define SOL_NETLINK	270
     159  #define SOL_TIPC	271
     160  #define SOL_RXRPC	272
     161  #define SOL_PPPOL2TP	273
     162  #define SOL_BLUETOOTH	274
     163  #define SOL_PNPIPE	275
     164  #define SOL_RDS		276
     165  #define SOL_IUCV	277
     166  #define SOL_CAIF	278
     167  #define SOL_ALG		279
     168  #define SOL_NFC		280
     169  #define SOL_KCM		281
     170  #define SOL_TLS		282
     171  #define SOL_XDP		283
     172  #define SOL_MPTCP	284
     173  #define SOL_MCTP	285
     174  #define SOL_SMC		286
     175  
     176  /* Maximum queue length specifiable by listen.  */
     177  #define SOMAXCONN	4096
     178  
     179  /* Get the definition of the macro to define the common sockaddr members.  */
     180  #include <bits/sockaddr.h>
     181  
     182  /* Structure describing a generic socket address.  */
     183  struct sockaddr
     184    {
     185      __SOCKADDR_COMMON (sa_);	/* Common data: address family and length.  */
     186      char sa_data[14];		/* Address data.  */
     187    };
     188  
     189  
     190  /* Structure large enough to hold any socket address (with the historical
     191     exception of AF_UNIX).  */
     192  #define __ss_aligntype	unsigned long int
     193  #define _SS_PADSIZE \
     194    (_SS_SIZE - __SOCKADDR_COMMON_SIZE - sizeof (__ss_aligntype))
     195  
     196  struct sockaddr_storage
     197    {
     198      __SOCKADDR_COMMON (ss_);	/* Address family, etc.  */
     199      char __ss_padding[_SS_PADSIZE];
     200      __ss_aligntype __ss_align;	/* Force desired alignment.  */
     201    };
     202  
     203  
     204  /* Bits in the FLAGS argument to `send', `recv', et al.  */
     205  enum
     206    {
     207      MSG_OOB		= 0x01,	/* Process out-of-band data.  */
     208  #define MSG_OOB		MSG_OOB
     209      MSG_PEEK		= 0x02,	/* Peek at incoming messages.  */
     210  #define MSG_PEEK	MSG_PEEK
     211      MSG_DONTROUTE	= 0x04,	/* Don't use local routing.  */
     212  #define MSG_DONTROUTE	MSG_DONTROUTE
     213  #ifdef __USE_GNU
     214      /* DECnet uses a different name.  */
     215      MSG_TRYHARD		= MSG_DONTROUTE,
     216  # define MSG_TRYHARD	MSG_DONTROUTE
     217  #endif
     218      MSG_CTRUNC		= 0x08,	/* Control data lost before delivery.  */
     219  #define MSG_CTRUNC	MSG_CTRUNC
     220      MSG_PROXY		= 0x10,	/* Supply or ask second address.  */
     221  #define MSG_PROXY	MSG_PROXY
     222      MSG_TRUNC		= 0x20,
     223  #define MSG_TRUNC	MSG_TRUNC
     224      MSG_DONTWAIT	= 0x40, /* Nonblocking IO.  */
     225  #define MSG_DONTWAIT	MSG_DONTWAIT
     226      MSG_EOR		= 0x80, /* End of record.  */
     227  #define MSG_EOR		MSG_EOR
     228      MSG_WAITALL		= 0x100, /* Wait for a full request.  */
     229  #define MSG_WAITALL	MSG_WAITALL
     230      MSG_FIN		= 0x200,
     231  #define MSG_FIN		MSG_FIN
     232      MSG_SYN		= 0x400,
     233  #define MSG_SYN		MSG_SYN
     234      MSG_CONFIRM		= 0x800, /* Confirm path validity.  */
     235  #define MSG_CONFIRM	MSG_CONFIRM
     236      MSG_RST		= 0x1000,
     237  #define MSG_RST		MSG_RST
     238      MSG_ERRQUEUE	= 0x2000, /* Fetch message from error queue.  */
     239  #define MSG_ERRQUEUE	MSG_ERRQUEUE
     240      MSG_NOSIGNAL	= 0x4000, /* Do not generate SIGPIPE.  */
     241  #define MSG_NOSIGNAL	MSG_NOSIGNAL
     242      MSG_MORE		= 0x8000,  /* Sender will send more.  */
     243  #define MSG_MORE	MSG_MORE
     244      MSG_WAITFORONE	= 0x10000, /* Wait for at least one packet to return.*/
     245  #define MSG_WAITFORONE	MSG_WAITFORONE
     246      MSG_BATCH		= 0x40000, /* sendmmsg: more messages coming.  */
     247  #define MSG_BATCH	MSG_BATCH
     248      MSG_ZEROCOPY	= 0x4000000, /* Use user data in kernel path.  */
     249  #define MSG_ZEROCOPY	MSG_ZEROCOPY
     250      MSG_FASTOPEN	= 0x20000000, /* Send data in TCP SYN.  */
     251  #define MSG_FASTOPEN	MSG_FASTOPEN
     252  
     253      MSG_CMSG_CLOEXEC	= 0x40000000	/* Set close_on_exit for file
     254  					   descriptor received through
     255  					   SCM_RIGHTS.  */
     256  #define MSG_CMSG_CLOEXEC MSG_CMSG_CLOEXEC
     257    };
     258  
     259  
     260  /* Structure describing messages sent by
     261     `sendmsg' and received by `recvmsg'.  */
     262  struct msghdr
     263    {
     264      void *msg_name;		/* Address to send to/receive from.  */
     265      socklen_t msg_namelen;	/* Length of address data.  */
     266  
     267      struct iovec *msg_iov;	/* Vector of data to send/receive into.  */
     268      size_t msg_iovlen;		/* Number of elements in the vector.  */
     269  
     270      void *msg_control;		/* Ancillary data (eg BSD filedesc passing). */
     271      size_t msg_controllen;	/* Ancillary data buffer length.
     272  				   !! The type should be socklen_t but the
     273  				   definition of the kernel is incompatible
     274  				   with this.  */
     275  
     276      int msg_flags;		/* Flags on received message.  */
     277    };
     278  
     279  /* Structure used for storage of ancillary data object information.  */
     280  struct cmsghdr
     281    {
     282      size_t cmsg_len;		/* Length of data in cmsg_data plus length
     283  				   of cmsghdr structure.
     284  				   !! The type should be socklen_t but the
     285  				   definition of the kernel is incompatible
     286  				   with this.  */
     287      int cmsg_level;		/* Originating protocol.  */
     288      int cmsg_type;		/* Protocol specific type.  */
     289  #if __glibc_c99_flexarr_available
     290      __extension__ unsigned char __cmsg_data __flexarr; /* Ancillary data.  */
     291  #endif
     292    };
     293  
     294  /* Ancillary data object manipulation macros.  */
     295  #if __glibc_c99_flexarr_available
     296  # define CMSG_DATA(cmsg) ((cmsg)->__cmsg_data)
     297  #else
     298  # define CMSG_DATA(cmsg) ((unsigned char *) ((struct cmsghdr *) (cmsg) + 1))
     299  #endif
     300  #define CMSG_NXTHDR(mhdr, cmsg) __cmsg_nxthdr (mhdr, cmsg)
     301  #define CMSG_FIRSTHDR(mhdr) \
     302    ((size_t) (mhdr)->msg_controllen >= sizeof (struct cmsghdr)		      \
     303     ? (struct cmsghdr *) (mhdr)->msg_control : (struct cmsghdr *) 0)
     304  #define CMSG_ALIGN(len) (((len) + sizeof (size_t) - 1) \
     305  			 & (size_t) ~(sizeof (size_t) - 1))
     306  #define CMSG_SPACE(len) (CMSG_ALIGN (len) \
     307  			 + CMSG_ALIGN (sizeof (struct cmsghdr)))
     308  #define CMSG_LEN(len)   (CMSG_ALIGN (sizeof (struct cmsghdr)) + (len))
     309  
     310  /* Given a length, return the additional padding necessary such that
     311     len + __CMSG_PADDING(len) == CMSG_ALIGN (len).  */
     312  #define __CMSG_PADDING(len) ((sizeof (size_t) \
     313                                - ((len) & (sizeof (size_t) - 1))) \
     314                               & (sizeof (size_t) - 1))
     315  
     316  extern struct cmsghdr *__cmsg_nxthdr (struct msghdr *__mhdr,
     317  				      struct cmsghdr *__cmsg) __THROW;
     318  #ifdef __USE_EXTERN_INLINES
     319  # ifndef _EXTERN_INLINE
     320  #  define _EXTERN_INLINE __extern_inline
     321  # endif
     322  _EXTERN_INLINE struct cmsghdr *
     323  __NTH (__cmsg_nxthdr (struct msghdr *__mhdr, struct cmsghdr *__cmsg))
     324  {
     325    /* We may safely assume that __cmsg lies between __mhdr->msg_control and
     326       __mhdr->msg_controllen because the user is required to obtain the first
     327       cmsg via CMSG_FIRSTHDR, set its length, then obtain subsequent cmsgs
     328       via CMSG_NXTHDR, setting lengths along the way.  However, we don't yet
     329       trust the value of __cmsg->cmsg_len and therefore do not use it in any
     330       pointer arithmetic until we check its value.  */
     331  
     332    unsigned char * __msg_control_ptr = (unsigned char *) __mhdr->msg_control;
     333    unsigned char * __cmsg_ptr = (unsigned char *) __cmsg;
     334  
     335    size_t __size_needed = sizeof (struct cmsghdr)
     336                           + __CMSG_PADDING (__cmsg->cmsg_len);
     337  
     338    /* The current header is malformed, too small to be a full header.  */
     339    if ((size_t) __cmsg->cmsg_len < sizeof (struct cmsghdr))
     340      return (struct cmsghdr *) 0;
     341  
     342    /* There isn't enough space between __cmsg and the end of the buffer to
     343    hold the current cmsg *and* the next one.  */
     344    if (((size_t)
     345           (__msg_control_ptr + __mhdr->msg_controllen - __cmsg_ptr)
     346         < __size_needed)
     347        || ((size_t)
     348              (__msg_control_ptr + __mhdr->msg_controllen - __cmsg_ptr
     349               - __size_needed)
     350            < __cmsg->cmsg_len))
     351  
     352      return (struct cmsghdr *) 0;
     353  
     354    /* Now, we trust cmsg_len and can use it to find the next header.  */
     355    __cmsg = (struct cmsghdr *) ((unsigned char *) __cmsg
     356  			       + CMSG_ALIGN (__cmsg->cmsg_len));
     357    return __cmsg;
     358  }
     359  #endif	/* Use `extern inline'.  */
     360  
     361  /* Socket level message types.  This must match the definitions in
     362     <linux/socket.h>.  */
     363  enum
     364    {
     365      SCM_RIGHTS = 0x01		/* Transfer file descriptors.  */
     366  #define SCM_RIGHTS SCM_RIGHTS
     367  #ifdef __USE_GNU
     368      , SCM_CREDENTIALS = 0x02	/* Credentials passing.  */
     369  # define SCM_CREDENTIALS SCM_CREDENTIALS
     370  #endif
     371    };
     372  
     373  #ifdef __USE_GNU
     374  /* User visible structure for SCM_CREDENTIALS message */
     375  struct ucred
     376  {
     377    pid_t pid;			/* PID of sending process.  */
     378    uid_t uid;			/* UID of sending process.  */
     379    gid_t gid;			/* GID of sending process.  */
     380  };
     381  #endif
     382  
     383  #ifdef __USE_MISC
     384  # include <bits/types/time_t.h>
     385  # include <asm/socket.h>
     386  #else
     387  # define SO_DEBUG 1
     388  # include <bits/socket-constants.h>
     389  #endif
     390  
     391  /* Structure used to manipulate the SO_LINGER option.  */
     392  struct linger
     393    {
     394      int l_onoff;		/* Nonzero to linger on close.  */
     395      int l_linger;		/* Time to linger.  */
     396    };
     397  
     398  #endif	/* bits/socket.h */