This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Add new probes for IPv6 (LeoNerd)
[metaconfig.git] / U / modified / d_socket.U
1 ?RCS: $Id: d_socket.U,v 3.0.1.2 1997/02/28 15:46:00 ram Exp $
2 ?RCS:
3 ?RCS: Copyright (c) 1991-1993, Raphael Manfredi
4 ?RCS:
5 ?RCS: You may redistribute only under the terms of the Artistic Licence,
6 ?RCS: as specified in the README file that comes with the distribution.
7 ?RCS: You may reuse parts of this distribution only within the terms of
8 ?RCS: that same Artistic Licence; a copy of which may be found at the root
9 ?RCS: of the source tree for dist 3.0.
10 ?RCS:
11 ?RCS: $Log: d_socket.U,v $
12 ?RCS: Revision 3.0.1.2  1997/02/28  15:46:00  ram
13 ?RCS: patch61: replaced .a with $_a all over the place
14 ?RCS:
15 ?RCS: Revision 3.0.1.1  1994/01/24  14:08:04  ram
16 ?RCS: patch16: can now safely declare private nm_extract in dependencies
17 ?RCS:
18 ?RCS: Revision 3.0  1993/08/18  12:07:26  ram
19 ?RCS: Baseline for dist 3.0 netwide release.
20 ?RCS:
21 ?MAKE:d_socket d_oldsock d_sockpair socketlib sockethdr \
22         d_msg_ctrunc d_msg_dontroute d_msg_oob d_msg_peek d_msg_proxy \
23         d_scm_rights d_sockaddr_sa_len d_sockaddr_in6 d_sin6_scope_id \
24         d_ipv6_mreq: \
25         contains echo n c ar nm nm_opt nm_extract Inlibc Csym _a \
26         Compile cat rm_try Setvar Hasfield
27 ?MAKE:  -pick add $@ %<
28 ?S:d_socket:
29 ?S:     This variable conditionally defines HAS_SOCKET, which indicates
30 ?S:     that the BSD socket interface is supported.
31 ?S:.
32 ?S:d_sockpair:
33 ?S:     This variable conditionally defines the HAS_SOCKETPAIR symbol, which
34 ?S:     indicates that the BSD socketpair() is supported.
35 ?S:.
36 ?S:d_oldsock:
37 ?S:     This variable conditionally defines the OLDSOCKET symbol, which
38 ?S:     indicates that the BSD socket interface is based on 4.1c and not 4.2.
39 ?S:.
40 ?S:d_msg_ctrunc:
41 ?S:     This variable conditionally defines the HAS_MSG_CTRUNC symbol,
42 ?S:     which indicates that the MSG_CTRUNC is available.  #ifdef is
43 ?S:     not enough because it may be an enum, glibc has been known to do this.
44 ?S:.
45 ?S:d_msg_dontroute:
46 ?S:     This variable conditionally defines the HAS_MSG_DONTROUTE symbol,
47 ?S:     which indicates that the MSG_DONTROUTE is available.  #ifdef is
48 ?S:     not enough because it may be an enum, glibc has been known to do this.
49 ?S:.
50 ?S:d_msg_oob:
51 ?S:     This variable conditionally defines the HAS_MSG_OOB symbol,
52 ?S:     which indicates that the MSG_OOB is available.  #ifdef is
53 ?S:     not enough because it may be an enum, glibc has been known to do this.
54 ?S:.
55 ?S:d_msg_peek:
56 ?S:     This variable conditionally defines the HAS_MSG_PEEK symbol,
57 ?S:     which indicates that the MSG_PEEK is available.  #ifdef is
58 ?S:     not enough because it may be an enum, glibc has been known to do this.
59 ?S:.
60 ?S:d_msg_proxy:
61 ?S:     This variable conditionally defines the HAS_MSG_PROXY symbol,
62 ?S:     which indicates that the MSG_PROXY is available.  #ifdef is
63 ?S:     not enough because it may be an enum, glibc has been known to do this.
64 ?S:.
65 ?S:d_scm_rights:
66 ?S:     This variable conditionally defines the HAS_SCM_RIGHTS symbol,
67 ?S:     which indicates that the SCM_RIGHTS is available.  #ifdef is
68 ?S:     not enough because it may be an enum, glibc has been known to do this.
69 ?S:.
70 ?S:d_sockaddr_sa_len:
71 ?S:     This variable conditionally defines the HAS_SOCKADDR_SA_LEN symbol,
72 ?S:     which indicates that a struct sockaddr structure has the sa_len
73 ?S:     member.
74 ?S:.
75 ?S:d_sockaddr_in6:
76 ?S:     This variable conditionally defines the HAS_SOCKADDR_IN6 symbol, which
77 ?S:     indicates the availability of a struct sockaddr_in6.
78 ?S:.
79 ?S:d_sin6_scope_id:
80 ?S:     This variable conditionally defines the HAS_SIN6_SCOPE_ID symbol, which
81 ?S:     indicates that a struct sockaddr_in6 structure has the sin6_scope_id
82 ?S:     member.
83 ?S:.
84 ?S:d_ipv6_mreq:
85 ?S:     This variable conditionally defines the HAS_IPV6_MREQ symbol, which
86 ?S:     indicates the availability of a struct ipv6_mreq.
87 ?S:.
88 ?S:socketlib:
89 ?S:     This variable has the names of any libraries needed for socket support.
90 ?S:.
91 ?S:sockethdr:
92 ?S:     This variable has any cpp '-I' flags needed for socket support.
93 ?S:.
94 ?C:HAS_SOCKET (SOCKET):
95 ?C:     This symbol, if defined, indicates that the BSD socket interface is
96 ?C:     supported.
97 ?C:.
98 ?C:HAS_SOCKETPAIR (SOCKETPAIR):
99 ?C:     This symbol, if defined, indicates that the BSD socketpair() call is
100 ?C:     supported.
101 ?C:.
102 ?C:USE_OLDSOCKET (OLDSOCKET):
103 ?C:     This symbol, if defined, indicates that the 4.1c BSD socket interface
104 ?C:     is supported instead of the 4.2/4.3 BSD socket interface. For instance,
105 ?C:     there is no setsockopt() call.
106 ?C:.
107 ?C:HAS_MSG_CTRUNC:
108 ?C:     This symbol, if defined, indicates that the MSG_CTRUNC is supported.
109 ?C:     Checking just with #ifdef might not be enough because this symbol
110 ?C:     has been known to be an enum.
111 ?C:.
112 ?C:HAS_MSG_DONTROUTE:
113 ?C:     This symbol, if defined, indicates that the MSG_DONTROUTE is supported.
114 ?C:     Checking just with #ifdef might not be enough because this symbol
115 ?C:     has been known to be an enum.
116 ?C:.
117 ?C:HAS_MSG_OOB:
118 ?C:     This symbol, if defined, indicates that the MSG_OOB is supported.
119 ?C:     Checking just with #ifdef might not be enough because this symbol
120 ?C:     has been known to be an enum.
121 ?C:.
122 ?C:HAS_MSG_PEEK:
123 ?C:     This symbol, if defined, indicates that the MSG_PEEK is supported.
124 ?C:     Checking just with #ifdef might not be enough because this symbol
125 ?C:     has been known to be an enum.
126 ?C:.
127 ?C:HAS_MSG_PROXY:
128 ?C:     This symbol, if defined, indicates that the MSG_PROXY is supported.
129 ?C:     Checking just with #ifdef might not be enough because this symbol
130 ?C:     has been known to be an enum.
131 ?C:.
132 ?C:HAS_SCM_RIGHTS:
133 ?C:     This symbol, if defined, indicates that the SCM_RIGHTS is supported.
134 ?C:     Checking just with #ifdef might not be enough because this symbol
135 ?C:     has been known to be an enum.
136 ?C:.
137 ?C:HAS_SOCKADDR_SA_LEN:
138 ?C:     This symbol, if defined, indicates that the struct sockaddr
139 ?C:     structure has a member called sa_len, indicating the length of
140 ?C:     the structure.
141 ?C:.
142 ?C:HAS_SOCKADDR_IN6:
143 ?C:     This symbol, if defined, indicates the availability of
144 ?C:     struct sockaddr_in6;
145 ?C:.
146 ?C:HAS_SIN6_SCOPE_ID:
147 ?C:     This symbol, if defined, indicates that the struct sockaddr_in6
148 ?C:     structure has a member called sin6_scope_id.
149 ?C:.
150 ?C:HAS_IPV6_MREQ:
151 ?C:     This symbol, if defined, indicates the availability of
152 ?C:     struct ipv6_mreq;
153 ?C:.
154 ?H:#$d_socket   HAS_SOCKET              /**/
155 ?H:#$d_sockpair HAS_SOCKETPAIR  /**/
156 ?H:#$d_sockaddr_sa_len  HAS_SOCKADDR_SA_LEN     /**/
157 ?H:#$d_oldsock  USE_OLDSOCKET   /**/
158 ?H:#$d_msg_ctrunc       HAS_MSG_CTRUNC  /**/
159 ?H:#$d_msg_dontroute    HAS_MSG_DONTROUTE       /**/
160 ?H:#$d_msg_oob  HAS_MSG_OOB     /**/
161 ?H:#$d_msg_peek HAS_MSG_PEEK    /**/
162 ?H:#$d_msg_proxy        HAS_MSG_PROXY   /**/
163 ?H:#$d_scm_rights       HAS_SCM_RIGHTS  /**/
164 ?H:#$d_sockaddr_in6     HAS_SOCKADDR_IN6        /**/
165 ?H:#$d_sin6_scope_id    HAS_SIN6_SCOPE_ID       /**/
166 ?H:#$d_ipv6_mreq        HAS_IPV6_MREQ   /**/
167 ?H:.
168 ?T:val net ENUM enum
169 ?F:try.c
170 ?LINT:set d_sockpair d_sockaddr_sa_len
171 ?LINT:set d_msg_ctrunc d_msg_dontroute d_msg_oob d_msg_peek d_msg_proxy
172 ?LINT:set d_scm_rights d_sockaddr_in6 d_sin6_scope_id d_ipv6_mreq
173 : see whether socket exists
174 socketlib=''
175 sockethdr=''
176 echo " "
177 $echo $n "Hmm... $c" >&4
178 if set socket val -f d_socket; eval $csym; $val; then
179         echo "Looks like you have Berkeley networking support." >&4
180         d_socket="$define"
181 ?X: now check for advanced features
182         if set setsockopt val -f; eval $csym; $val; then
183                 d_oldsock="$undef"
184         else
185                 echo "...but it uses the old BSD 4.1c interface, rather than 4.2." >&4
186                 d_oldsock="$define"
187         fi
188 else
189 ?X: HP-UX, for one, puts all the socket stuff in socklib.o. Note that if we
190 ?X: come here on HP-UX, then we must have used nm to get symbols, or we really
191 ?X: don't have sockets anyway...
192         if $contains socklib libc.list >/dev/null 2>&1; then
193                 echo "Looks like you have Berkeley networking support." >&4
194                 d_socket="$define"
195                 : we will have to assume that it supports the 4.2 BSD interface
196                 d_oldsock="$undef"
197         else
198                 echo "You don't have Berkeley networking in libc$_a..." >&4
199 ?X: look for optional networking libraries
200                 if test "X$d_socket" = "X$define"; then
201                    echo "...but you seem to believe that you have sockets." >&4
202                 else
203                         for net in net socket
204                         do
205                                 if test -f /usr/lib/lib$net$_a; then
206 ?X: space between two  '(' needed for ksh
207                                         ( ($nm $nm_opt /usr/lib/lib$net$_a | eval $nm_extract) ||  \
208                                         $ar t /usr/lib/lib$net$_a) 2>/dev/null >> libc.list
209                                         if $contains socket libc.list >/dev/null 2>&1; then
210                                                 d_socket="$define"
211                                                 socketlib="-l$net"
212                                                 case "$net" in
213                                                 net)
214                                                         echo "...but the Wollongong group seems to have hacked it in." >&4
215                                                         sockethdr="-I/usr/netinclude"
216                                                         ;;
217                                                 esac
218                                                 echo "Found Berkeley sockets interface in lib$net." >&4
219 ?X: now check for advanced features
220                                                 if $contains setsockopt libc.list >/dev/null 2>&1; then
221                                                         d_oldsock="$undef"
222                                                 else
223                                                         echo "...using the old BSD 4.1c interface, rather than 4.2." >&4
224                                                         d_oldsock="$define"
225                                                 fi
226                                                 break
227                                         fi
228                                 fi
229                         done
230                         if test "X$d_socket" != "X$define"; then
231                            echo "or anywhere else I see." >&4
232                            d_socket="$undef"
233                            d_oldsock="$undef"
234                         fi
235                 fi
236         fi
237 fi
238
239 @if HAS_SOCKETPAIR || d_sockpair
240 : see if socketpair exists
241 set socketpair d_sockpair
242 eval $inlibc
243
244 @end
245
246 echo " "
247 ?X: ...
248 echo "Checking the availability sa_len in the sock struct ..." >&4
249 $cat >try.c <<EOF
250 #include <sys/types.h>
251 #include <sys/socket.h>
252 int main() {
253 struct sockaddr sa;
254 return (sa.sa_len);
255 }
256 EOF
257 val="$undef"
258 set try; if eval $compile; then
259         val="$define"
260 fi
261 set d_sockaddr_sa_len; eval $setvar
262 $rm_try
263
264 echo " "
265 ?X: ...
266 echo "Checking the availability struct sockaddr_in6 ..." >&4
267 $cat >try.c <<EOF
268 #include <sys/types.h>
269 #include <sys/socket.h>
270 #include <netinet/in.h>
271 int main() {
272 struct sockaddr_in6 sin6;
273 return (sin6.sin6_family);
274 }
275 EOF
276 val="$undef"
277 set try; if eval $compile; then
278         val="$define"
279 fi
280 set d_sockaddr_in6; eval $setvar
281 $rm_try
282
283 echo " "
284 ?X: ...
285 echo "Checking the availability sin6_scope_id in struct sockaddr_in6 ..." >&4
286 $cat >try.c <<EOF
287 #include <sys/types.h>
288 #include <sys/socket.h>
289 #include <netinet/in.h>
290 int main() {
291 struct sockaddr_in6 sin6;
292 return (sin6.sin6_scope_id);
293 }
294 EOF
295 val="$undef"
296 set try; if eval $compile; then
297         val="$define"
298 fi
299 set d_sin6_scope_id; eval $setvar
300 $rm_try
301
302 echo " "
303 ?X: ...
304 echo "Checking the availability struct ipv6_mreq ..." >&4
305 $cat >try.c <<EOF
306 #include <sys/types.h>
307 #include <sys/socket.h>
308 #include <netinet/in.h>
309 int main() {
310 struct ipv6_mreq mreq;
311 return (mreq.ipv6mr_interface);
312 }
313 EOF
314 val="$undef"
315 set try; if eval $compile; then
316         val="$define"
317 fi
318 set d_ipv6_mreq; eval $setvar
319 $rm_try
320
321 echo " "
322 ?X: these constants are known to be troublesomely defined as enums
323 ?X: so that ifdef will not work for detecting their presence.
324 echo "Checking the availability of certain socket constants..." >&4
325 for ENUM in MSG_CTRUNC MSG_DONTROUTE MSG_OOB MSG_PEEK MSG_PROXY SCM_RIGHTS; do
326         enum=`$echo $ENUM|./tr '[A-Z]' '[a-z]'`
327         $cat >try.c <<EOF
328 #include <sys/types.h>
329 #include <sys/socket.h>
330 int main() {
331     int i = $ENUM;
332 }
333 EOF
334         val="$undef"
335         set try; if eval $compile; then
336                 val="$define"
337         fi
338         set d_${enum}; eval $setvar
339         $rm_try
340 done
341