Back to index

glibc  2.9
socket.h
Go to the documentation of this file.
00001 /* System-specific socket constants and types.  AIX version.
00002    Copyright (C) 1991,92,1994-1999,2000,2001 Free Software Foundation, Inc.
00003    This file is part of the GNU C Library.
00004 
00005    The GNU C Library is free software; you can redistribute it and/or
00006    modify it under the terms of the GNU Lesser General Public
00007    License as published by the Free Software Foundation; either
00008    version 2.1 of the License, or (at your option) any later version.
00009 
00010    The GNU C Library is distributed in the hope that it will be useful,
00011    but WITHOUT ANY WARRANTY; without even the implied warranty of
00012    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00013    Lesser General Public License for more details.
00014 
00015    You should have received a copy of the GNU Lesser General Public
00016    License along with the GNU C Library; if not, write to the Free
00017    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
00018    02111-1307 USA.  */
00019 
00020 #ifndef __BITS_SOCKET_H
00021 #define __BITS_SOCKET_H
00022 
00023 #if !defined _SYS_SOCKET_H && !defined _NETINET_IN_H
00024 # error "Never include <bits/socket.h> directly; use <sys/socket.h> instead."
00025 #endif
00026 
00027 #define       __need_size_t
00028 #define __need_NULL
00029 #include <stddef.h>
00030 
00031 #include <limits.h>
00032 #include <sys/types.h>
00033 
00034 /* Type for length arguments in socket calls.  */
00035 #ifndef __socklen_t_defined
00036 typedef __socklen_t socklen_t;
00037 # define __socklen_t_defined
00038 #endif
00039 
00040 /* Types of sockets.  */
00041 enum __socket_type
00042 {
00043   SOCK_STREAM = 1,          /* Sequenced, reliable, connection-based
00044                                byte streams.  */
00045 #define SOCK_STREAM SOCK_STREAM
00046   SOCK_DGRAM = 2,           /* Connectionless, unreliable datagrams
00047                                of fixed maximum length.  */
00048 #define SOCK_DGRAM SOCK_DGRAM
00049   SOCK_RAW = 3,                    /* Raw protocol interface.  */
00050 #define SOCK_RAW SOCK_RAW
00051   SOCK_RDM = 4,                    /* Reliably-delivered messages.  */
00052 #define SOCK_RDM SOCK_RDM
00053   SOCK_SEQPACKET = 5,              /* Sequenced, reliable, connection-based,
00054                                datagrams of fixed maximum length.  */
00055 #define SOCK_SEQPACKET SOCK_SEQPACKET
00056   SOCK_CONN_DGRAM = 6              /* Conneciton datagram.  */
00057 #define SOCK_CONN_DGRAM     SOCK_CONN_DGRAM
00058 };
00059 
00060 /* Protocol families.  */
00061 #define       PF_UNSPEC     0      /* Unspecified.  */
00062 #define       PF_LOCAL      1      /* Local to host (pipes and file-domain).  */
00063 #define       PF_UNIX              PF_LOCAL /* Old BSD name for PF_LOCAL.  */
00064 #define       PF_FILE              PF_LOCAL /* Another non-standard name for PF_LOCAL.  */
00065 #define       PF_INET              2      /* IP protocol family.  */
00066 #define PF_IMPLINK   3      /* ARPAnet IMP addresses.  */
00067 #define PF_PUP              4      /* PUP protocols (e.g., BSP).  */
00068 #define PF_CHAOS     5      /* MIT CHAOS protocols.  */
00069 #define PF_NS        6      /* XEROX NS protocols.  */
00070 #define PF_ISO              7      /* ISO protocols.  */
00071 #define PF_OSI              PF_ISO
00072 #define PF_ECMA             8      /* European Computer Manufacturers.  */
00073 #define PF_DATAKIT   9      /* Datakit protocols.  */
00074 #define PF_CCITT     10     /* CCITT protocols, X.25 etc. */
00075 #define PF_SNA              11     /* IBM SNA.  */
00076 #define PF_DECnet    12     /* DECnet.  */
00077 #define PF_DLI              13     /* DEC Direct data link interface.  */
00078 #define PF_LAT              14     /* LAT. */
00079 #define PF_HYLINK    15     /* NSC Hyperchannel.  */
00080 #define PF_APPLETALK 16     /* Apple Talk.  */
00081 #define PF_NETLINK   17     /* Internet Routing Protocol.  */
00082 #define       PF_ROUTE      PF_NETLINK /* Alias to emulate 4.4BSD.  */
00083 #define PF_LINK             18     /* Link layer interface.  */
00084 #define PF_XTP              19     /* eXpress Transfer Protocol (no AF).  */
00085 #define PF_INTF             20     /* Debugging use only.  */
00086 #define PF_RIF              21     /* Raw interface.  */
00087 #define PF_NETWARE   22
00088 #define PF_NDD              23
00089 #define PF_INET6     24     /* IPv6.  */
00090 #define PF_MAX              30     /* For now..  */
00091 
00092 /* Address families.  */
00093 #define AF_UNSPEC       PF_UNSPEC
00094 #define AF_LOCAL        PF_LOCAL
00095 #define AF_UNIX         PF_UNIX
00096 #define AF_FILE         PF_FILE
00097 #define AF_INET         PF_INET
00098 #define AF_IMPLINK      PF_IMPLINK
00099 #define AF_PUP          PF_PUP
00100 #define AF_CHAOS        PF_CHAOS
00101 #define AF_NS           PF_NS
00102 #define AF_ISO          PF_ISO
00103 #define AF_OSI          PF_OSI
00104 #define AF_ECMA         PF_ECMA
00105 #define AF_DATAKIT      PF_DATAKIT
00106 #define AF_CCITT        PF_CCITT
00107 #define AF_SNA          PF_SNA
00108 #define AF_DECnet       PF_DECnet
00109 #define AF_DLI          PF_DLI
00110 #define AF_LAT          PF_LAT
00111 #define AF_HYLINK       PF_HYLINK
00112 #define AF_APPLETALK    PF_APPLETALK
00113 #define AF_NETLINK      PF_NETLINK
00114 #define AF_ROUTE        PF_ROUTE
00115 #define AF_LINK         PF_LINK
00116 #define AF_INTF         PF_INTF
00117 #define AF_RIF          PF_RIF
00118 #define AF_NETWARE      PF_NETWARE
00119 #define AF_NDD          PF_NDD
00120 #define AF_INET6        PF_INET6
00121 #define AF_MAX          PF_MAX
00122 
00123 /* Socket level values.  Others are defined in the appropriate headers.
00124 
00125    XXX These definitions also should go into the appropriate headers as
00126    far as they are available.  */
00127 #define SOL_SOCKET   0xffff
00128 
00129 /* Maximum queue length specifiable by listen.  */
00130 #define SOMAXCONN    1024
00131 
00132 /* Get the definition of the macro to define the common sockaddr members.  */
00133 #include <bits/sockaddr.h>
00134 
00135 /* Structure describing a generic socket address.  */
00136 struct sockaddr
00137   {
00138     __SOCKADDR_COMMON (sa_);       /* Common data: address family and length.  */
00139     char sa_data[14];              /* Address data.  */
00140   };
00141 
00142 
00143 /* Structure large enough to hold any socket address (with the historical
00144    exception of AF_UNIX).  We reserve 128 bytes.  */
00145 #if ULONG_MAX > 0xffffffff
00146 # define __ss_aligntype     __uint64_t
00147 #else
00148 # define __ss_aligntype     __uint32_t
00149 #endif
00150 #define _SS_SIZE     128
00151 #define _SS_PADSIZE  (_SS_SIZE - (2 * sizeof (__ss_aligntype)))
00152 
00153 struct sockaddr_storage
00154   {
00155     __SOCKADDR_COMMON (ss_);       /* Address family, etc.  */
00156     __ss_aligntype __ss_align;     /* Force desired alignment.  */
00157     char __ss_padding[_SS_PADSIZE];
00158   };
00159 
00160 
00161 /* Bits in the FLAGS argument to `send', `recv', et al.  */
00162 enum
00163   {
00164     MSG_OOB          = 0x01,       /* Process out-of-band data.  */
00165 #define MSG_OOB             MSG_OOB
00166     MSG_PEEK         = 0x02,       /* Peek at incoming messages.  */
00167 #define MSG_PEEK     MSG_PEEK
00168     MSG_DONTROUTE    = 0x04,       /* Don't use local routing.  */
00169 #define MSG_DONTROUTE       MSG_DONTROUTE
00170     MSG_EOR          = 0x08, /* End of record.  */
00171 #define       MSG_EOR              MSG_EOR
00172     MSG_TRUNC        = 0x10,
00173 #define       MSG_TRUNC     MSG_TRUNC
00174     MSG_CTRUNC              = 0x20,       /* Control data lost before delivery.  */
00175 #define MSG_CTRUNC   MSG_CTRUNC
00176     MSG_WAITALL             = 0x40, /* Wait for a full request.  */
00177 #define       MSG_WAITALL   MSG_WAITALL
00178     MSG_MPEG2        = 0x80,       /* Message contain MPEG2 data.  */
00179 #define MSG_MPEG2    MSG_MPEG2
00180   };
00181 
00182 
00183 /* Structure describing messages sent by
00184    `sendmsg' and received by `recvmsg'.  */
00185 struct msghdr
00186   {
00187     void *msg_name;         /* Address to send to/receive from.  */
00188     socklen_t msg_namelen;  /* Length of address data.  */
00189 
00190     struct iovec *msg_iov;  /* Vector of data to send/receive into.  */
00191     int msg_iovlen;         /* Number of elements in the vector.  */
00192 
00193     void *msg_control;             /* Ancillary data (eg BSD filedesc passing). */
00194     socklen_t msg_controllen;      /* Ancillary data buffer length.  */
00195 
00196     int msg_flags;          /* Flags on received message.  */
00197   };
00198 
00199 /* Structure used for storage of ancillary data object information.  */
00200 struct cmsghdr
00201   {
00202     socklen_t cmsg_len;            /* Length of data in cmsg_data plus length
00203                                of cmsghdr structure.  */
00204     int cmsg_level;         /* Originating protocol.  */
00205     int cmsg_type;          /* Protocol specific type.  */
00206 #if (!defined __STRICT_ANSI__ && __GNUC__ >= 2) || __STDC_VERSION__ >= 199901L
00207     __extension__ unsigned char __cmsg_data __flexarr; /* Ancillary data.  */
00208 #endif
00209   };
00210 
00211 /* Ancillary data object manipulation macros.  */
00212 #if (!defined __STRICT_ANSI__ && __GNUC__ >= 2) || __STDC_VERSION__ >= 199901L
00213 # define CMSG_DATA(cmsg) ((cmsg)->__cmsg_data)
00214 #else
00215 # define CMSG_DATA(cmsg) ((unsigned char *) ((struct cmsghdr *) (cmsg) + 1))
00216 #endif
00217 #define CMSG_NXTHDR(mhdr, cmsg) __cmsg_nxthdr (mhdr, cmsg)
00218 #define CMSG_FIRSTHDR(mhdr) \
00219   ((size_t) (mhdr)->msg_controllen >= sizeof (struct cmsghdr)               \
00220    ? (struct cmsghdr *) (mhdr)->msg_control : (struct cmsghdr *) NULL)
00221 #define CMSG_ALIGN(len) (((len) + sizeof (size_t) - 1) \
00222                       & ~(sizeof (size_t) - 1))
00223 #define CMSG_SPACE(len) (CMSG_ALIGN (len) \
00224                       + CMSG_ALIGN (sizeof (struct cmsghdr)))
00225 #define CMSG_LEN(len)   (CMSG_ALIGN (sizeof (struct cmsghdr)) + (len))
00226 
00227 extern struct cmsghdr *__cmsg_nxthdr (struct msghdr *__mhdr,
00228                                   struct cmsghdr *__cmsg) __THROW;
00229 #ifdef __USE_EXTERN_INLINES
00230 # ifndef _EXTERN_INLINE
00231 #  define _EXTERN_INLINE extern __inline
00232 # endif
00233 _EXTERN_INLINE struct cmsghdr *
00234 __cmsg_nxthdr (struct msghdr *__mhdr, struct cmsghdr *__cmsg) __THROW
00235 {
00236   if ((size_t) __cmsg->cmsg_len < sizeof (struct cmsghdr))
00237     /* The kernel header does this so there may be a reason.  */
00238     return 0;
00239 
00240   __cmsg = (struct cmsghdr *) ((unsigned char *) __cmsg
00241                             + CMSG_ALIGN (__cmsg->cmsg_len));
00242   if ((unsigned char *) (__cmsg + 1) >= ((unsigned char *) __mhdr->msg_control
00243                                     + __mhdr->msg_controllen)
00244       || ((unsigned char *) __cmsg + CMSG_ALIGN (__cmsg->cmsg_len)
00245          > ((unsigned char *) __mhdr->msg_control + __mhdr->msg_controllen)))
00246     /* No more entries.  */
00247     return 0;
00248   return __cmsg;
00249 }
00250 #endif /* Use `extern inline'.  */
00251 
00252 /* Socket level message types.  This must match the definitions in
00253    <linux/socket.h>.  */
00254 enum
00255   {
00256     SCM_RIGHTS = 0x01              /* Transfer file descriptors.  */
00257 #define SCM_RIGHTS SCM_RIGHTS
00258   };
00259 
00260 /* Options flags per socket.  */
00261 #define SO_DEBUG     0x0001 /* Turn on debugging info recording.  */
00262 #define SO_ACCEPTCONN       0x0002 /* Socket has had listen().  */
00263 #define SO_REUSEADDR 0x0004 /* Allow local address reuse.  */
00264 #define SO_KEEPALIVE 0x0008 /* Keep connections alive.  */
00265 #define SO_DONTROUTE 0x0010 /* Just use interface addresses.  */
00266 #define SO_BROADCAST 0x0020 /* Permit sending of broadcast msgs.  */
00267 #define SO_USELOOPBACK      0x0040 /* Bypass hardware when possible.  */
00268 #define SO_LINGER    0x0080 /* Linger on close if data present.  */
00269 #define SO_OOBINLINE 0x0100 /* Leave received OOB data in line.  */
00270 #define SO_REUSEPORT 0x0200 /* Allow local address & port reuse.  */
00271 #define SO_USE_IFBUFS       0x0400 /* Interface will supply buffers.  */
00272 #define SO_CKSUMRECV 0x0800 /* Defer checksum until receive.  */
00273 #define SO_NOREUSEADDR      0x1000 /* Prevent local address reuse.  */
00274 #define SO_SNDBUF    0x1001 /* Send buffer size.  */
00275 #define SO_RCVBUF    0x1002 /* Receive buffer size.  */
00276 #define SO_SNDLOWAT  0x1003 /* Send low-water mark.  */
00277 #define SO_RCVLOWAT  0x1004 /* Receive low-water mark.  */
00278 #define SO_SNDTIMEO  0x1005 /* Send timeout.  */
00279 #define SO_RCVTIMEO  0x1006 /* Receive timeout.  */
00280 #define SO_ERROR     0x1007 /* Get error status and clear.  */
00281 #define SO_TYPE             0x1008 /* Get socket type.  */
00282 #define SO_KERNACCEPT       0x2000 /* Derive a in-kernel only socket.  */
00283 #define SO_AUDIT     0x8000 /* Turn on socket auditing.  */
00284 
00285 
00286 /* Structure used to manipulate the SO_LINGER option.  */
00287 struct linger
00288   {
00289     int l_onoff;            /* Nonzero to linger on close.  */
00290     int l_linger;           /* Time to linger.  */
00291   };
00292 
00293 #endif /* bits/socket.h */