Chapter 6


D.1 unp.h Header

Almost every program in the text includes our unp.h header, shown in Figure D.1. This header includes all the standard system headers that most network programs need, along with some general system headers. It also defines constants such as MAXLINE , ANSI C function prototypes for the functions we define in the text (e.g., readline ), and all the wrapper functions we use. We do not show these prototypes.

Figure D.1 Our header unp.h .

lib/unp.h

 1 /* Our own header. Tabs are set for 4 spaces, not 8 */     2 #ifndef __unp_h   3 #define __unp_h   4 #include    "../config.h"      /* configuration options for current OS */   5                            /* "../config.h" is generated by configure */   6 /* If anything changes in the following list of #includes, must change   7    acsite.m4 also, for configure's tests. */   8 #include    <sys/types.h>       /* basic system data types */   9 #include    <sys/socket.h>      /* basic socket definitions */  10 #include    <sys/time.h>        /* timeval{} for select() */  11 #include    <time.h>            /* timespec{} for pselect() */  12 #include    <netinet/in.h>      /* sockaddr_in{} and other Internet defns */  13 #include    <arpa/inet.h>       /* inet(3) functions */  14 #include    <errno.h>  15 #include    <fcntl.h>           /* for nonblocking */  16 #include    <netdb.h>  17 #include    <signal.h>  18 #include    <stdio.h>  19 #include    <stdlib.h>  20 #include    <string.h>  21 #include    <sys/stat.h>        /* for S_xxx file mode constants */  22 #include    <sys/uio.h>         /* for iovec{} and readv/writev */  23 #include    <unistd.h>  24 #include    <sys/wait.h>  25 #include    <sys/un.h>          /* for Unix domain sockets */  26 #ifdef  HAVE_SYS_SELECT_H  27 # include   <sys/select.h>      /* for convenience */  28 #endif  29 #ifdef  HAVE_SYS_SYSCTL_H  30 # include   <sys/sysctl.h>  31 #endif  32 #ifdef  HAVE_POLL_H  33 # include  <poll.h>             /* for convenience */  34 #endif  35 #ifdef  HAVE_SYS_EVENT_H  36 # include   <sys/event.h>       /* for kqueue */  37 #endif  38 #ifdef  HAVE_STRINGS_H  39 # include   <strings.h>         /* for convenience */  40 #endif  41 /* Three headers are normally needed for socket/file ioctl's:  42  * <sys/ioctl.h>, <sys/filio.h>, and <sys/sockio.h>.  43  */  44 #ifdef  HAVE_SYS_IOCTL_H  45 # include   <sys/ioctl.h>  46 #endif  47 #ifdef  HAVE_SYS_FILIO_H  48 # include   <sys/filio.h>  49 #endif  50 #ifdef  HAVE_SYS_SOCKIO_H  51 # include   <sys/sockio.h>  52 #endif  53 #ifdef  HAVE_PTHREAD_H  54 # include   <pthread.h>  55 #endif  56 #ifdef  HAVE_NET_IF_DL_H  57 # include    <net/if_dl.h>  58 #endif  59 #ifdef  HAVE_NETINET_SCTP_H  60 #include     <netinet/sctp.h>  61 #endif  62 /* OSF/1 actually disables recv() and send() in <sys/socket.h> */  63 #ifdef  __osf__  64 #undef  recv  65 #undef  send  66 #define recv(a,b,c,d)   recvfrom(a,b,c,d,0,0)  67 #define send(a,b,c,d)   sendto(a,b,c,d,0,0)  68 #endif  69 #ifndef INADDR_NONE  70 #define INADDR_NONE 0xffffffff  /* should have been in <netinet/in.h> */  71 #endif  72 #ifndef SHUT_RD                 /* these three POSIX names are new */  73 #define SHUT_RD     0           /* shutdown for reading */  74 #define SHUT_WR     1           /* shutdown for writing */  75 #define SHUT_RDWR   2           /* shutdown for reading and writing */  76 #endif  77 #ifndef INET_ADDRSTRLEN  78 #define INET_ADDRSTRLEN     16  /* "ddd.ddd.ddd.ddd 
 1 /* Our own header. Tabs are set for 4 spaces, not 8 */ 2 # ifndef __unp_h 3 #define __unp_h 4 #include "../config.h" /* configuration options for current OS */ 5 /* "../config.h" is generated by configure */ 6 /* If anything changes in the following list of #includes, must change 7 acsite.m4 also, for configure's tests. */ 8 #include <sys/types.h> /* basic system data types */ 9 #include <sys/socket.h> /* basic socket definitions */ 10 #include <sys/time.h> /* timeval{} for select() */ 11 #include <time.h> /* timespec{} for pselect () */ 12 #include <netinet/in.h> /* sockaddr_in{} and other Internet defns */ 13 #include <arpa/inet.h> /* inet(3) functions */ 14 #include <errno.h> 15 #include <fcntl.h> /* for nonblocking */ 16 #include <netdb.h> 17 #include <signal.h> 18 #include <stdio.h> 19 #include <stdlib.h> 20 #include <string.h> 21 #include <sys/stat.h> /* for S_xxx file mode constants */ 22 #include <sys/uio.h> /* for iovec{} and readv/ writev */ 23 #include <unistd.h> 24 #include <sys/wait.h> 25 #include <sys/un.h> /* for Unix domain sockets */ 26 #ifdef HAVE_SYS_SELECT_H 27 # include <sys/select.h> /* for convenience */ 28 #endif 29 #ifdef HAVE_SYS_SYSCTL_H 30 # include <sys/sysctl.h> 31 #endif 32 #ifdef HAVE_POLL_H 33 # include <poll.h> /* for convenience */ 34 #endif 35 #ifdef HAVE_SYS_EVENT_H 36 # include <sys/event.h> /* for kqueue */ 37 #endif 38 #ifdef HAVE_STRINGS_H 39 # include <strings.h> /* for convenience */ 40 #endif 41 /* Three headers are normally needed for socket/file ioctl's: 42 * <sys/ioctl.h>, <sys/filio.h>, and <sys/sockio.h>. 43 */ 44 #ifdef HAVE_SYS_IOCTL_H 45 # include <sys/ioctl.h> 46 #endif 47 #ifdef HAVE_SYS_FILIO_H 48 # include <sys/filio.h> 49 #endif 50 #ifdef HAVE_SYS_SOCKIO_H 51 # include <sys/sockio.h> 52 #endif 53 #ifdef HAVE_PTHREAD_H 54 # include <pthread.h> 55 #endif 56 #ifdef HAVE_NET_IF_DL_H 57 # include <net/if_dl.h> 58 #endif 59 #ifdef HAVE_NETINET_SCTP_H 60 #include <netinet/sctp.h> 61 #endif 62 /* OSF/1 actually disables recv() and send() in <sys/socket.h> */ 63 #ifdef __osf__ 64 #undef recv 65 #undef send 66 #define recv(a,b,c,d) recvfrom(a,b,c,d,0,0) 67 #define send(a,b,c,d) sendto (a,b,c,d,0,0) 68 #endif 69 #ifndef INADDR_NONE 70 #define INADDR_NONE 0xffffffff /* should have been in <netinet/in.h> */ 71 #endif 72 #ifndef SHUT_RD /* these three POSIX names are new */ 73 #define SHUT_RD 0 /* shutdown for reading */ 74 #define SHUT_WR 1 /* shutdown for writing */ 75 #define SHUT_RDWR 2 /* shutdown for reading and writing */ 76 #endif 77 #ifndef INET_ADDRSTRLEN 78 #define INET_ADDRSTRLEN 16 /* "ddd.ddd.ddd.ddd\0" 79 1234567890123456 */ 80 #endif 81 /* Define following even if IPv6 not supported, so we can always allocate 82 an adequately sized buffer without #ifdefs in the code. */ 83 #ifndef INET6_ADDRSTRLEN 84 #define INET6_ADDRSTRLEN 46 /* max size of IPv6 address string: 85 "xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx" or 86 "xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:ddd.ddd.ddd.ddd\0" 87 1234567890123456789012345678901234567890123456 */ 88 #endif 89 /* Define bzero() as a macro if it's not in standard C library. */ 90 #ifndef HAVE_BZERO 91 #define bzero(ptr,n) memset (ptr, 0, n) 92 #endif 93 /* Older resolvers do not have gethostbyname2() */ 94 #ifndef HAVE_GETHOSTBYNAME2 95 #define gethostbyname2(host,family) gethostbyname((host)) 96 #endif 97 /* The structure returned by recvfrom_flags() */ 98 struct unp_in_pktinfo { 99 struct in_addr ipi_addr; /* dst IPv4 address */ 100 int ipi_ifindex; /* received interface index */ 101 }; 102 /* We need the newer CMSG_LEN() and CMSG_SPACE() macros, but few 103 implementations support them today. These two macros really need 104 an ALIGN() macro, but each implementation does this differently. */ 105 #ifndef CMSG_LEN 106 #define CMSG_LEN(size) (sizeof(struct cmsghdr) + (size)) 107 #endif 108 #ifndef CMSG_SPACE 109 #define CMSG_SPACE(size) (sizeof(struct cmsghdr) + (size)) 110 #endif 111 /* POSIX requires the SUN_LEN() macro, but not all implementations define 112 it (yet). Note that this 4.4BSD macro works regardless whether there is 113 a length field or not. */ 114 #ifndef SUN_LEN 115 # define SUN_LEN (su) \ 116 (sizeof (*(su)) - sizeof ((su)->sun_path) + strlen((su)->sun_path)) 117 #endif 118 /* POSIX renames "Unix domain" as "local IPC." 119 Not all systems define AF_LOCAL and PF_LOCAL (yet). */ 120 #ifndef AF_LOCAL 121 #define AF_LOCAL AF_UNIX 122 #endif 123 #ifndef PF_LOCAL 124 #define PF_LOCAL PF_UNIX 125 #endif 126 /* POSIX requires that an #include of <poll.h> define INFTIM, but many 127 systems still define it in <sys/stropts.h>. We don't want to include 128 all the STREAMS stuff if it's not needed, so we just define INFTIM here. 129 This is the standard value, but there's no guarantee it is -1. */ 130 #ifndef INFTIM 131 #define INFTIM (-1) /* infinite poll timeout */ 132 #ifdef HAVE_POLL_H 133 #define INFTIM_UNPH /* tell unpxti.h we defined it */ 134 #endif 135 #endif 136 /* Following could be derived from SOMAXCONN in <sys/socket.h>, but many 137 kernels still #define it as 5, while actually supporting many more */ 138 #define LISTENQ 1024 /* 2nd argument to listen () */ 139 /* Miscellaneous constants */ 140 #define MAXLINE 4096 /* max text line length */ 141 #define BUFFSIZE 8192 /* buffer size for reads and writes */ 142 /* Define some port number that can be used for our examples */ 143 #define SERV_PORT 9877 /* TCP and UDP */ 144 #define SERV_PORT_STR "9877" /* TCP and UDP */ 145 #define UNIXSTR_PATH "/tmp/unix.str" /* Unix domain stream */ 146 #define UNIXDG_PATH "/tmp/unix.dg" /* Unix domain datagram */ 147 /* Following shortens all the typecasts of pointer arguments: */ 148 #define SA struct sockaddr 149 #define HAVE_STRUCT_SOCKADDR_STORAGE 150 #ifndef HAVE_STRUCT_SOCKADDR_STORAGE 151 /* 152 * RFC 3493: protocol-independent placeholder for socket addresses 153 */ 154 #define __SS_MAXSIZE 128 155 #define __SS_ALIGNSIZE (sizeof(int64_t)) 156 #ifdef HAVE_SOCKADDR_SA_LEN 157 #define __SS_PAD1SIZE (__SS_ALIGNSIZE - sizeof(u_char) - sizeof(sa_family_t)) 158 #else 159 #define __SS_PAD1SIZE (__SS_ALIGNSIZE - sizeof(sa_family_t)) 160 #endif 161 #define __SS_PAD2SIZE (__SS_MAXSIZE - 2*__SS_ALIGNSIZE) 162 struct sockaddr_storage { 163 #ifdef HAVE_SOCKADDR_SA_LEN 164 u_char ss_len; 165 #endif 166 sa_family_t ss_family; 167 char __ss_pad1[__SS_PAD1SIZE]; 168 int64_t __ss_align; 169 char __ss_pad2[__SS_PAD2SIZE]; 170 }; 171 #endif 172 #define FILE_MODE (S_IRUSR  S_IWUSR  S_IRGRP  S_IROTH) 173 /* default file access permissions for new files */ 174 #define DIR_MODE (FILE_MODE  S_IXUSR  S_IXGRP  S_IXOTH) 175 /* default permissions for new directories */ 176 typedef void Sigfunc (int); /* for signal handlers */ 177 #define min(a,b) ((a) < (b) ? (a) : (b)) 178 #define max(a,b) ((a) > (b) ? (a) : (b)) 179 #ifndef HAVE_ADDRINFO_STRUCT 180 # include "../lib/addrinfo.h" 181 #endif 182 #ifndef HAVE_IF_NAMEINDEX_STRUCT 183 struct if_nameindex { 184 unsigned int if_index; /* 1, 2, ... */ 185 char *if_name; /* null- terminated name : "le0", ... */ 186 }; 187 #endif 188 #ifndef HAVE_TIMESPEC_STRUCT 189 struct timespec { 190 time_t tv_sec; /* seconds */ 191 long tv_nsec; /* and nanoseconds */ 192 }; 193 #endif 
