1 /* sockadapt.h 2 * 3 * Authors: Charles Bailey bailey@newman.upenn.edu 4 * David Denholm denholm@conmat.phys.soton.ac.uk 5 * Last Revised: 4-Mar-1997 6 * 7 * This file should include any other header files and procide any 8 * declarations, typedefs, and prototypes needed by perl for TCP/IP 9 * operations. 10 * 11 * This version is set up for perl5 with socketshr 0.9D TCP/IP support. 12 */ 13 14 #ifndef __SOCKADAPT_INCLUDED 15 #define __SOCKADAPT_INCLUDED 1 16 17 #if defined(DECCRTL_SOCKETS) 18 /* Use builtin socket interface in DECCRTL and 19 * UCX emulation in whatever TCP/IP stack is present. 20 * Provide prototypes for missing routines; stubs are 21 * in sockadapt.c. 22 */ 23 # include <socket.h> 24 # include <inet.h> 25 # include <in.h> 26 # include <netdb.h> 27 #if ((__VMS_VER >= 70000000) && (__DECC_VER >= 50200000)) || (__CRTL_VER >= 70000000) 28 #else 29 void sethostent(int); 30 void endhostent(void); 31 void setnetent(int); 32 void endnetent(void); 33 void setprotoent(int); 34 void endprotoent(void); 35 void setservent(int); 36 void endservent(void); 37 #endif 38 # if defined(__DECC) && defined(__DECC_VER) && (__DECC_VER >= 50200000) && !defined(Sock_size_t) 39 # define Sock_size_t unsigned int 40 # endif 41 42 #else 43 /* Pull in SOCKETSHR's header, and set up structures for 44 * gcc, whose basic header file set doesn't include the 45 * TCP/IP stuff. 46 */ 47 48 49 #ifdef __GNU_CC__ 50 51 /* we may not have netdb.h etc, so lets just do this here - div */ 52 /* no harm doing this for all .c files - needed only by pp_sys.c */ 53 54 struct hostent { 55 char *h_name; /* official name of host */ 56 char **h_aliases; /* alias list */ 57 int h_addrtype; /* host address type */ 58 int h_length; /* length of address */ 59 char **h_addr_list; /* address */ 60 }; 61 #ifdef h_addr 62 # undef h_addr 63 #endif 64 #define h_addr h_addr_list[0] 65 66 struct protoent { 67 char *p_name; /* official protocol name */ 68 char **p_aliases; /* alias list */ 69 int p_proto; /* protocol # */ 70 }; 71 72 struct servent { 73 char *s_name; /* official service name */ 74 char **s_aliases; /* alias list */ 75 int s_port; /* port # */ 76 char *s_proto; /* protocol to use */ 77 }; 78 79 struct in_addr { 80 unsigned long s_addr; 81 }; 82 83 struct sockaddr { 84 unsigned short sa_family; /* address family */ 85 char sa_data[14]; /* up to 14 bytes of direct address */ 86 }; 87 88 /* 89 * Socket address, internet style. 90 */ 91 struct sockaddr_in { 92 short sin_family; 93 unsigned short sin_port; 94 struct in_addr sin_addr; 95 char sin_zero[8]; 96 }; 97 98 struct timeval { 99 long tv_sec; 100 long tv_usec; 101 }; 102 103 struct netent { 104 char *n_name; 105 char **n_aliases; 106 int n_addrtype; 107 long n_net; 108 }; 109 110 /* Since socketshr.h won't declare function prototypes unless it thinks 111 * the system headers have already been included, we convince it that 112 * this is the case. 113 */ 114 115 #ifndef AF_INET 116 # define AF_INET 2 117 #endif 118 #ifndef IPPROTO_TCP 119 # define IPPROTO_TCP 6 120 #endif 121 #ifndef __INET_LOADED 122 # define __INET_LOADED 123 #endif 124 #ifndef __NETDB_LOADED 125 # define __NETDB_LOADED 126 #endif 127 128 /* Finally, we provide prototypes for routines not supported by SocketShr, 129 * so that the stubs in sockadapt.c won't cause complaints about 130 * undeclared routines. 131 */ 132 133 struct netent *getnetbyaddr( long net, int type); 134 struct netent *getnetbyname( char *name); 135 struct netent *getnetent(); 136 void setnetent(int); 137 void endnetent(); 138 139 #else /* !__GNU_CC__ */ 140 141 /* DECC and VAXC have socket headers in the system set; they're for UCX, but 142 * we'll assume that the actual calling sequence is identical across the 143 * various TCP/IP stacks; these routines are pretty standard. 144 */ 145 #include <socket.h> 146 #include <in.h> 147 #include <inet.h> 148 149 /* SocketShr doesn't support these routines, but the DECC RTL contains 150 * stubs with these names, designed to be used with the UCX socket 151 * library. We avoid linker collisions by substituting new names. 152 */ 153 #define getnetbyaddr no_getnetbyaddr 154 #define getnetbyname no_getnetbyname 155 #define getnetent no_getnetent 156 #define setnetent no_setnetent 157 #define endnetent no_endnetent 158 159 #include <netdb.h> 160 #endif 161 162 /* We don't have these two in the system headers. */ 163 void setnetent(int); 164 void endnetent(); 165 166 #include <socketshr.h> 167 /* socketshr.h from SocketShr 0.9D doesn't alias fileno; its comments say 168 * that the CRTL version works OK. This isn't the case, at least with 169 * VAXC, so we use the SocketShr version. 170 * N.B. This means that sockadapt.h must be included *after* stdio.h. 171 * This is presently the case for Perl. 172 */ 173 #ifdef fileno 174 # undef fileno 175 #endif 176 #define fileno si_fileno 177 int si_fileno(FILE *); 178 179 180 /* Catch erroneous results for UDP sockets -- see sockadapt.c */ 181 #ifdef getpeername 182 # undef getpeername 183 #endif 184 #define getpeername my_getpeername 185 int my_getpeername (int, struct sockaddr *, int *); 186 187 #endif /* SOCKETSHR stuff */ 188 #endif /* include guard */ 189