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 */ |
---|