" 79 1234567890123456 */ 80 #endif 81 /* Define following even if IPv6 not supported, so we can always allocate 82 an adequately sized buffer without #ifdefs in the code. */ 83 #ifndef INET6_ADDRSTRLEN 84 #define INET6_ADDRSTRLEN 46 /* max size of IPv6 address string: 85 "xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx" or 86 "xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:ddd.ddd.ddd.ddd
 1 /* Our own header. Tabs are set for 4 spaces, not 8 */ 2 # ifndef __unp_h 3 #define __unp_h 4 #include "../config.h" /* configuration options for current OS */ 5 /* "../config.h" is generated by configure */ 6 /* If anything changes in the following list of #includes, must change 7 acsite.m4 also, for configure's tests. */ 8 #include <sys/types.h> /* basic system data types */ 9 #include <sys/socket.h> /* basic socket definitions */ 10 #include <sys/time.h> /* timeval{} for select() */ 11 #include <time.h> /* timespec{} for pselect () */ 12 #include <netinet/in.h> /* sockaddr_in{} and other Internet defns */ 13 #include <arpa/inet.h> /* inet(3) functions */ 14 #include <errno.h> 15 #include <fcntl.h> /* for nonblocking */ 16 #include <netdb.h> 17 #include <signal.h> 18 #include <stdio.h> 19 #include <stdlib.h> 20 #include <string.h> 21 #include <sys/stat.h> /* for S_xxx file mode constants */ 22 #include <sys/uio.h> /* for iovec{} and readv/ writev */ 23 #include <unistd.h> 24 #include <sys/wait.h> 25 #include <sys/un.h> /* for Unix domain sockets */ 26 #ifdef HAVE_SYS_SELECT_H 27 # include <sys/select.h> /* for convenience */ 28 #endif 29 #ifdef HAVE_SYS_SYSCTL_H 30 # include <sys/sysctl.h> 31 #endif 32 #ifdef HAVE_POLL_H 33 # include <poll.h> /* for convenience */ 34 #endif 35 #ifdef HAVE_SYS_EVENT_H 36 # include <sys/event.h> /* for kqueue */ 37 #endif 38 #ifdef HAVE_STRINGS_H 39 # include <strings.h> /* for convenience */ 40 #endif 41 /* Three headers are normally needed for socket/file ioctl's: 42 * <sys/ioctl.h>, <sys/filio.h>, and <sys/sockio.h>. 43 */ 44 #ifdef HAVE_SYS_IOCTL_H 45 # include <sys/ioctl.h> 46 #endif 47 #ifdef HAVE_SYS_FILIO_H 48 # include <sys/filio.h> 49 #endif 50 #ifdef HAVE_SYS_SOCKIO_H 51 # include <sys/sockio.h> 52 #endif 53 #ifdef HAVE_PTHREAD_H 54 # include <pthread.h> 55 #endif 56 #ifdef HAVE_NET_IF_DL_H 57 # include <net/if_dl.h> 58 #endif 59 #ifdef HAVE_NETINET_SCTP_H 60 #include <netinet/sctp.h> 61 #endif 62 /* OSF/1 actually disables recv() and send() in <sys/socket.h> */ 63 #ifdef __osf__ 64 #undef recv 65 #undef send 66 #define recv(a,b,c,d) recvfrom(a,b,c,d,0,0) 67 #define send(a,b,c,d) sendto (a,b,c,d,0,0) 68 #endif 69 #ifndef INADDR_NONE 70 #define INADDR_NONE 0xffffffff /* should have been in <netinet/in.h> */ 71 #endif 72 #ifndef SHUT_RD /* these three POSIX names are new */ 73 #define SHUT_RD 0 /* shutdown for reading */ 74 #define SHUT_WR 1 /* shutdown for writing */ 75 #define SHUT_RDWR 2 /* shutdown for reading and writing */ 76 #endif 77 #ifndef INET_ADDRSTRLEN 78 #define INET_ADDRSTRLEN 16 /* "ddd.ddd.ddd.ddd\0" 79 1234567890123456 */ 80 #endif 81 /* Define following even if IPv6 not supported, so we can always allocate 82 an adequately sized buffer without #ifdefs in the code. */ 83 #ifndef INET6_ADDRSTRLEN 84 #define INET6_ADDRSTRLEN 46 /* max size of IPv6 address string: 85 "xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx" or 86 "xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:ddd.ddd.ddd.ddd\0" 87 1234567890123456789012345678901234567890123456 */ 88 #endif 89 /* Define bzero() as a macro if it's not in standard C library. */ 90 #ifndef HAVE_BZERO 91 #define bzero(ptr,n) memset (ptr, 0, n) 92 #endif 93 /* Older resolvers do not have gethostbyname2() */ 94 #ifndef HAVE_GETHOSTBYNAME2 95 #define gethostbyname2(host,family) gethostbyname((host)) 96 #endif 97 /* The structure returned by recvfrom_flags() */ 98 struct unp_in_pktinfo { 99 struct in_addr ipi_addr; /* dst IPv4 address */ 100 int ipi_ifindex; /* received interface index */ 101 }; 102 /* We need the newer CMSG_LEN() and CMSG_SPACE() macros, but few 103 implementations support them today. These two macros really need 104 an ALIGN() macro, but each implementation does this differently. */ 105 #ifndef CMSG_LEN 106 #define CMSG_LEN(size) (sizeof(struct cmsghdr) + (size)) 107 #endif 108 #ifndef CMSG_SPACE 109 #define CMSG_SPACE(size) (sizeof(struct cmsghdr) + (size)) 110 #endif 111 /* POSIX requires the SUN_LEN() macro, but not all implementations define 112 it (yet). Note that this 4.4BSD macro works regardless whether there is 113 a length field or not. */ 114 #ifndef SUN_LEN 115 # define SUN_LEN (su) \ 116 (sizeof (*(su)) - sizeof ((su)->sun_path) + strlen((su)->sun_path)) 117 #endif 118 /* POSIX renames "Unix domain" as "local IPC." 119 Not all systems define AF_LOCAL and PF_LOCAL (yet). */ 120 #ifndef AF_LOCAL 121 #define AF_LOCAL AF_UNIX 122 #endif 123 #ifndef PF_LOCAL 124 #define PF_LOCAL PF_UNIX 125 #endif 126 /* POSIX requires that an #include of <poll.h> define INFTIM, but many 127 systems still define it in <sys/stropts.h>. We don't want to include 128 all the STREAMS stuff if it's not needed, so we just define INFTIM here. 129 This is the standard value, but there's no guarantee it is -1. */ 130 #ifndef INFTIM 131 #define INFTIM (-1) /* infinite poll timeout */ 132 #ifdef HAVE_POLL_H 133 #define INFTIM_UNPH /* tell unpxti.h we defined it */ 134 #endif 135 #endif 136 /* Following could be derived from SOMAXCONN in <sys/socket.h>, but many 137 kernels still #define it as 5, while actually supporting many more */ 138 #define LISTENQ 1024 /* 2nd argument to listen () */ 139 /* Miscellaneous constants */ 140 #define MAXLINE 4096 /* max text line length */ 141 #define BUFFSIZE 8192 /* buffer size for reads and writes */ 142 /* Define some port number that can be used for our examples */ 143 #define SERV_PORT 9877 /* TCP and UDP */ 144 #define SERV_PORT_STR "9877" /* TCP and UDP */ 145 #define UNIXSTR_PATH "/tmp/unix.str" /* Unix domain stream */ 146 #define UNIXDG_PATH "/tmp/unix.dg" /* Unix domain datagram */ 147 /* Following shortens all the typecasts of pointer arguments: */ 148 #define SA struct sockaddr 149 #define HAVE_STRUCT_SOCKADDR_STORAGE 150 #ifndef HAVE_STRUCT_SOCKADDR_STORAGE 151 /* 152 * RFC 3493: protocol-independent placeholder for socket addresses 153 */ 154 #define __SS_MAXSIZE 128 155 #define __SS_ALIGNSIZE (sizeof(int64_t)) 156 #ifdef HAVE_SOCKADDR_SA_LEN 157 #define __SS_PAD1SIZE (__SS_ALIGNSIZE - sizeof(u_char) - sizeof(sa_family_t)) 158 #else 159 #define __SS_PAD1SIZE (__SS_ALIGNSIZE - sizeof(sa_family_t)) 160 #endif 161 #define __SS_PAD2SIZE (__SS_MAXSIZE - 2*__SS_ALIGNSIZE) 162 struct sockaddr_storage { 163 #ifdef HAVE_SOCKADDR_SA_LEN 164 u_char ss_len; 165 #endif 166 sa_family_t ss_family; 167 char __ss_pad1[__SS_PAD1SIZE]; 168 int64_t __ss_align; 169 char __ss_pad2[__SS_PAD2SIZE]; 170 }; 171 #endif 172 #define FILE_MODE (S_IRUSR  S_IWUSR  S_IRGRP  S_IROTH) 173 /* default file access permissions for new files */ 174 #define DIR_MODE (FILE_MODE  S_IXUSR  S_IXGRP  S_IXOTH) 175 /* default permissions for new directories */ 176 typedef void Sigfunc (int); /* for signal handlers */ 177 #define min(a,b) ((a) < (b) ? (a) : (b)) 178 #define max(a,b) ((a) > (b) ? (a) : (b)) 179 #ifndef HAVE_ADDRINFO_STRUCT 180 # include "../lib/addrinfo.h" 181 #endif 182 #ifndef HAVE_IF_NAMEINDEX_STRUCT 183 struct if_nameindex { 184 unsigned int if_index; /* 1, 2, ... */ 185 char *if_name; /* null- terminated name : "le0", ... */ 186 }; 187 #endif 188 #ifndef HAVE_TIMESPEC_STRUCT 189 struct timespec { 190 time_t tv_sec; /* seconds */ 191 long tv_nsec; /* and nanoseconds */ 192 }; 193 #endif 
