GDBM_File (wasRe: ext/ + -Wall)
[p5sagit/p5-mst-13.2.git] / ext / Socket / Socket.xs
CommitLineData
c5be433b 1#define PERL_NO_GET_CONTEXT
a0d0e21e 2#include "EXTERN.h"
3#include "perl.h"
4#include "XSUB.h"
5
8e07c86e 6#ifndef VMS
7# ifdef I_SYS_TYPES
8# include <sys/types.h>
9# endif
9cc6feab 10# include <sys/socket.h>
29209bc5 11# if defined(USE_SOCKS) && defined(I_SOCKS)
86959918 12# include <socks.h>
13# endif
9cc6feab 14# ifdef MPE
15# define PF_INET AF_INET
16# define PF_UNIX AF_UNIX
17# define SOCK_RAW 3
18# endif
19# ifdef I_SYS_UN
20# include <sys/un.h>
21# endif
bf9b2f8f 22/* XXX Configure test for <netinet/in_systm.h needed XXX */
23# if defined(NeXT) || defined(__NeXT__)
24# include <netinet/in_systm.h>
25# endif
8e07c86e 26# ifdef I_NETINET_IN
27# include <netinet/in.h>
28# endif
86959918 29# ifdef I_NETDB
30# include <netdb.h>
31# endif
9cc6feab 32# ifdef I_ARPA_INET
33# include <arpa/inet.h>
34# endif
35# ifdef I_NETINET_TCP
36# include <netinet/tcp.h>
37# endif
8e07c86e 38#else
9cc6feab 39# include "sockadapt.h"
8e07c86e 40#endif
a0d0e21e 41
6b1016b5 42#ifdef I_SYSUIO
43# include <sys/uio.h>
44#endif
45
a0d0e21e 46#ifndef AF_NBS
9cc6feab 47# undef PF_NBS
a0d0e21e 48#endif
49
50#ifndef AF_X25
9cc6feab 51# undef PF_X25
a0d0e21e 52#endif
53
8e07c86e 54#ifndef INADDR_NONE
9cc6feab 55# define INADDR_NONE 0xffffffff
8e07c86e 56#endif /* INADDR_NONE */
7e1af8bc 57#ifndef INADDR_BROADCAST
9cc6feab 58# define INADDR_BROADCAST 0xffffffff
7e1af8bc 59#endif /* INADDR_BROADCAST */
8e07c86e 60#ifndef INADDR_LOOPBACK
9cc6feab 61# define INADDR_LOOPBACK 0x7F000001
8e07c86e 62#endif /* INADDR_LOOPBACK */
63
7e1af8bc 64#ifndef HAS_INET_ATON
65
66/*
67 * Check whether "cp" is a valid ascii representation
68 * of an Internet address and convert to a binary address.
69 * Returns 1 if the address is valid, 0 if not.
70 * This replaces inet_addr, the return value from which
71 * cannot distinguish between failure and a local broadcast address.
72 */
73static int
f0f333f4 74my_inet_aton(register const char *cp, struct in_addr *addr)
7e1af8bc 75{
c5be433b 76 dTHX;
0caed002 77 register U32 val;
7e1af8bc 78 register int base;
79 register char c;
80 int nparts;
81 const char *s;
82 unsigned int parts[4];
83 register unsigned int *pp = parts;
84
0caed002 85 if (!cp)
86 return 0;
7e1af8bc 87 for (;;) {
88 /*
89 * Collect number up to ``.''.
90 * Values are specified as for C:
91 * 0x=hex, 0=octal, other=decimal.
92 */
93 val = 0; base = 10;
94 if (*cp == '0') {
95 if (*++cp == 'x' || *cp == 'X')
96 base = 16, cp++;
97 else
98 base = 8;
99 }
100 while ((c = *cp) != '\0') {
101 if (isDIGIT(c)) {
102 val = (val * base) + (c - '0');
103 cp++;
104 continue;
105 }
3280af22 106 if (base == 16 && (s=strchr(PL_hexdigit,c))) {
7e1af8bc 107 val = (val << 4) +
3280af22 108 ((s - PL_hexdigit) & 15);
7e1af8bc 109 cp++;
110 continue;
111 }
112 break;
113 }
114 if (*cp == '.') {
115 /*
116 * Internet format:
117 * a.b.c.d
118 * a.b.c (with c treated as 16-bits)
119 * a.b (with b treated as 24 bits)
120 */
121 if (pp >= parts + 3 || val > 0xff)
122 return 0;
123 *pp++ = val, cp++;
124 } else
125 break;
126 }
127 /*
128 * Check for trailing characters.
129 */
130 if (*cp && !isSPACE(*cp))
131 return 0;
132 /*
133 * Concoct the address according to
134 * the number of parts specified.
135 */
136 nparts = pp - parts + 1; /* force to an int for switch() */
137 switch (nparts) {
138
139 case 1: /* a -- 32 bits */
140 break;
141
142 case 2: /* a.b -- 8.24 bits */
143 if (val > 0xffffff)
144 return 0;
145 val |= parts[0] << 24;
146 break;
147
148 case 3: /* a.b.c -- 8.8.16 bits */
149 if (val > 0xffff)
150 return 0;
151 val |= (parts[0] << 24) | (parts[1] << 16);
152 break;
153
154 case 4: /* a.b.c.d -- 8.8.8.8 bits */
155 if (val > 0xff)
156 return 0;
157 val |= (parts[0] << 24) | (parts[1] << 16) | (parts[2] << 8);
158 break;
159 }
160 addr->s_addr = htonl(val);
161 return 1;
162}
163
164#undef inet_aton
165#define inet_aton my_inet_aton
166
167#endif /* ! HAS_INET_ATON */
168
8e07c86e 169
a0d0e21e 170static int
f0f333f4 171not_here(char *s)
a0d0e21e 172{
173 croak("Socket::%s not implemented on this architecture", s);
174 return -1;
175}
176
18085af4 177#define PERL_constant_NOTFOUND 1
178#define PERL_constant_NOTDEF 2
179#define PERL_constant_ISIV 3
180#define PERL_constant_ISNV 4
181#define PERL_constant_ISPV 5
182#define PERL_constant_ISPVN 6
183#define PERL_constant_ISUV 7
184
185#ifndef NVTYPE
186typedef double NV; /* 5.6 and later define NVTYPE, and typedef NV to it. */
187#endif
188
189static int
190constant_5 (const char *name, IV *iv_return) {
191 /* Names all of length 5. */
192 /* When generated this function returned values for the list of names given
193 here. However, subsequent manual editing may have added or removed some.
194 AF_NS PF_NS */
195 /* Offset 0 gives the best switch position. */
196 switch (name[0]) {
197 case 'A':
198 if (memEQ(name, "AF_NS", 5)) {
199 /* ^ */
200#ifdef AF_NS
201 *iv_return = AF_NS;
202 return PERL_constant_ISIV;
203#else
204 return PERL_constant_NOTDEF;
205#endif
206 }
207 break;
208 case 'P':
209 if (memEQ(name, "PF_NS", 5)) {
210 /* ^ */
211#ifdef PF_NS
212 *iv_return = PF_NS;
213 return PERL_constant_ISIV;
214#else
215 return PERL_constant_NOTDEF;
216#endif
217 }
218 break;
219 }
220 return PERL_constant_NOTFOUND;
221}
222
223static int
224constant_6 (const char *name, IV *iv_return) {
225 /* Names all of length 6. */
226 /* When generated this function returned values for the list of names given
227 here. However, subsequent manual editing may have added or removed some.
228 AF_802 AF_DLI AF_LAT AF_MAX AF_NBS AF_NIT AF_OSI AF_PUP AF_SNA AF_X25
229 PF_802 PF_DLI PF_LAT PF_MAX PF_NBS PF_NIT PF_OSI PF_PUP PF_SNA PF_X25 */
230 /* Offset 3 gives the best switch position. */
231 switch (name[3]) {
232 case '8':
233 if (memEQ(name, "AF_802", 6)) {
234 /* ^ */
a0d0e21e 235#ifdef AF_802
18085af4 236 *iv_return = AF_802;
237 return PERL_constant_ISIV;
a0d0e21e 238#else
18085af4 239 return PERL_constant_NOTDEF;
a0d0e21e 240#endif
18085af4 241 }
242 if (memEQ(name, "PF_802", 6)) {
243 /* ^ */
244#ifdef PF_802
245 *iv_return = PF_802;
246 return PERL_constant_ISIV;
a0d0e21e 247#else
18085af4 248 return PERL_constant_NOTDEF;
a0d0e21e 249#endif
18085af4 250 }
251 break;
252 case 'D':
253 if (memEQ(name, "AF_DLI", 6)) {
254 /* ^ */
255#ifdef AF_DLI
256 *iv_return = AF_DLI;
257 return PERL_constant_ISIV;
a0d0e21e 258#else
18085af4 259 return PERL_constant_NOTDEF;
a0d0e21e 260#endif
18085af4 261 }
262 if (memEQ(name, "PF_DLI", 6)) {
263 /* ^ */
264#ifdef PF_DLI
265 *iv_return = PF_DLI;
266 return PERL_constant_ISIV;
a0d0e21e 267#else
18085af4 268 return PERL_constant_NOTDEF;
a0d0e21e 269#endif
18085af4 270 }
271 break;
272 case 'L':
273 if (memEQ(name, "AF_LAT", 6)) {
274 /* ^ */
275#ifdef AF_LAT
276 *iv_return = AF_LAT;
277 return PERL_constant_ISIV;
a0d0e21e 278#else
18085af4 279 return PERL_constant_NOTDEF;
a0d0e21e 280#endif
18085af4 281 }
282 if (memEQ(name, "PF_LAT", 6)) {
283 /* ^ */
284#ifdef PF_LAT
285 *iv_return = PF_LAT;
286 return PERL_constant_ISIV;
a0d0e21e 287#else
18085af4 288 return PERL_constant_NOTDEF;
a0d0e21e 289#endif
18085af4 290 }
291 break;
292 case 'M':
293 if (memEQ(name, "AF_MAX", 6)) {
294 /* ^ */
295#ifdef AF_MAX
296 *iv_return = AF_MAX;
297 return PERL_constant_ISIV;
a0d0e21e 298#else
18085af4 299 return PERL_constant_NOTDEF;
a0d0e21e 300#endif
18085af4 301 }
302 if (memEQ(name, "PF_MAX", 6)) {
303 /* ^ */
304#ifdef PF_MAX
305 *iv_return = PF_MAX;
306 return PERL_constant_ISIV;
a0d0e21e 307#else
18085af4 308 return PERL_constant_NOTDEF;
a0d0e21e 309#endif
18085af4 310 }
311 break;
312 case 'N':
313 if (memEQ(name, "AF_NBS", 6)) {
314 /* ^ */
315#ifdef AF_NBS
316 *iv_return = AF_NBS;
317 return PERL_constant_ISIV;
a0d0e21e 318#else
18085af4 319 return PERL_constant_NOTDEF;
a0d0e21e 320#endif
18085af4 321 }
322 if (memEQ(name, "AF_NIT", 6)) {
323 /* ^ */
324#ifdef AF_NIT
325 *iv_return = AF_NIT;
326 return PERL_constant_ISIV;
a0d0e21e 327#else
18085af4 328 return PERL_constant_NOTDEF;
a0d0e21e 329#endif
18085af4 330 }
331 if (memEQ(name, "PF_NBS", 6)) {
332 /* ^ */
333#ifdef PF_NBS
334 *iv_return = PF_NBS;
335 return PERL_constant_ISIV;
a0d0e21e 336#else
18085af4 337 return PERL_constant_NOTDEF;
a0d0e21e 338#endif
18085af4 339 }
340 if (memEQ(name, "PF_NIT", 6)) {
341 /* ^ */
342#ifdef PF_NIT
343 *iv_return = PF_NIT;
344 return PERL_constant_ISIV;
a0d0e21e 345#else
18085af4 346 return PERL_constant_NOTDEF;
a0d0e21e 347#endif
18085af4 348 }
349 break;
350 case 'O':
351 if (memEQ(name, "AF_OSI", 6)) {
352 /* ^ */
353#ifdef AF_OSI
354 *iv_return = AF_OSI;
355 return PERL_constant_ISIV;
a0d0e21e 356#else
18085af4 357 return PERL_constant_NOTDEF;
a0d0e21e 358#endif
18085af4 359 }
360 if (memEQ(name, "PF_OSI", 6)) {
361 /* ^ */
362#ifdef PF_OSI
363 *iv_return = PF_OSI;
364 return PERL_constant_ISIV;
a0d0e21e 365#else
18085af4 366 return PERL_constant_NOTDEF;
a0d0e21e 367#endif
18085af4 368 }
369 break;
370 case 'P':
371 if (memEQ(name, "AF_PUP", 6)) {
372 /* ^ */
373#ifdef AF_PUP
374 *iv_return = AF_PUP;
375 return PERL_constant_ISIV;
a0d0e21e 376#else
18085af4 377 return PERL_constant_NOTDEF;
a0d0e21e 378#endif
18085af4 379 }
380 if (memEQ(name, "PF_PUP", 6)) {
381 /* ^ */
382#ifdef PF_PUP
383 *iv_return = PF_PUP;
384 return PERL_constant_ISIV;
a0d0e21e 385#else
18085af4 386 return PERL_constant_NOTDEF;
a0d0e21e 387#endif
18085af4 388 }
389 break;
390 case 'S':
391 if (memEQ(name, "AF_SNA", 6)) {
392 /* ^ */
393#ifdef AF_SNA
394 *iv_return = AF_SNA;
395 return PERL_constant_ISIV;
a0d0e21e 396#else
18085af4 397 return PERL_constant_NOTDEF;
a0d0e21e 398#endif
18085af4 399 }
400 if (memEQ(name, "PF_SNA", 6)) {
401 /* ^ */
402#ifdef PF_SNA
403 *iv_return = PF_SNA;
404 return PERL_constant_ISIV;
a0d0e21e 405#else
18085af4 406 return PERL_constant_NOTDEF;
a0d0e21e 407#endif
18085af4 408 }
409 break;
410 case 'X':
411 if (memEQ(name, "AF_X25", 6)) {
412 /* ^ */
413#ifdef AF_X25
414 *iv_return = AF_X25;
415 return PERL_constant_ISIV;
a0d0e21e 416#else
18085af4 417 return PERL_constant_NOTDEF;
a0d0e21e 418#endif
18085af4 419 }
420 if (memEQ(name, "PF_X25", 6)) {
421 /* ^ */
422#ifdef PF_X25
423 *iv_return = PF_X25;
424 return PERL_constant_ISIV;
a0d0e21e 425#else
18085af4 426 return PERL_constant_NOTDEF;
a0d0e21e 427#endif
18085af4 428 }
429 break;
430 }
431 return PERL_constant_NOTFOUND;
432}
433
434static int
435constant_7 (const char *name, IV *iv_return) {
436 /* Names all of length 7. */
437 /* When generated this function returned values for the list of names given
438 here. However, subsequent manual editing may have added or removed some.
439 AF_ECMA AF_INET AF_UNIX IOV_MAX MSG_EOF MSG_EOR MSG_FIN MSG_OOB MSG_RST
440 MSG_SYN MSG_URG PF_ECMA PF_INET PF_UNIX SHUT_RD SHUT_WR SO_TYPE */
441 /* Offset 4 gives the best switch position. */
442 switch (name[4]) {
443 case 'C':
444 if (memEQ(name, "AF_ECMA", 7)) {
445 /* ^ */
446#ifdef AF_ECMA
447 *iv_return = AF_ECMA;
448 return PERL_constant_ISIV;
a0d0e21e 449#else
18085af4 450 return PERL_constant_NOTDEF;
a0d0e21e 451#endif
18085af4 452 }
453 if (memEQ(name, "PF_ECMA", 7)) {
454 /* ^ */
455#ifdef PF_ECMA
456 *iv_return = PF_ECMA;
457 return PERL_constant_ISIV;
a0d0e21e 458#else
18085af4 459 return PERL_constant_NOTDEF;
a0d0e21e 460#endif
18085af4 461 }
462 break;
463 case 'E':
464 if (memEQ(name, "MSG_EOF", 7)) {
465 /* ^ */
466#ifdef MSG_EOF
467 *iv_return = MSG_EOF;
468 return PERL_constant_ISIV;
a0d0e21e 469#else
18085af4 470 return PERL_constant_NOTDEF;
a0d0e21e 471#endif
18085af4 472 }
473 if (memEQ(name, "MSG_EOR", 7)) {
474 /* ^ */
475#ifdef MSG_EOR
476 *iv_return = MSG_EOR;
477 return PERL_constant_ISIV;
6b1016b5 478#else
18085af4 479 return PERL_constant_NOTDEF;
6b1016b5 480#endif
18085af4 481 }
482 break;
483 case 'F':
484 if (memEQ(name, "MSG_FIN", 7)) {
485 /* ^ */
486#ifdef MSG_FIN
487 *iv_return = MSG_FIN;
488 return PERL_constant_ISIV;
6b1016b5 489#else
18085af4 490 return PERL_constant_NOTDEF;
6b1016b5 491#endif
18085af4 492 }
493 break;
494 case 'M':
495 if (memEQ(name, "IOV_MAX", 7)) {
496 /* ^ */
497#ifdef IOV_MAX
498 *iv_return = IOV_MAX;
499 return PERL_constant_ISIV;
de4597cb 500#else
18085af4 501 return PERL_constant_NOTDEF;
de4597cb 502#endif
18085af4 503 }
504 break;
505 case 'N':
506 if (memEQ(name, "AF_INET", 7)) {
507 /* ^ */
508#ifdef AF_INET
509 *iv_return = AF_INET;
510 return PERL_constant_ISIV;
de4597cb 511#else
18085af4 512 return PERL_constant_NOTDEF;
de4597cb 513#endif
18085af4 514 }
515 if (memEQ(name, "AF_UNIX", 7)) {
516 /* ^ */
517#ifdef AF_UNIX
518 *iv_return = AF_UNIX;
519 return PERL_constant_ISIV;
a1896f58 520#else
18085af4 521 return PERL_constant_NOTDEF;
a1896f58 522#endif
18085af4 523 }
524 if (memEQ(name, "PF_INET", 7)) {
525 /* ^ */
526#ifdef PF_INET
527 *iv_return = PF_INET;
528 return PERL_constant_ISIV;
a0d0e21e 529#else
18085af4 530 return PERL_constant_NOTDEF;
a0d0e21e 531#endif
18085af4 532 }
533 if (memEQ(name, "PF_UNIX", 7)) {
534 /* ^ */
535#ifdef PF_UNIX
536 *iv_return = PF_UNIX;
537 return PERL_constant_ISIV;
de4597cb 538#else
18085af4 539 return PERL_constant_NOTDEF;
de4597cb 540#endif
18085af4 541 }
542 break;
543 case 'O':
544 if (memEQ(name, "MSG_OOB", 7)) {
545 /* ^ */
546#if defined(MSG_OOB) || defined(HAS_MSG_OOB) /* might be an enum */
547 *iv_return = MSG_OOB;
548 return PERL_constant_ISIV;
de4597cb 549#else
18085af4 550 return PERL_constant_NOTDEF;
de4597cb 551#endif
18085af4 552 }
553 break;
554 case 'R':
555 if (memEQ(name, "MSG_RST", 7)) {
556 /* ^ */
557#ifdef MSG_RST
558 *iv_return = MSG_RST;
559 return PERL_constant_ISIV;
de4597cb 560#else
18085af4 561 return PERL_constant_NOTDEF;
de4597cb 562#endif
18085af4 563 }
564 break;
565 case 'S':
566 if (memEQ(name, "MSG_SYN", 7)) {
567 /* ^ */
568#ifdef MSG_SYN
569 *iv_return = MSG_SYN;
570 return PERL_constant_ISIV;
de4597cb 571#else
18085af4 572 return PERL_constant_NOTDEF;
de4597cb 573#endif
18085af4 574 }
575 break;
576 case 'U':
577 if (memEQ(name, "MSG_URG", 7)) {
578 /* ^ */
579#ifdef MSG_URG
580 *iv_return = MSG_URG;
581 return PERL_constant_ISIV;
de4597cb 582#else
18085af4 583 return PERL_constant_NOTDEF;
de4597cb 584#endif
18085af4 585 }
586 break;
587 case 'Y':
588 if (memEQ(name, "SO_TYPE", 7)) {
589 /* ^ */
590#ifdef SO_TYPE
591 *iv_return = SO_TYPE;
592 return PERL_constant_ISIV;
a0d0e21e 593#else
18085af4 594 return PERL_constant_NOTDEF;
a0d0e21e 595#endif
18085af4 596 }
597 break;
598 case '_':
599 if (memEQ(name, "SHUT_RD", 7)) {
600 /* ^ */
601#ifdef SHUT_RD
602 *iv_return = SHUT_RD;
603 return PERL_constant_ISIV;
6b1016b5 604#else
18085af4 605 *iv_return = 0;
606 return PERL_constant_ISIV;
6b1016b5 607#endif
18085af4 608 }
609 if (memEQ(name, "SHUT_WR", 7)) {
610 /* ^ */
611#ifdef SHUT_WR
612 *iv_return = SHUT_WR;
613 return PERL_constant_ISIV;
de4597cb 614#else
18085af4 615 *iv_return = 1;
616 return PERL_constant_ISIV;
de4597cb 617#endif
18085af4 618 }
619 break;
620 }
621 return PERL_constant_NOTFOUND;
622}
623
624static int
625constant_8 (const char *name, IV *iv_return) {
626 /* Names all of length 8. */
627 /* When generated this function returned values for the list of names given
628 here. However, subsequent manual editing may have added or removed some.
629 AF_CCITT AF_CHAOS AF_GOSIP MSG_PEEK PF_CCITT PF_CHAOS PF_GOSIP SOCK_RAW
630 SOCK_RDM SO_DEBUG SO_ERROR */
631 /* Offset 7 gives the best switch position. */
632 switch (name[7]) {
633 case 'G':
634 if (memEQ(name, "SO_DEBUG", 8)) {
635 /* ^ */
636#ifdef SO_DEBUG
637 *iv_return = SO_DEBUG;
638 return PERL_constant_ISIV;
a0d0e21e 639#else
18085af4 640 return PERL_constant_NOTDEF;
a0d0e21e 641#endif
18085af4 642 }
643 break;
644 case 'K':
645 if (memEQ(name, "MSG_PEEK", 8)) {
646 /* ^ */
5b8dae3f 647#if defined(MSG_PEEK) || defined(HAS_MSG_PEEK) /* might be an enum */
18085af4 648 *iv_return = MSG_PEEK;
649 return PERL_constant_ISIV;
a0d0e21e 650#else
18085af4 651 return PERL_constant_NOTDEF;
a0d0e21e 652#endif
18085af4 653 }
654 break;
655 case 'M':
656 if (memEQ(name, "SOCK_RDM", 8)) {
657 /* ^ */
658#ifdef SOCK_RDM
659 *iv_return = SOCK_RDM;
660 return PERL_constant_ISIV;
a1896f58 661#else
18085af4 662 return PERL_constant_NOTDEF;
a1896f58 663#endif
18085af4 664 }
665 break;
666 case 'P':
667 if (memEQ(name, "AF_GOSIP", 8)) {
668 /* ^ */
669#ifdef AF_GOSIP
670 *iv_return = AF_GOSIP;
671 return PERL_constant_ISIV;
de4597cb 672#else
18085af4 673 return PERL_constant_NOTDEF;
de4597cb 674#endif
18085af4 675 }
676 if (memEQ(name, "PF_GOSIP", 8)) {
677 /* ^ */
678#ifdef PF_GOSIP
679 *iv_return = PF_GOSIP;
680 return PERL_constant_ISIV;
de4597cb 681#else
18085af4 682 return PERL_constant_NOTDEF;
de4597cb 683#endif
18085af4 684 }
685 break;
686 case 'R':
687 if (memEQ(name, "SO_ERROR", 8)) {
688 /* ^ */
689#ifdef SO_ERROR
690 *iv_return = SO_ERROR;
691 return PERL_constant_ISIV;
de4597cb 692#else
18085af4 693 return PERL_constant_NOTDEF;
de4597cb 694#endif
18085af4 695 }
696 break;
697 case 'S':
698 if (memEQ(name, "AF_CHAOS", 8)) {
699 /* ^ */
700#ifdef AF_CHAOS
701 *iv_return = AF_CHAOS;
702 return PERL_constant_ISIV;
de4597cb 703#else
18085af4 704 return PERL_constant_NOTDEF;
de4597cb 705#endif
18085af4 706 }
707 if (memEQ(name, "PF_CHAOS", 8)) {
708 /* ^ */
709#ifdef PF_CHAOS
710 *iv_return = PF_CHAOS;
711 return PERL_constant_ISIV;
a0d0e21e 712#else
18085af4 713 return PERL_constant_NOTDEF;
a0d0e21e 714#endif
18085af4 715 }
716 break;
717 case 'T':
718 if (memEQ(name, "AF_CCITT", 8)) {
719 /* ^ */
720#ifdef AF_CCITT
721 *iv_return = AF_CCITT;
722 return PERL_constant_ISIV;
a0d0e21e 723#else
18085af4 724 return PERL_constant_NOTDEF;
a0d0e21e 725#endif
18085af4 726 }
727 if (memEQ(name, "PF_CCITT", 8)) {
728 /* ^ */
a0d0e21e 729#ifdef PF_CCITT
18085af4 730 *iv_return = PF_CCITT;
731 return PERL_constant_ISIV;
a0d0e21e 732#else
18085af4 733 return PERL_constant_NOTDEF;
a0d0e21e 734#endif
18085af4 735 }
736 break;
737 case 'W':
738 if (memEQ(name, "SOCK_RAW", 8)) {
739 /* ^ */
740#ifdef SOCK_RAW
741 *iv_return = SOCK_RAW;
742 return PERL_constant_ISIV;
a0d0e21e 743#else
18085af4 744 return PERL_constant_NOTDEF;
a0d0e21e 745#endif
18085af4 746 }
747 break;
748 }
749 return PERL_constant_NOTFOUND;
750}
751
752static int
753constant_9 (const char *name, IV *iv_return) {
754 /* Names all of length 9. */
755 /* When generated this function returned values for the list of names given
756 here. However, subsequent manual editing may have added or removed some.
757 AF_DECnet AF_HYLINK AF_OSINET AF_UNSPEC MSG_BCAST MSG_MCAST MSG_PROXY
758 MSG_TRUNC PF_DECnet PF_HYLINK PF_OSINET PF_UNSPEC SCM_CREDS SHUT_RDWR
759 SOMAXCONN SO_LINGER SO_RCVBUF SO_SNDBUF TCP_MAXRT */
760 /* Offset 6 gives the best switch position. */
761 switch (name[6]) {
762 case 'A':
763 if (memEQ(name, "MSG_BCAST", 9)) {
764 /* ^ */
765#ifdef MSG_BCAST
766 *iv_return = MSG_BCAST;
767 return PERL_constant_ISIV;
a0d0e21e 768#else
18085af4 769 return PERL_constant_NOTDEF;
a0d0e21e 770#endif
18085af4 771 }
772 if (memEQ(name, "MSG_MCAST", 9)) {
773 /* ^ */
774#ifdef MSG_MCAST
775 *iv_return = MSG_MCAST;
776 return PERL_constant_ISIV;
a0d0e21e 777#else
18085af4 778 return PERL_constant_NOTDEF;
a0d0e21e 779#endif
18085af4 780 }
781 break;
782 case 'B':
783 if (memEQ(name, "SO_RCVBUF", 9)) {
784 /* ^ */
785#ifdef SO_RCVBUF
786 *iv_return = SO_RCVBUF;
787 return PERL_constant_ISIV;
a0d0e21e 788#else
18085af4 789 return PERL_constant_NOTDEF;
a0d0e21e 790#endif
18085af4 791 }
792 if (memEQ(name, "SO_SNDBUF", 9)) {
793 /* ^ */
794#ifdef SO_SNDBUF
795 *iv_return = SO_SNDBUF;
796 return PERL_constant_ISIV;
a0d0e21e 797#else
18085af4 798 return PERL_constant_NOTDEF;
a0d0e21e 799#endif
18085af4 800 }
801 break;
802 case 'D':
803 if (memEQ(name, "SHUT_RDWR", 9)) {
804 /* ^ */
805#ifdef SHUT_RDWR
806 *iv_return = SHUT_RDWR;
807 return PERL_constant_ISIV;
a0d0e21e 808#else
18085af4 809 *iv_return = 2;
810 return PERL_constant_ISIV;
a0d0e21e 811#endif
18085af4 812 }
813 break;
814 case 'E':
815 if (memEQ(name, "SCM_CREDS", 9)) {
816 /* ^ */
817#ifdef SCM_CREDS
818 *iv_return = SCM_CREDS;
819 return PERL_constant_ISIV;
a0d0e21e 820#else
18085af4 821 return PERL_constant_NOTDEF;
a0d0e21e 822#endif
18085af4 823 }
824 break;
825 case 'G':
826 if (memEQ(name, "SO_LINGER", 9)) {
827 /* ^ */
828#ifdef SO_LINGER
829 *iv_return = SO_LINGER;
830 return PERL_constant_ISIV;
a0d0e21e 831#else
18085af4 832 return PERL_constant_NOTDEF;
a0d0e21e 833#endif
18085af4 834 }
835 break;
836 case 'I':
837 if (memEQ(name, "AF_HYLINK", 9)) {
838 /* ^ */
839#ifdef AF_HYLINK
840 *iv_return = AF_HYLINK;
841 return PERL_constant_ISIV;
a0d0e21e 842#else
18085af4 843 return PERL_constant_NOTDEF;
a0d0e21e 844#endif
18085af4 845 }
846 if (memEQ(name, "PF_HYLINK", 9)) {
847 /* ^ */
848#ifdef PF_HYLINK
849 *iv_return = PF_HYLINK;
850 return PERL_constant_ISIV;
a0d0e21e 851#else
18085af4 852 return PERL_constant_NOTDEF;
a0d0e21e 853#endif
18085af4 854 }
855 break;
856 case 'N':
857 if (memEQ(name, "AF_OSINET", 9)) {
858 /* ^ */
859#ifdef AF_OSINET
860 *iv_return = AF_OSINET;
861 return PERL_constant_ISIV;
a0d0e21e 862#else
18085af4 863 return PERL_constant_NOTDEF;
a0d0e21e 864#endif
18085af4 865 }
866 if (memEQ(name, "PF_OSINET", 9)) {
867 /* ^ */
868#ifdef PF_OSINET
869 *iv_return = PF_OSINET;
870 return PERL_constant_ISIV;
a0d0e21e 871#else
18085af4 872 return PERL_constant_NOTDEF;
a0d0e21e 873#endif
18085af4 874 }
875 break;
876 case 'O':
877 if (memEQ(name, "MSG_PROXY", 9)) {
878 /* ^ */
879#if defined(MSG_PROXY) || defined(HAS_MSG_PROXY) /* might be an enum */
880 *iv_return = MSG_PROXY;
881 return PERL_constant_ISIV;
a0d0e21e 882#else
18085af4 883 return PERL_constant_NOTDEF;
a0d0e21e 884#endif
18085af4 885 }
886 if (memEQ(name, "SOMAXCONN", 9)) {
887 /* ^ */
888#ifdef SOMAXCONN
889 *iv_return = SOMAXCONN;
890 return PERL_constant_ISIV;
a0d0e21e 891#else
18085af4 892 return PERL_constant_NOTDEF;
a0d0e21e 893#endif
18085af4 894 }
895 break;
896 case 'P':
897 if (memEQ(name, "AF_UNSPEC", 9)) {
898 /* ^ */
899#ifdef AF_UNSPEC
900 *iv_return = AF_UNSPEC;
901 return PERL_constant_ISIV;
a0d0e21e 902#else
18085af4 903 return PERL_constant_NOTDEF;
a0d0e21e 904#endif
18085af4 905 }
906 if (memEQ(name, "PF_UNSPEC", 9)) {
907 /* ^ */
908#ifdef PF_UNSPEC
909 *iv_return = PF_UNSPEC;
910 return PERL_constant_ISIV;
a0d0e21e 911#else
18085af4 912 return PERL_constant_NOTDEF;
a0d0e21e 913#endif
18085af4 914 }
915 break;
916 case 'U':
917 if (memEQ(name, "MSG_TRUNC", 9)) {
918 /* ^ */
919#ifdef MSG_TRUNC
920 *iv_return = MSG_TRUNC;
921 return PERL_constant_ISIV;
a0d0e21e 922#else
18085af4 923 return PERL_constant_NOTDEF;
a0d0e21e 924#endif
18085af4 925 }
926 break;
927 case 'X':
928 if (memEQ(name, "TCP_MAXRT", 9)) {
929 /* ^ */
930#ifdef TCP_MAXRT
931 *iv_return = TCP_MAXRT;
932 return PERL_constant_ISIV;
a0d0e21e 933#else
18085af4 934 return PERL_constant_NOTDEF;
a0d0e21e 935#endif
18085af4 936 }
937 break;
938 case 'n':
939 if (memEQ(name, "AF_DECnet", 9)) {
940 /* ^ */
941#ifdef AF_DECnet
942 *iv_return = AF_DECnet;
943 return PERL_constant_ISIV;
a0d0e21e 944#else
18085af4 945 return PERL_constant_NOTDEF;
a0d0e21e 946#endif
18085af4 947 }
948 if (memEQ(name, "PF_DECnet", 9)) {
949 /* ^ */
950#ifdef PF_DECnet
951 *iv_return = PF_DECnet;
952 return PERL_constant_ISIV;
a0d0e21e 953#else
18085af4 954 return PERL_constant_NOTDEF;
a0d0e21e 955#endif
18085af4 956 }
957 break;
958 }
959 return PERL_constant_NOTFOUND;
960}
961
962static int
963constant_10 (const char *name, IV *iv_return) {
964 /* Names all of length 10. */
965 /* When generated this function returned values for the list of names given
966 here. However, subsequent manual editing may have added or removed some.
967 AF_DATAKIT AF_IMPLINK MSG_CTRUNC PF_DATAKIT PF_IMPLINK SCM_RIGHTS
968 SOCK_DGRAM SOL_SOCKET TCP_MAXSEG TCP_STDURG UIO_MAXIOV */
969 /* Offset 6 gives the best switch position. */
970 switch (name[6]) {
971 case 'A':
972 if (memEQ(name, "AF_DATAKIT", 10)) {
973 /* ^ */
974#ifdef AF_DATAKIT
975 *iv_return = AF_DATAKIT;
976 return PERL_constant_ISIV;
a0d0e21e 977#else
18085af4 978 return PERL_constant_NOTDEF;
a0d0e21e 979#endif
18085af4 980 }
981 if (memEQ(name, "PF_DATAKIT", 10)) {
982 /* ^ */
983#ifdef PF_DATAKIT
984 *iv_return = PF_DATAKIT;
985 return PERL_constant_ISIV;
de4597cb 986#else
18085af4 987 return PERL_constant_NOTDEF;
de4597cb 988#endif
18085af4 989 }
990 break;
991 case 'C':
992 if (memEQ(name, "SOL_SOCKET", 10)) {
993 /* ^ */
994#ifdef SOL_SOCKET
995 *iv_return = SOL_SOCKET;
996 return PERL_constant_ISIV;
de4597cb 997#else
18085af4 998 return PERL_constant_NOTDEF;
de4597cb 999#endif
18085af4 1000 }
1001 break;
1002 case 'D':
1003 if (memEQ(name, "TCP_STDURG", 10)) {
1004 /* ^ */
1005#ifdef TCP_STDURG
1006 *iv_return = TCP_STDURG;
1007 return PERL_constant_ISIV;
de4597cb 1008#else
18085af4 1009 return PERL_constant_NOTDEF;
de4597cb 1010#endif
18085af4 1011 }
1012 break;
1013 case 'G':
1014 if (memEQ(name, "SCM_RIGHTS", 10)) {
1015 /* ^ */
5b8dae3f 1016#if defined(SCM_RIGHTS) || defined(HAS_SCM_RIGHTS) /* might be an enum */
18085af4 1017 *iv_return = SCM_RIGHTS;
1018 return PERL_constant_ISIV;
de4597cb 1019#else
18085af4 1020 return PERL_constant_NOTDEF;
de4597cb 1021#endif
18085af4 1022 }
1023 if (memEQ(name, "SOCK_DGRAM", 10)) {
1024 /* ^ */
1025#ifdef SOCK_DGRAM
1026 *iv_return = SOCK_DGRAM;
1027 return PERL_constant_ISIV;
de4597cb 1028#else
18085af4 1029 return PERL_constant_NOTDEF;
de4597cb 1030#endif
18085af4 1031 }
1032 break;
1033 case 'L':
1034 if (memEQ(name, "AF_IMPLINK", 10)) {
1035 /* ^ */
1036#ifdef AF_IMPLINK
1037 *iv_return = AF_IMPLINK;
1038 return PERL_constant_ISIV;
ca6e1c26 1039#else
18085af4 1040 return PERL_constant_NOTDEF;
ca6e1c26 1041#endif
18085af4 1042 }
1043 if (memEQ(name, "PF_IMPLINK", 10)) {
1044 /* ^ */
1045#ifdef PF_IMPLINK
1046 *iv_return = PF_IMPLINK;
1047 return PERL_constant_ISIV;
ca6e1c26 1048#else
18085af4 1049 return PERL_constant_NOTDEF;
ca6e1c26 1050#endif
18085af4 1051 }
1052 break;
1053 case 'R':
1054 if (memEQ(name, "MSG_CTRUNC", 10)) {
1055 /* ^ */
1056#if defined(MSG_CTRUNC) || defined(HAS_MSG_CTRUNC) /* might be an enum */
1057 *iv_return = MSG_CTRUNC;
1058 return PERL_constant_ISIV;
ca6e1c26 1059#else
18085af4 1060 return PERL_constant_NOTDEF;
ca6e1c26 1061#endif
18085af4 1062 }
1063 break;
1064 case 'X':
1065 if (memEQ(name, "TCP_MAXSEG", 10)) {
1066 /* ^ */
1067#ifdef TCP_MAXSEG
1068 *iv_return = TCP_MAXSEG;
1069 return PERL_constant_ISIV;
a0d0e21e 1070#else
18085af4 1071 return PERL_constant_NOTDEF;
a0d0e21e 1072#endif
18085af4 1073 }
1074 if (memEQ(name, "UIO_MAXIOV", 10)) {
1075 /* ^ */
1076#ifdef UIO_MAXIOV
1077 *iv_return = UIO_MAXIOV;
1078 return PERL_constant_ISIV;
a0d0e21e 1079#else
18085af4 1080 return PERL_constant_NOTDEF;
a0d0e21e 1081#endif
18085af4 1082 }
1083 break;
1084 }
1085 return PERL_constant_NOTFOUND;
1086}
1087
1088static int
1089constant_11 (const char *name, IV *iv_return) {
1090 /* Names all of length 11. */
1091 /* When generated this function returned values for the list of names given
1092 here. However, subsequent manual editing may have added or removed some.
1093 IPPROTO_TCP MSG_WAITALL SCM_CONNECT SOCK_STREAM SO_RCVLOWAT SO_RCVTIMEO
1094 SO_SNDLOWAT SO_SNDTIMEO TCP_NODELAY */
1095 /* Offset 7 gives the best switch position. */
1096 switch (name[7]) {
1097 case 'E':
1098 if (memEQ(name, "TCP_NODELAY", 11)) {
1099 /* ^ */
1100#ifdef TCP_NODELAY
1101 *iv_return = TCP_NODELAY;
1102 return PERL_constant_ISIV;
a0d0e21e 1103#else
18085af4 1104 return PERL_constant_NOTDEF;
a0d0e21e 1105#endif
18085af4 1106 }
1107 break;
1108 case 'I':
1109 if (memEQ(name, "SO_RCVTIMEO", 11)) {
1110 /* ^ */
1111#ifdef SO_RCVTIMEO
1112 *iv_return = SO_RCVTIMEO;
1113 return PERL_constant_ISIV;
a0d0e21e 1114#else
18085af4 1115 return PERL_constant_NOTDEF;
a0d0e21e 1116#endif
18085af4 1117 }
1118 if (memEQ(name, "SO_SNDTIMEO", 11)) {
1119 /* ^ */
1120#ifdef SO_SNDTIMEO
1121 *iv_return = SO_SNDTIMEO;
1122 return PERL_constant_ISIV;
a0d0e21e 1123#else
18085af4 1124 return PERL_constant_NOTDEF;
a0d0e21e 1125#endif
18085af4 1126 }
1127 break;
1128 case 'N':
1129 if (memEQ(name, "SCM_CONNECT", 11)) {
1130 /* ^ */
1131#ifdef SCM_CONNECT
1132 *iv_return = SCM_CONNECT;
1133 return PERL_constant_ISIV;
a0d0e21e 1134#else
18085af4 1135 return PERL_constant_NOTDEF;
a0d0e21e 1136#endif
18085af4 1137 }
1138 break;
1139 case 'O':
1140 if (memEQ(name, "SO_RCVLOWAT", 11)) {
1141 /* ^ */
1142#ifdef SO_RCVLOWAT
1143 *iv_return = SO_RCVLOWAT;
1144 return PERL_constant_ISIV;
a0d0e21e 1145#else
18085af4 1146 return PERL_constant_NOTDEF;
a0d0e21e 1147#endif
18085af4 1148 }
1149 if (memEQ(name, "SO_SNDLOWAT", 11)) {
1150 /* ^ */
1151#ifdef SO_SNDLOWAT
1152 *iv_return = SO_SNDLOWAT;
1153 return PERL_constant_ISIV;
a0d0e21e 1154#else
18085af4 1155 return PERL_constant_NOTDEF;
a0d0e21e 1156#endif
18085af4 1157 }
1158 break;
1159 case 'R':
1160 if (memEQ(name, "SOCK_STREAM", 11)) {
1161 /* ^ */
1162#ifdef SOCK_STREAM
1163 *iv_return = SOCK_STREAM;
1164 return PERL_constant_ISIV;
a0d0e21e 1165#else
18085af4 1166 return PERL_constant_NOTDEF;
a0d0e21e 1167#endif
18085af4 1168 }
1169 break;
1170 case 'T':
1171 if (memEQ(name, "MSG_WAITALL", 11)) {
1172 /* ^ */
1173#ifdef MSG_WAITALL
1174 *iv_return = MSG_WAITALL;
1175 return PERL_constant_ISIV;
a0d0e21e 1176#else
18085af4 1177 return PERL_constant_NOTDEF;
a0d0e21e 1178#endif
18085af4 1179 }
1180 break;
1181 case '_':
1182 if (memEQ(name, "IPPROTO_TCP", 11)) {
1183 /* ^ */
1184#ifdef IPPROTO_TCP
1185 *iv_return = IPPROTO_TCP;
1186 return PERL_constant_ISIV;
a0d0e21e 1187#else
18085af4 1188 return PERL_constant_NOTDEF;
a0d0e21e 1189#endif
18085af4 1190 }
1191 break;
1192 }
1193 return PERL_constant_NOTFOUND;
1194}
1195
1196static int
1197constant_12 (const char *name, IV *iv_return) {
1198 /* Names all of length 12. */
1199 /* When generated this function returned values for the list of names given
1200 here. However, subsequent manual editing may have added or removed some.
1201 AF_APPLETALK MSG_CTLFLAGS MSG_DONTWAIT MSG_ERRQUEUE MSG_NOSIGNAL
1202 PF_APPLETALK SO_BROADCAST SO_DONTROUTE SO_KEEPALIVE SO_OOBINLINE
1203 SO_REUSEADDR SO_REUSEPORT */
1204 /* Offset 10 gives the best switch position. */
1205 switch (name[10]) {
1206 case 'A':
1207 if (memEQ(name, "MSG_NOSIGNAL", 12)) {
1208 /* ^ */
1209#ifdef MSG_NOSIGNAL
1210 *iv_return = MSG_NOSIGNAL;
1211 return PERL_constant_ISIV;
a0d0e21e 1212#else
18085af4 1213 return PERL_constant_NOTDEF;
a0d0e21e 1214#endif
18085af4 1215 }
1216 break;
1217 case 'D':
1218 if (memEQ(name, "SO_REUSEADDR", 12)) {
1219 /* ^ */
1220#ifdef SO_REUSEADDR
1221 *iv_return = SO_REUSEADDR;
1222 return PERL_constant_ISIV;
a0d0e21e 1223#else
18085af4 1224 return PERL_constant_NOTDEF;
a0d0e21e 1225#endif
18085af4 1226 }
1227 break;
1228 case 'G':
1229 if (memEQ(name, "MSG_CTLFLAGS", 12)) {
1230 /* ^ */
1231#ifdef MSG_CTLFLAGS
1232 *iv_return = MSG_CTLFLAGS;
1233 return PERL_constant_ISIV;
a0d0e21e 1234#else
18085af4 1235 return PERL_constant_NOTDEF;
a0d0e21e 1236#endif
18085af4 1237 }
1238 break;
1239 case 'I':
1240 if (memEQ(name, "MSG_DONTWAIT", 12)) {
1241 /* ^ */
1242#ifdef MSG_DONTWAIT
1243 *iv_return = MSG_DONTWAIT;
1244 return PERL_constant_ISIV;
1245#else
1246 return PERL_constant_NOTDEF;
1247#endif
1248 }
1249 break;
1250 case 'L':
1251 if (memEQ(name, "AF_APPLETALK", 12)) {
1252 /* ^ */
1253#ifdef AF_APPLETALK
1254 *iv_return = AF_APPLETALK;
1255 return PERL_constant_ISIV;
a0d0e21e 1256#else
18085af4 1257 return PERL_constant_NOTDEF;
a0d0e21e 1258#endif
18085af4 1259 }
1260 if (memEQ(name, "PF_APPLETALK", 12)) {
1261 /* ^ */
1262#ifdef PF_APPLETALK
1263 *iv_return = PF_APPLETALK;
1264 return PERL_constant_ISIV;
1265#else
1266 return PERL_constant_NOTDEF;
1267#endif
1268 }
1269 break;
1270 case 'N':
1271 if (memEQ(name, "SO_OOBINLINE", 12)) {
1272 /* ^ */
a0d0e21e 1273#ifdef SO_OOBINLINE
18085af4 1274 *iv_return = SO_OOBINLINE;
1275 return PERL_constant_ISIV;
a0d0e21e 1276#else
18085af4 1277 return PERL_constant_NOTDEF;
a0d0e21e 1278#endif
18085af4 1279 }
1280 break;
1281 case 'R':
1282 if (memEQ(name, "SO_REUSEPORT", 12)) {
1283 /* ^ */
1284#ifdef SO_REUSEPORT
1285 *iv_return = SO_REUSEPORT;
1286 return PERL_constant_ISIV;
a0d0e21e 1287#else
18085af4 1288 return PERL_constant_NOTDEF;
a0d0e21e 1289#endif
18085af4 1290 }
1291 break;
1292 case 'S':
1293 if (memEQ(name, "SO_BROADCAST", 12)) {
1294 /* ^ */
1295#ifdef SO_BROADCAST
1296 *iv_return = SO_BROADCAST;
1297 return PERL_constant_ISIV;
a0d0e21e 1298#else
18085af4 1299 return PERL_constant_NOTDEF;
a0d0e21e 1300#endif
18085af4 1301 }
1302 break;
1303 case 'T':
1304 if (memEQ(name, "SO_DONTROUTE", 12)) {
1305 /* ^ */
1306#ifdef SO_DONTROUTE
1307 *iv_return = SO_DONTROUTE;
1308 return PERL_constant_ISIV;
a0d0e21e 1309#else
18085af4 1310 return PERL_constant_NOTDEF;
a0d0e21e 1311#endif
18085af4 1312 }
1313 break;
1314 case 'U':
1315 if (memEQ(name, "MSG_ERRQUEUE", 12)) {
1316 /* ^ */
1317#ifdef MSG_ERRQUEUE
1318 *iv_return = MSG_ERRQUEUE;
1319 return PERL_constant_ISIV;
a0d0e21e 1320#else
18085af4 1321 return PERL_constant_NOTDEF;
a0d0e21e 1322#endif
18085af4 1323 }
1324 break;
1325 case 'V':
1326 if (memEQ(name, "SO_KEEPALIVE", 12)) {
1327 /* ^ */
1328#ifdef SO_KEEPALIVE
1329 *iv_return = SO_KEEPALIVE;
1330 return PERL_constant_ISIV;
a0d0e21e 1331#else
18085af4 1332 return PERL_constant_NOTDEF;
a0d0e21e 1333#endif
18085af4 1334 }
1335 break;
1336 }
1337 return PERL_constant_NOTFOUND;
1338}
1339
1340static int
1341constant_13 (const char *name, IV *iv_return) {
1342 /* Names all of length 13. */
1343 /* When generated this function returned values for the list of names given
1344 here. However, subsequent manual editing may have added or removed some.
1345 MSG_CTLIGNORE MSG_DONTROUTE MSG_MAXIOVLEN SCM_TIMESTAMP SO_ACCEPTCONN
1346 SO_DONTLINGER TCP_KEEPALIVE */
1347 /* Offset 5 gives the best switch position. */
1348 switch (name[5]) {
1349 case 'A':
1350 if (memEQ(name, "MSG_MAXIOVLEN", 13)) {
1351 /* ^ */
1352#ifdef MSG_MAXIOVLEN
1353 *iv_return = MSG_MAXIOVLEN;
1354 return PERL_constant_ISIV;
a0d0e21e 1355#else
18085af4 1356 return PERL_constant_NOTDEF;
a0d0e21e 1357#endif
18085af4 1358 }
1359 break;
1360 case 'C':
1361 if (memEQ(name, "SO_ACCEPTCONN", 13)) {
1362 /* ^ */
1363#ifdef SO_ACCEPTCONN
1364 *iv_return = SO_ACCEPTCONN;
1365 return PERL_constant_ISIV;
a0d0e21e 1366#else
18085af4 1367 return PERL_constant_NOTDEF;
a0d0e21e 1368#endif
18085af4 1369 }
1370 break;
1371 case 'E':
1372 if (memEQ(name, "TCP_KEEPALIVE", 13)) {
1373 /* ^ */
1374#ifdef TCP_KEEPALIVE
1375 *iv_return = TCP_KEEPALIVE;
1376 return PERL_constant_ISIV;
a0d0e21e 1377#else
18085af4 1378 return PERL_constant_NOTDEF;
a0d0e21e 1379#endif
18085af4 1380 }
1381 break;
1382 case 'I':
1383 if (memEQ(name, "SCM_TIMESTAMP", 13)) {
1384 /* ^ */
1385#ifdef SCM_TIMESTAMP
1386 *iv_return = SCM_TIMESTAMP;
1387 return PERL_constant_ISIV;
a0d0e21e 1388#else
18085af4 1389 return PERL_constant_NOTDEF;
a0d0e21e 1390#endif
18085af4 1391 }
1392 break;
1393 case 'N':
1394 if (memEQ(name, "SO_DONTLINGER", 13)) {
1395 /* ^ */
1396#ifdef SO_DONTLINGER
1397 *iv_return = SO_DONTLINGER;
1398 return PERL_constant_ISIV;
a0d0e21e 1399#else
18085af4 1400 return PERL_constant_NOTDEF;
a0d0e21e 1401#endif
18085af4 1402 }
1403 break;
1404 case 'O':
1405 if (memEQ(name, "MSG_DONTROUTE", 13)) {
1406 /* ^ */
1407#if defined(MSG_DONTROUTE) || defined(HAS_MSG_DONTROUTE) /* might be an enum */
1408 *iv_return = MSG_DONTROUTE;
1409 return PERL_constant_ISIV;
1494e794 1410#else
18085af4 1411 return PERL_constant_NOTDEF;
1494e794 1412#endif
18085af4 1413 }
1414 break;
1415 case 'T':
1416 if (memEQ(name, "MSG_CTLIGNORE", 13)) {
1417 /* ^ */
1418#ifdef MSG_CTLIGNORE
1419 *iv_return = MSG_CTLIGNORE;
1420 return PERL_constant_ISIV;
1494e794 1421#else
18085af4 1422 return PERL_constant_NOTDEF;
1494e794 1423#endif
18085af4 1424 }
1425 break;
1426 }
1427 return PERL_constant_NOTFOUND;
1428}
1429
1430static int
1431constant_14 (const char *name, IV *iv_return) {
1432 /* Names all of length 14. */
1433 /* When generated this function returned values for the list of names given
1434 here. However, subsequent manual editing may have added or removed some.
1435 SOCK_SEQPACKET SO_USELOOPBACK */
1436 /* Offset 8 gives the best switch position. */
1437 switch (name[8]) {
1438 case 'O':
1439 if (memEQ(name, "SO_USELOOPBACK", 14)) {
1440 /* ^ */
1441#ifdef SO_USELOOPBACK
1442 *iv_return = SO_USELOOPBACK;
1443 return PERL_constant_ISIV;
1494e794 1444#else
18085af4 1445 return PERL_constant_NOTDEF;
1494e794 1446#endif
18085af4 1447 }
1448 break;
1449 case 'P':
1450 if (memEQ(name, "SOCK_SEQPACKET", 14)) {
1451 /* ^ */
1452#ifdef SOCK_SEQPACKET
1453 *iv_return = SOCK_SEQPACKET;
1454 return PERL_constant_ISIV;
1494e794 1455#else
18085af4 1456 return PERL_constant_NOTDEF;
1494e794 1457#endif
18085af4 1458 }
1459 break;
1460 }
1461 return PERL_constant_NOTFOUND;
1462}
1463
1464static int
1465constant (const char *name, STRLEN len, IV *iv_return) {
1466 /* Initially switch on the length of the name. */
1467 /* When generated this function returned values for the list of names given
1468 in this section of perl code. Rather than manually editing these functions
1469 to add or remove constants, which would result in this comment and section
1470 of code becoming inaccurate, we recommend that you edit this section of
1471 code, and use it to regenerate a new set of constant functions which you
1472 then use to replace the originals.
1473
1474 Regenerate these constant functions by feeding this entire source file to
1475 perl -x
1476
1477#!perl -w
1478use ExtUtils::Constant qw (constant_types C_constant XS_constant);
1479
1480my $types = {IV => 1};
1481my @names = (qw(AF_802 AF_APPLETALK AF_CCITT AF_CHAOS AF_DATAKIT AF_DECnet
1482 AF_DLI AF_ECMA AF_GOSIP AF_HYLINK AF_IMPLINK AF_INET AF_LAT
1483 AF_MAX AF_NBS AF_NIT AF_NS AF_OSI AF_OSINET AF_PUP AF_SNA
1484 AF_UNIX AF_UNSPEC AF_X25 IOV_MAX IPPROTO_TCP MSG_BCAST
1485 MSG_CTLFLAGS MSG_CTLIGNORE MSG_DONTWAIT MSG_EOF MSG_EOR
1486 MSG_ERRQUEUE MSG_FIN MSG_MAXIOVLEN MSG_MCAST MSG_NOSIGNAL
1487 MSG_RST MSG_SYN MSG_TRUNC MSG_WAITALL PF_802 PF_APPLETALK
1488 PF_CCITT PF_CHAOS PF_DATAKIT PF_DECnet PF_DLI PF_ECMA PF_GOSIP
1489 PF_HYLINK PF_IMPLINK PF_INET PF_LAT PF_MAX PF_NBS PF_NIT PF_NS
1490 PF_OSI PF_OSINET PF_PUP PF_SNA PF_UNIX PF_UNSPEC PF_X25
1491 SCM_CONNECT SCM_CREDENTIALS SCM_CREDS SCM_TIMESTAMP SOCK_DGRAM
1492 SOCK_RAW SOCK_RDM SOCK_SEQPACKET SOCK_STREAM SOL_SOCKET
1493 SOMAXCONN SO_ACCEPTCONN SO_BROADCAST SO_DEBUG SO_DONTLINGER
1494 SO_DONTROUTE SO_ERROR SO_KEEPALIVE SO_LINGER SO_OOBINLINE
1495 SO_RCVBUF SO_RCVLOWAT SO_RCVTIMEO SO_REUSEADDR SO_REUSEPORT
1496 SO_SNDBUF SO_SNDLOWAT SO_SNDTIMEO SO_TYPE SO_USELOOPBACK
1497 TCP_KEEPALIVE TCP_MAXRT TCP_MAXSEG TCP_NODELAY TCP_STDURG
1498 UIO_MAXIOV MSG_URG),
d05c1ba0 1499 {name=>"MSG_CTRUNC", type=>"IV", macro=>["#if defined(MSG_CTRUNC) || defined(HAS_MSG_CTRUNC) /" . "* might be an enum *" . "/\n", "#endif\n"]},
1500 {name=>"MSG_DONTROUTE", type=>"IV", macro=>["#if defined(MSG_DONTROUTE) || defined(HAS_MSG_DONTROUTE) /" . "* might be an enum *" . "/\n", "#endif\n"]},
1501 {name=>"MSG_OOB", type=>"IV", macro=>["#if defined(MSG_OOB) || defined(HAS_MSG_OOB) /" . "* might be an enum *" . "/\n", "#endif\n"]},
1502 {name=>"MSG_PEEK", type=>"IV", macro=>["#if defined(MSG_PEEK) || defined(HAS_MSG_PEEK) /" . "* might be an enum *" . "/\n", "#endif\n"]},
1503 {name=>"MSG_PROXY", type=>"IV", macro=>["#if defined(MSG_PROXY) || defined(HAS_MSG_PROXY) /" . "* might be an enum *" . "/\n", "#endif\n"]},
1504 {name=>"SCM_RIGHTS", type=>"IV", macro=>["#if defined(SCM_RIGHTS) || defined(HAS_SCM_RIGHTS) /" . "* might be an enum *" . "/\n", "#endif\n"]},
18085af4 1505 {name=>"SHUT_RD", type=>"IV", default=>["IV", "0"]},
1506 {name=>"SHUT_RDWR", type=>"IV", default=>["IV", "2"]},
1507 {name=>"SHUT_WR", type=>"IV", default=>["IV", "1"]});
1508
1509print constant_types(); # macro defs
1510foreach (C_constant ("Socket", 'constant', 'IV', $types, undef, undef, @names) ) {
1511 print $_, "\n"; # C constant subs
1512}
1513print "#### XS Section:\n";
1514print XS_constant ("Socket", $types);
1515__END__
1516 */
1517
1518 switch (len) {
1519 case 5:
1520 return constant_5 (name, iv_return);
1521 break;
1522 case 6:
1523 return constant_6 (name, iv_return);
1524 break;
1525 case 7:
1526 return constant_7 (name, iv_return);
1527 break;
1528 case 8:
1529 return constant_8 (name, iv_return);
1530 break;
1531 case 9:
1532 return constant_9 (name, iv_return);
1533 break;
1534 case 10:
1535 return constant_10 (name, iv_return);
1536 break;
1537 case 11:
1538 return constant_11 (name, iv_return);
1539 break;
1540 case 12:
1541 return constant_12 (name, iv_return);
1542 break;
1543 case 13:
1544 return constant_13 (name, iv_return);
1545 break;
1546 case 14:
1547 return constant_14 (name, iv_return);
1548 break;
1549 case 15:
1550 if (memEQ(name, "SCM_CREDENTIALS", 15)) {
1551#ifdef SCM_CREDENTIALS
1552 *iv_return = SCM_CREDENTIALS;
1553 return PERL_constant_ISIV;
1494e794 1554#else
18085af4 1555 return PERL_constant_NOTDEF;
1494e794 1556#endif
18085af4 1557 }
1558 break;
1559 }
1560 return PERL_constant_NOTFOUND;
a0d0e21e 1561}
1562
8e07c86e 1563
a0d0e21e 1564MODULE = Socket PACKAGE = Socket
1565
18085af4 1566void
1567constant(sv)
1568 PREINIT:
1569#ifdef dXSTARG
1570 dXSTARG; /* Faster if we have it. */
1571#else
1572 dTARGET;
1573#endif
1574 STRLEN len;
1575 int type;
1576 IV iv;
1577 /* NV nv; Uncomment this if you need to return NVs */
1578 /* const char *pv; Uncomment this if you need to return PVs */
1579 INPUT:
1580 SV * sv;
1581 const char * s = SvPV(sv, len);
1582 PPCODE:
1583 /* Change this to constant(s, len, &iv, &nv);
1584 if you need to return both NVs and IVs */
1585 type = constant(s, len, &iv);
1586 /* Return 1 or 2 items. First is error message, or undef if no error.
1587 Second, if present, is found value */
1588 switch (type) {
1589 case PERL_constant_NOTFOUND:
1590 sv = sv_2mortal(newSVpvf("%s is not a valid Socket macro", s));
1591 PUSHs(sv);
1592 break;
1593 case PERL_constant_NOTDEF:
1594 sv = sv_2mortal(newSVpvf(
1595 "Your vendor has not defined Socket macro %s, used", s));
1596 PUSHs(sv);
1597 break;
1598 case PERL_constant_ISIV:
1599 EXTEND(SP, 1);
1600 PUSHs(&PL_sv_undef);
1601 PUSHi(iv);
1602 break;
1603 /* Uncomment this if you need to return UVs
1604 case PERL_constant_ISUV:
1605 EXTEND(SP, 1);
1606 PUSHs(&PL_sv_undef);
1607 PUSHu((UV)iv);
1608 break; */
1609 default:
1610 sv = sv_2mortal(newSVpvf(
1611 "Unexpected return type %d while processing Socket macro %s used",
1612 type, s));
1613 PUSHs(sv);
1614 }
8e07c86e 1615
1616void
1617inet_aton(host)
1618 char * host
1619 CODE:
1620 {
1621 struct in_addr ip_address;
1622 struct hostent * phe;
ac9fe1c2 1623 int ok = inet_aton(host, &ip_address);
8e07c86e 1624
ac9fe1c2 1625 if (!ok && (phe = gethostbyname(host))) {
8e07c86e 1626 Copy( phe->h_addr, &ip_address, phe->h_length, char );
7e1af8bc 1627 ok = 1;
8e07c86e 1628 }
1629
1630 ST(0) = sv_newmortal();
7e1af8bc 1631 if (ok) {
8e07c86e 1632 sv_setpvn( ST(0), (char *)&ip_address, sizeof ip_address );
1633 }
1634 }
1635
1636void
1637inet_ntoa(ip_address_sv)
1638 SV * ip_address_sv
1639 CODE:
1640 {
1641 STRLEN addrlen;
1642 struct in_addr addr;
1643 char * addr_str;
1644 char * ip_address = SvPV(ip_address_sv,addrlen);
1645 if (addrlen != sizeof(addr)) {
1646 croak("Bad arg length for %s, length is %d, should be %d",
1647 "Socket::inet_ntoa",
1648 addrlen, sizeof(addr));
1649 }
1650
1651 Copy( ip_address, &addr, sizeof addr, char );
1652 addr_str = inet_ntoa(addr);
1653
79cb57f6 1654 ST(0) = sv_2mortal(newSVpvn(addr_str, strlen(addr_str)));
8e07c86e 1655 }
1656
1657void
4633a7c4 1658pack_sockaddr_un(pathname)
1659 char * pathname
1660 CODE:
1661 {
25f94b33 1662#ifdef I_SYS_UN
4633a7c4 1663 struct sockaddr_un sun_ad; /* fear using sun */
fcdb74fc 1664 STRLEN len;
202975e6 1665
4633a7c4 1666 Zero( &sun_ad, sizeof sun_ad, char );
1667 sun_ad.sun_family = AF_UNIX;
20408e3c 1668 len = strlen(pathname);
1669 if (len > sizeof(sun_ad.sun_path))
1670 len = sizeof(sun_ad.sun_path);
202975e6 1671# ifdef OS2 /* Name should start with \socket\ and contain backslashes! */
1672 {
1673 int off;
1674 char *s, *e;
1675
1676 if (pathname[0] != '/' && pathname[0] != '\\')
1677 croak("Relative UNIX domain socket name '%s' unsupported", pathname);
1678 else if (len < 8
1679 || pathname[7] != '/' && pathname[7] != '\\'
1680 || !strnicmp(pathname + 1, "socket", 6))
1681 off = 7;
1682 else
1683 off = 0; /* Preserve names starting with \socket\ */
1684 Copy( "\\socket", sun_ad.sun_path, off, char);
1685 Copy( pathname, sun_ad.sun_path + off, len, char );
1686
1687 s = sun_ad.sun_path + off - 1;
1688 e = s + len + 1;
1689 while (++s < e)
1690 if (*s = '/')
1691 *s = '\\';
1692 }
1693# else /* !( defined OS2 ) */
20408e3c 1694 Copy( pathname, sun_ad.sun_path, len, char );
202975e6 1695# endif
79cb57f6 1696 ST(0) = sv_2mortal(newSVpvn((char *)&sun_ad, sizeof sun_ad));
25f94b33 1697#else
1698 ST(0) = (SV *) not_here("pack_sockaddr_un");
1699#endif
1700
4633a7c4 1701 }
1702
1703void
1704unpack_sockaddr_un(sun_sv)
1705 SV * sun_sv
f13e1b2f 1706 CODE:
4633a7c4 1707 {
25f94b33 1708#ifdef I_SYS_UN
4633a7c4 1709 struct sockaddr_un addr;
fcdb74fc 1710 STRLEN sockaddrlen;
1711 char * sun_ad = SvPV(sun_sv,sockaddrlen);
1712 char * e;
36902e12 1713# ifndef __linux__
1714 /* On Linux sockaddrlen on sockets returned by accept, recvfrom,
1715 getpeername and getsockname is not equal to sizeof(addr). */
4633a7c4 1716 if (sockaddrlen != sizeof(addr)) {
1717 croak("Bad arg length for %s, length is %d, should be %d",
1718 "Socket::unpack_sockaddr_un",
1719 sockaddrlen, sizeof(addr));
1720 }
36902e12 1721# endif
4633a7c4 1722
1723 Copy( sun_ad, &addr, sizeof addr, char );
1724
1725 if ( addr.sun_family != AF_UNIX ) {
1726 croak("Bad address family for %s, got %d, should be %d",
1727 "Socket::unpack_sockaddr_un",
1728 addr.sun_family,
1729 AF_UNIX);
fcdb74fc 1730 }
1731 e = addr.sun_path;
1732 while (*e && e < addr.sun_path + sizeof addr.sun_path)
1733 ++e;
79cb57f6 1734 ST(0) = sv_2mortal(newSVpvn(addr.sun_path, e - addr.sun_path));
25f94b33 1735#else
1736 ST(0) = (SV *) not_here("unpack_sockaddr_un");
1737#endif
4633a7c4 1738 }
1739
1740void
1741pack_sockaddr_in(port,ip_address)
2c129a17 1742 unsigned short port
8e07c86e 1743 char * ip_address
1744 CODE:
1745 {
1746 struct sockaddr_in sin;
1747
1748 Zero( &sin, sizeof sin, char );
4633a7c4 1749 sin.sin_family = AF_INET;
8e07c86e 1750 sin.sin_port = htons(port);
1751 Copy( ip_address, &sin.sin_addr, sizeof sin.sin_addr, char );
1752
79cb57f6 1753 ST(0) = sv_2mortal(newSVpvn((char *)&sin, sizeof sin));
8e07c86e 1754 }
1755
1756void
1757unpack_sockaddr_in(sin_sv)
1758 SV * sin_sv
1759 PPCODE:
1760 {
1761 STRLEN sockaddrlen;
1762 struct sockaddr_in addr;
2c129a17 1763 unsigned short port;
8e07c86e 1764 struct in_addr ip_address;
1765 char * sin = SvPV(sin_sv,sockaddrlen);
1766 if (sockaddrlen != sizeof(addr)) {
1767 croak("Bad arg length for %s, length is %d, should be %d",
1768 "Socket::unpack_sockaddr_in",
1769 sockaddrlen, sizeof(addr));
1770 }
8e07c86e 1771 Copy( sin, &addr,sizeof addr, char );
4633a7c4 1772 if ( addr.sin_family != AF_INET ) {
1773 croak("Bad address family for %s, got %d, should be %d",
1774 "Socket::unpack_sockaddr_in",
1775 addr.sin_family,
1776 AF_INET);
1777 }
8e07c86e 1778 port = ntohs(addr.sin_port);
1779 ip_address = addr.sin_addr;
1780
924508f0 1781 EXTEND(SP, 2);
2c129a17 1782 PUSHs(sv_2mortal(newSViv((IV) port)));
79cb57f6 1783 PUSHs(sv_2mortal(newSVpvn((char *)&ip_address,sizeof ip_address)));
8e07c86e 1784 }
1785
1786void
1787INADDR_ANY()
1788 CODE:
1789 {
1790 struct in_addr ip_address;
1791 ip_address.s_addr = htonl(INADDR_ANY);
79cb57f6 1792 ST(0) = sv_2mortal(newSVpvn((char *)&ip_address,sizeof ip_address ));
8e07c86e 1793 }
1794
1795void
1796INADDR_LOOPBACK()
1797 CODE:
1798 {
1799 struct in_addr ip_address;
1800 ip_address.s_addr = htonl(INADDR_LOOPBACK);
79cb57f6 1801 ST(0) = sv_2mortal(newSVpvn((char *)&ip_address,sizeof ip_address));
8e07c86e 1802 }
1803
1804void
1805INADDR_NONE()
1806 CODE:
1807 {
1808 struct in_addr ip_address;
1809 ip_address.s_addr = htonl(INADDR_NONE);
79cb57f6 1810 ST(0) = sv_2mortal(newSVpvn((char *)&ip_address,sizeof ip_address));
8e07c86e 1811 }
7e1af8bc 1812
1813void
1814INADDR_BROADCAST()
1815 CODE:
1816 {
1817 struct in_addr ip_address;
1818 ip_address.s_addr = htonl(INADDR_BROADCAST);
79cb57f6 1819 ST(0) = sv_2mortal(newSVpvn((char *)&ip_address,sizeof ip_address));
7e1af8bc 1820 }