" 87 1234567890123456789012345678901234567890123456 */ 88 #endif 89 /* Define bzero() as a macro if it's not in standard C library. */ 90 #ifndef HAVE_BZERO 91 #define bzero(ptr,n) memset (ptr, 0, n) 92 #endif 93 /* Older resolvers do not have gethostbyname2() */ 94 #ifndef HAVE_GETHOSTBYNAME2 95 #define gethostbyname2(host,family) gethostbyname((host)) 96 #endif 97 /* The structure returned by recvfrom_flags() */ 98 struct unp_in_pktinfo { 99 struct in_addr ipi_addr; /* dst IPv4 address */ 100 int ipi_ifindex; /* received interface index */ 101 }; 102 /* We need the newer CMSG_LEN() and CMSG_SPACE() macros, but few 103 implementations support them today. These two macros really need 104 an ALIGN() macro, but each implementation does this differently. */ 105 #ifndef CMSG_LEN 106 #define CMSG_LEN(size) (sizeof(struct cmsghdr) + (size)) 107 #endif 108 #ifndef CMSG_SPACE 109 #define CMSG_SPACE(size) (sizeof(struct cmsghdr) + (size)) 110 #endif 111 /* POSIX requires the SUN_LEN() macro, but not all implementations define 112 it (yet). Note that this 4.4BSD macro works regardless whether there is 113 a length field or not. */ 114 #ifndef SUN_LEN 115 # define SUN_LEN (su) \ 116 (sizeof (*(su)) - sizeof ((su)->sun_path) + strlen((su)->sun_path)) 117 #endif 118 /* POSIX renames "Unix domain" as "local IPC." 119 Not all systems define AF_LOCAL and PF_LOCAL (yet). */ 120 #ifndef AF_LOCAL 121 #define AF_LOCAL AF_UNIX 122 #endif 123 #ifndef PF_LOCAL 124 #define PF_LOCAL PF_UNIX 125 #endif 126 /* POSIX requires that an #include of <poll.h> define INFTIM, but many 127 systems still define it in <sys/stropts.h>. We don't want to include 128 all the STREAMS stuff if it's not needed, so we just define INFTIM here. 129 This is the standard value, but there's no guarantee it is -1. */ 130 #ifndef INFTIM 131 #define INFTIM (-1) /* infinite poll timeout */ 132 #ifdef HAVE_POLL_H 133 #define INFTIM_UNPH /* tell unpxti.h we defined it */ 134 #endif 135 #endif 136 /* Following could be derived from SOMAXCONN in <sys/socket.h>, but many 137 kernels still #define it as 5, while actually supporting many more */ 138 #define LISTENQ 1024 /* 2nd argument to listen () */ 139 /* Miscellaneous constants */ 140 #define MAXLINE 4096 /* max text line length */ 141 #define BUFFSIZE 8192 /* buffer size for reads and writes */ 142 /* Define some port number that can be used for our examples */ 143 #define SERV_PORT 9877 /* TCP and UDP */ 144 #define SERV_PORT_STR "9877" /* TCP and UDP */ 145 #define UNIXSTR_PATH "/tmp/unix.str" /* Unix domain stream */ 146 #define UNIXDG_PATH "/tmp/unix.dg" /* Unix domain datagram */ 147 /* Following shortens all the typecasts of pointer arguments: */ 148 #define SA struct sockaddr 149 #define HAVE_STRUCT_SOCKADDR_STORAGE 150 #ifndef HAVE_STRUCT_SOCKADDR_STORAGE 151 /* 152 * RFC 3493: protocol-independent placeholder for socket addresses 153 */ 154 #define __SS_MAXSIZE 128 155 #define __SS_ALIGNSIZE (sizeof(int64_t)) 156 #ifdef HAVE_SOCKADDR_SA_LEN 157 #define __SS_PAD1SIZE (__SS_ALIGNSIZE - sizeof(u_char) - sizeof(sa_family_t)) 158 #else 159 #define __SS_PAD1SIZE (__SS_ALIGNSIZE - sizeof(sa_family_t)) 160 #endif 161 #define __SS_PAD2SIZE (__SS_MAXSIZE - 2*__SS_ALIGNSIZE) 162 struct sockaddr_storage { 163 #ifdef HAVE_SOCKADDR_SA_LEN 164 u_char ss_len; 165 #endif 166 sa_family_t ss_family; 167 char __ss_pad1[__SS_PAD1SIZE]; 168 int64_t __ss_align; 169 char __ss_pad2[__SS_PAD2SIZE]; 170 }; 171 #endif 172 #define FILE_MODE (S_IRUSR S_IWUSR S_IRGRP S_IROTH) 173 /* default file access permissions for new files */ 174 #define DIR_MODE (FILE_MODE S_IXUSR S_IXGRP S_IXOTH) 175 /* default permissions for new directories */ 176 typedef void Sigfunc (int); /* for signal handlers */ 177 #define min(a,b) ((a) < (b) ? (a) : (b)) 178 #define max(a,b) ((a) > (b) ? (a) : (b)) 179 #ifndef HAVE_ADDRINFO_STRUCT 180 # include "../lib/addrinfo.h" 181 #endif 182 #ifndef HAVE_IF_NAMEINDEX_STRUCT 183 struct if_nameindex { 184 unsigned int if_index; /* 1, 2, ... */ 185 char *if_name; /* null-terminated name: "le0", ... */ 186 }; 187 #endif 188 #ifndef HAVE_TIMESPEC_STRUCT 189 struct timespec { 190 time_t tv_sec; /* seconds */ 191 long tv_nsec; /* and nanoseconds */ 192 }; 193 #endif


UNIX Network Programming Volume 1, Third Edition
Unix Network Programming, Volume 1: The Sockets Networking API (3rd Edition)
ISBN: 0131411551
EAN: 2147483647
Year: 2003
Pages: 441

flylib.com © 2008-2017.
If you may any questions please contact us: flylib@qtcs.net