1 #define PERL_NO_GET_CONTEXT
8 # include <sys/types.h>
10 # include <sys/socket.h>
11 # if defined(USE_SOCKS) && defined(I_SOCKS)
15 # define PF_INET AF_INET
16 # define PF_UNIX AF_UNIX
22 /* XXX Configure test for <netinet/in_systm.h needed XXX */
23 # if defined(NeXT) || defined(__NeXT__)
24 # include <netinet/in_systm.h>
27 # include <netinet/in.h>
33 # include <arpa/inet.h>
36 # include <netinet/tcp.h>
39 # include "sockadapt.h"
55 # define INADDR_NONE 0xffffffff
56 #endif /* INADDR_NONE */
57 #ifndef INADDR_BROADCAST
58 # define INADDR_BROADCAST 0xffffffff
59 #endif /* INADDR_BROADCAST */
60 #ifndef INADDR_LOOPBACK
61 # define INADDR_LOOPBACK 0x7F000001
62 #endif /* INADDR_LOOPBACK */
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.
74 my_inet_aton(register const char *cp, struct in_addr *addr)
82 unsigned int parts[4];
83 register unsigned int *pp = parts;
89 * Collect number up to ``.''.
90 * Values are specified as for C:
91 * 0x=hex, 0=octal, other=decimal.
95 if (*++cp == 'x' || *cp == 'X')
100 while ((c = *cp) != '\0') {
102 val = (val * base) + (c - '0');
106 if (base == 16 && (s=strchr(PL_hexdigit,c))) {
108 ((s - PL_hexdigit) & 15);
118 * a.b.c (with c treated as 16-bits)
119 * a.b (with b treated as 24 bits)
121 if (pp >= parts + 3 || val > 0xff)
128 * Check for trailing characters.
130 if (*cp && !isSPACE(*cp))
133 * Concoct the address according to
134 * the number of parts specified.
136 nparts = pp - parts + 1; /* force to an int for switch() */
139 case 1: /* a -- 32 bits */
142 case 2: /* a.b -- 8.24 bits */
145 val |= parts[0] << 24;
148 case 3: /* a.b.c -- 8.8.16 bits */
151 val |= (parts[0] << 24) | (parts[1] << 16);
154 case 4: /* a.b.c.d -- 8.8.8.8 bits */
157 val |= (parts[0] << 24) | (parts[1] << 16) | (parts[2] << 8);
160 addr->s_addr = htonl(val);
165 #define inet_aton my_inet_aton
167 #endif /* ! HAS_INET_ATON */
173 croak("Socket::%s not implemented on this architecture", s);
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
186 typedef double NV; /* 5.6 and later define NVTYPE, and typedef NV to it. */
190 constant_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.
195 /* Offset 0 gives the best switch position. */
198 if (memEQ(name, "AF_NS", 5)) {
202 return PERL_constant_ISIV;
204 return PERL_constant_NOTDEF;
209 if (memEQ(name, "PF_NS", 5)) {
213 return PERL_constant_ISIV;
215 return PERL_constant_NOTDEF;
220 return PERL_constant_NOTFOUND;
224 constant_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. */
233 if (memEQ(name, "AF_802", 6)) {
237 return PERL_constant_ISIV;
239 return PERL_constant_NOTDEF;
242 if (memEQ(name, "PF_802", 6)) {
246 return PERL_constant_ISIV;
248 return PERL_constant_NOTDEF;
253 if (memEQ(name, "AF_DLI", 6)) {
257 return PERL_constant_ISIV;
259 return PERL_constant_NOTDEF;
262 if (memEQ(name, "PF_DLI", 6)) {
266 return PERL_constant_ISIV;
268 return PERL_constant_NOTDEF;
273 if (memEQ(name, "AF_LAT", 6)) {
277 return PERL_constant_ISIV;
279 return PERL_constant_NOTDEF;
282 if (memEQ(name, "PF_LAT", 6)) {
286 return PERL_constant_ISIV;
288 return PERL_constant_NOTDEF;
293 if (memEQ(name, "AF_MAX", 6)) {
297 return PERL_constant_ISIV;
299 return PERL_constant_NOTDEF;
302 if (memEQ(name, "PF_MAX", 6)) {
306 return PERL_constant_ISIV;
308 return PERL_constant_NOTDEF;
313 if (memEQ(name, "AF_NBS", 6)) {
317 return PERL_constant_ISIV;
319 return PERL_constant_NOTDEF;
322 if (memEQ(name, "AF_NIT", 6)) {
326 return PERL_constant_ISIV;
328 return PERL_constant_NOTDEF;
331 if (memEQ(name, "PF_NBS", 6)) {
335 return PERL_constant_ISIV;
337 return PERL_constant_NOTDEF;
340 if (memEQ(name, "PF_NIT", 6)) {
344 return PERL_constant_ISIV;
346 return PERL_constant_NOTDEF;
351 if (memEQ(name, "AF_OSI", 6)) {
355 return PERL_constant_ISIV;
357 return PERL_constant_NOTDEF;
360 if (memEQ(name, "PF_OSI", 6)) {
364 return PERL_constant_ISIV;
366 return PERL_constant_NOTDEF;
371 if (memEQ(name, "AF_PUP", 6)) {
375 return PERL_constant_ISIV;
377 return PERL_constant_NOTDEF;
380 if (memEQ(name, "PF_PUP", 6)) {
384 return PERL_constant_ISIV;
386 return PERL_constant_NOTDEF;
391 if (memEQ(name, "AF_SNA", 6)) {
395 return PERL_constant_ISIV;
397 return PERL_constant_NOTDEF;
400 if (memEQ(name, "PF_SNA", 6)) {
404 return PERL_constant_ISIV;
406 return PERL_constant_NOTDEF;
411 if (memEQ(name, "AF_X25", 6)) {
415 return PERL_constant_ISIV;
417 return PERL_constant_NOTDEF;
420 if (memEQ(name, "PF_X25", 6)) {
424 return PERL_constant_ISIV;
426 return PERL_constant_NOTDEF;
431 return PERL_constant_NOTFOUND;
435 constant_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. */
444 if (memEQ(name, "AF_ECMA", 7)) {
447 *iv_return = AF_ECMA;
448 return PERL_constant_ISIV;
450 return PERL_constant_NOTDEF;
453 if (memEQ(name, "PF_ECMA", 7)) {
456 *iv_return = PF_ECMA;
457 return PERL_constant_ISIV;
459 return PERL_constant_NOTDEF;
464 if (memEQ(name, "MSG_EOF", 7)) {
467 *iv_return = MSG_EOF;
468 return PERL_constant_ISIV;
470 return PERL_constant_NOTDEF;
473 if (memEQ(name, "MSG_EOR", 7)) {
476 *iv_return = MSG_EOR;
477 return PERL_constant_ISIV;
479 return PERL_constant_NOTDEF;
484 if (memEQ(name, "MSG_FIN", 7)) {
487 *iv_return = MSG_FIN;
488 return PERL_constant_ISIV;
490 return PERL_constant_NOTDEF;
495 if (memEQ(name, "IOV_MAX", 7)) {
498 *iv_return = IOV_MAX;
499 return PERL_constant_ISIV;
501 return PERL_constant_NOTDEF;
506 if (memEQ(name, "AF_INET", 7)) {
509 *iv_return = AF_INET;
510 return PERL_constant_ISIV;
512 return PERL_constant_NOTDEF;
515 if (memEQ(name, "AF_UNIX", 7)) {
518 *iv_return = AF_UNIX;
519 return PERL_constant_ISIV;
521 return PERL_constant_NOTDEF;
524 if (memEQ(name, "PF_INET", 7)) {
527 *iv_return = PF_INET;
528 return PERL_constant_ISIV;
530 return PERL_constant_NOTDEF;
533 if (memEQ(name, "PF_UNIX", 7)) {
536 *iv_return = PF_UNIX;
537 return PERL_constant_ISIV;
539 return PERL_constant_NOTDEF;
544 if (memEQ(name, "MSG_OOB", 7)) {
546 #if defined(MSG_OOB) || defined(HAS_MSG_OOB) /* might be an enum */
547 *iv_return = MSG_OOB;
548 return PERL_constant_ISIV;
550 return PERL_constant_NOTDEF;
555 if (memEQ(name, "MSG_RST", 7)) {
558 *iv_return = MSG_RST;
559 return PERL_constant_ISIV;
561 return PERL_constant_NOTDEF;
566 if (memEQ(name, "MSG_SYN", 7)) {
569 *iv_return = MSG_SYN;
570 return PERL_constant_ISIV;
572 return PERL_constant_NOTDEF;
577 if (memEQ(name, "MSG_URG", 7)) {
580 *iv_return = MSG_URG;
581 return PERL_constant_ISIV;
583 return PERL_constant_NOTDEF;
588 if (memEQ(name, "SO_TYPE", 7)) {
591 *iv_return = SO_TYPE;
592 return PERL_constant_ISIV;
594 return PERL_constant_NOTDEF;
599 if (memEQ(name, "SHUT_RD", 7)) {
602 *iv_return = SHUT_RD;
603 return PERL_constant_ISIV;
606 return PERL_constant_ISIV;
609 if (memEQ(name, "SHUT_WR", 7)) {
612 *iv_return = SHUT_WR;
613 return PERL_constant_ISIV;
616 return PERL_constant_ISIV;
621 return PERL_constant_NOTFOUND;
625 constant_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. */
634 if (memEQ(name, "SO_DEBUG", 8)) {
637 *iv_return = SO_DEBUG;
638 return PERL_constant_ISIV;
640 return PERL_constant_NOTDEF;
645 if (memEQ(name, "MSG_PEEK", 8)) {
647 #if defined(MSG_PEEK) || defined(HAS_MSG_PEEK) /* might be an enum */
648 *iv_return = MSG_PEEK;
649 return PERL_constant_ISIV;
651 return PERL_constant_NOTDEF;
656 if (memEQ(name, "SOCK_RDM", 8)) {
659 *iv_return = SOCK_RDM;
660 return PERL_constant_ISIV;
662 return PERL_constant_NOTDEF;
667 if (memEQ(name, "AF_GOSIP", 8)) {
670 *iv_return = AF_GOSIP;
671 return PERL_constant_ISIV;
673 return PERL_constant_NOTDEF;
676 if (memEQ(name, "PF_GOSIP", 8)) {
679 *iv_return = PF_GOSIP;
680 return PERL_constant_ISIV;
682 return PERL_constant_NOTDEF;
687 if (memEQ(name, "SO_ERROR", 8)) {
690 *iv_return = SO_ERROR;
691 return PERL_constant_ISIV;
693 return PERL_constant_NOTDEF;
698 if (memEQ(name, "AF_CHAOS", 8)) {
701 *iv_return = AF_CHAOS;
702 return PERL_constant_ISIV;
704 return PERL_constant_NOTDEF;
707 if (memEQ(name, "PF_CHAOS", 8)) {
710 *iv_return = PF_CHAOS;
711 return PERL_constant_ISIV;
713 return PERL_constant_NOTDEF;
718 if (memEQ(name, "AF_CCITT", 8)) {
721 *iv_return = AF_CCITT;
722 return PERL_constant_ISIV;
724 return PERL_constant_NOTDEF;
727 if (memEQ(name, "PF_CCITT", 8)) {
730 *iv_return = PF_CCITT;
731 return PERL_constant_ISIV;
733 return PERL_constant_NOTDEF;
738 if (memEQ(name, "SOCK_RAW", 8)) {
741 *iv_return = SOCK_RAW;
742 return PERL_constant_ISIV;
744 return PERL_constant_NOTDEF;
749 return PERL_constant_NOTFOUND;
753 constant_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. */
763 if (memEQ(name, "MSG_BCAST", 9)) {
766 *iv_return = MSG_BCAST;
767 return PERL_constant_ISIV;
769 return PERL_constant_NOTDEF;
772 if (memEQ(name, "MSG_MCAST", 9)) {
775 *iv_return = MSG_MCAST;
776 return PERL_constant_ISIV;
778 return PERL_constant_NOTDEF;
783 if (memEQ(name, "SO_RCVBUF", 9)) {
786 *iv_return = SO_RCVBUF;
787 return PERL_constant_ISIV;
789 return PERL_constant_NOTDEF;
792 if (memEQ(name, "SO_SNDBUF", 9)) {
795 *iv_return = SO_SNDBUF;
796 return PERL_constant_ISIV;
798 return PERL_constant_NOTDEF;
803 if (memEQ(name, "SHUT_RDWR", 9)) {
806 *iv_return = SHUT_RDWR;
807 return PERL_constant_ISIV;
810 return PERL_constant_ISIV;
815 if (memEQ(name, "SCM_CREDS", 9)) {
818 *iv_return = SCM_CREDS;
819 return PERL_constant_ISIV;
821 return PERL_constant_NOTDEF;
826 if (memEQ(name, "SO_LINGER", 9)) {
829 *iv_return = SO_LINGER;
830 return PERL_constant_ISIV;
832 return PERL_constant_NOTDEF;
837 if (memEQ(name, "AF_HYLINK", 9)) {
840 *iv_return = AF_HYLINK;
841 return PERL_constant_ISIV;
843 return PERL_constant_NOTDEF;
846 if (memEQ(name, "PF_HYLINK", 9)) {
849 *iv_return = PF_HYLINK;
850 return PERL_constant_ISIV;
852 return PERL_constant_NOTDEF;
857 if (memEQ(name, "AF_OSINET", 9)) {
860 *iv_return = AF_OSINET;
861 return PERL_constant_ISIV;
863 return PERL_constant_NOTDEF;
866 if (memEQ(name, "PF_OSINET", 9)) {
869 *iv_return = PF_OSINET;
870 return PERL_constant_ISIV;
872 return PERL_constant_NOTDEF;
877 if (memEQ(name, "MSG_PROXY", 9)) {
879 #if defined(MSG_PROXY) || defined(HAS_MSG_PROXY) /* might be an enum */
880 *iv_return = MSG_PROXY;
881 return PERL_constant_ISIV;
883 return PERL_constant_NOTDEF;
886 if (memEQ(name, "SOMAXCONN", 9)) {
889 *iv_return = SOMAXCONN;
890 return PERL_constant_ISIV;
892 return PERL_constant_NOTDEF;
897 if (memEQ(name, "AF_UNSPEC", 9)) {
900 *iv_return = AF_UNSPEC;
901 return PERL_constant_ISIV;
903 return PERL_constant_NOTDEF;
906 if (memEQ(name, "PF_UNSPEC", 9)) {
909 *iv_return = PF_UNSPEC;
910 return PERL_constant_ISIV;
912 return PERL_constant_NOTDEF;
917 if (memEQ(name, "MSG_TRUNC", 9)) {
920 *iv_return = MSG_TRUNC;
921 return PERL_constant_ISIV;
923 return PERL_constant_NOTDEF;
928 if (memEQ(name, "TCP_MAXRT", 9)) {
931 *iv_return = TCP_MAXRT;
932 return PERL_constant_ISIV;
934 return PERL_constant_NOTDEF;
939 if (memEQ(name, "AF_DECnet", 9)) {
942 *iv_return = AF_DECnet;
943 return PERL_constant_ISIV;
945 return PERL_constant_NOTDEF;
948 if (memEQ(name, "PF_DECnet", 9)) {
951 *iv_return = PF_DECnet;
952 return PERL_constant_ISIV;
954 return PERL_constant_NOTDEF;
959 return PERL_constant_NOTFOUND;
963 constant_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. */
972 if (memEQ(name, "AF_DATAKIT", 10)) {
975 *iv_return = AF_DATAKIT;
976 return PERL_constant_ISIV;
978 return PERL_constant_NOTDEF;
981 if (memEQ(name, "PF_DATAKIT", 10)) {
984 *iv_return = PF_DATAKIT;
985 return PERL_constant_ISIV;
987 return PERL_constant_NOTDEF;
992 if (memEQ(name, "SOL_SOCKET", 10)) {
995 *iv_return = SOL_SOCKET;
996 return PERL_constant_ISIV;
998 return PERL_constant_NOTDEF;
1003 if (memEQ(name, "TCP_STDURG", 10)) {
1006 *iv_return = TCP_STDURG;
1007 return PERL_constant_ISIV;
1009 return PERL_constant_NOTDEF;
1014 if (memEQ(name, "SCM_RIGHTS", 10)) {
1016 #if defined(SCM_RIGHTS) || defined(HAS_SCM_RIGHTS) /* might be an enum */
1017 *iv_return = SCM_RIGHTS;
1018 return PERL_constant_ISIV;
1020 return PERL_constant_NOTDEF;
1023 if (memEQ(name, "SOCK_DGRAM", 10)) {
1026 *iv_return = SOCK_DGRAM;
1027 return PERL_constant_ISIV;
1029 return PERL_constant_NOTDEF;
1034 if (memEQ(name, "AF_IMPLINK", 10)) {
1037 *iv_return = AF_IMPLINK;
1038 return PERL_constant_ISIV;
1040 return PERL_constant_NOTDEF;
1043 if (memEQ(name, "PF_IMPLINK", 10)) {
1046 *iv_return = PF_IMPLINK;
1047 return PERL_constant_ISIV;
1049 return PERL_constant_NOTDEF;
1054 if (memEQ(name, "MSG_CTRUNC", 10)) {
1056 #if defined(MSG_CTRUNC) || defined(HAS_MSG_CTRUNC) /* might be an enum */
1057 *iv_return = MSG_CTRUNC;
1058 return PERL_constant_ISIV;
1060 return PERL_constant_NOTDEF;
1065 if (memEQ(name, "TCP_MAXSEG", 10)) {
1068 *iv_return = TCP_MAXSEG;
1069 return PERL_constant_ISIV;
1071 return PERL_constant_NOTDEF;
1074 if (memEQ(name, "UIO_MAXIOV", 10)) {
1077 *iv_return = UIO_MAXIOV;
1078 return PERL_constant_ISIV;
1080 return PERL_constant_NOTDEF;
1085 return PERL_constant_NOTFOUND;
1089 constant_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. */
1098 if (memEQ(name, "TCP_NODELAY", 11)) {
1101 *iv_return = TCP_NODELAY;
1102 return PERL_constant_ISIV;
1104 return PERL_constant_NOTDEF;
1109 if (memEQ(name, "SO_RCVTIMEO", 11)) {
1112 *iv_return = SO_RCVTIMEO;
1113 return PERL_constant_ISIV;
1115 return PERL_constant_NOTDEF;
1118 if (memEQ(name, "SO_SNDTIMEO", 11)) {
1121 *iv_return = SO_SNDTIMEO;
1122 return PERL_constant_ISIV;
1124 return PERL_constant_NOTDEF;
1129 if (memEQ(name, "SCM_CONNECT", 11)) {
1132 *iv_return = SCM_CONNECT;
1133 return PERL_constant_ISIV;
1135 return PERL_constant_NOTDEF;
1140 if (memEQ(name, "SO_RCVLOWAT", 11)) {
1143 *iv_return = SO_RCVLOWAT;
1144 return PERL_constant_ISIV;
1146 return PERL_constant_NOTDEF;
1149 if (memEQ(name, "SO_SNDLOWAT", 11)) {
1152 *iv_return = SO_SNDLOWAT;
1153 return PERL_constant_ISIV;
1155 return PERL_constant_NOTDEF;
1160 if (memEQ(name, "SOCK_STREAM", 11)) {
1163 *iv_return = SOCK_STREAM;
1164 return PERL_constant_ISIV;
1166 return PERL_constant_NOTDEF;
1171 if (memEQ(name, "MSG_WAITALL", 11)) {
1174 *iv_return = MSG_WAITALL;
1175 return PERL_constant_ISIV;
1177 return PERL_constant_NOTDEF;
1182 if (memEQ(name, "IPPROTO_TCP", 11)) {
1185 *iv_return = IPPROTO_TCP;
1186 return PERL_constant_ISIV;
1188 return PERL_constant_NOTDEF;
1193 return PERL_constant_NOTFOUND;
1197 constant_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. */
1207 if (memEQ(name, "MSG_NOSIGNAL", 12)) {
1210 *iv_return = MSG_NOSIGNAL;
1211 return PERL_constant_ISIV;
1213 return PERL_constant_NOTDEF;
1218 if (memEQ(name, "SO_REUSEADDR", 12)) {
1221 *iv_return = SO_REUSEADDR;
1222 return PERL_constant_ISIV;
1224 return PERL_constant_NOTDEF;
1229 if (memEQ(name, "MSG_CTLFLAGS", 12)) {
1232 *iv_return = MSG_CTLFLAGS;
1233 return PERL_constant_ISIV;
1235 return PERL_constant_NOTDEF;
1240 if (memEQ(name, "MSG_DONTWAIT", 12)) {
1243 *iv_return = MSG_DONTWAIT;
1244 return PERL_constant_ISIV;
1246 return PERL_constant_NOTDEF;
1251 if (memEQ(name, "AF_APPLETALK", 12)) {
1254 *iv_return = AF_APPLETALK;
1255 return PERL_constant_ISIV;
1257 return PERL_constant_NOTDEF;
1260 if (memEQ(name, "PF_APPLETALK", 12)) {
1263 *iv_return = PF_APPLETALK;
1264 return PERL_constant_ISIV;
1266 return PERL_constant_NOTDEF;
1271 if (memEQ(name, "SO_OOBINLINE", 12)) {
1274 *iv_return = SO_OOBINLINE;
1275 return PERL_constant_ISIV;
1277 return PERL_constant_NOTDEF;
1282 if (memEQ(name, "SO_REUSEPORT", 12)) {
1285 *iv_return = SO_REUSEPORT;
1286 return PERL_constant_ISIV;
1288 return PERL_constant_NOTDEF;
1293 if (memEQ(name, "SO_BROADCAST", 12)) {
1296 *iv_return = SO_BROADCAST;
1297 return PERL_constant_ISIV;
1299 return PERL_constant_NOTDEF;
1304 if (memEQ(name, "SO_DONTROUTE", 12)) {
1307 *iv_return = SO_DONTROUTE;
1308 return PERL_constant_ISIV;
1310 return PERL_constant_NOTDEF;
1315 if (memEQ(name, "MSG_ERRQUEUE", 12)) {
1318 *iv_return = MSG_ERRQUEUE;
1319 return PERL_constant_ISIV;
1321 return PERL_constant_NOTDEF;
1326 if (memEQ(name, "SO_KEEPALIVE", 12)) {
1329 *iv_return = SO_KEEPALIVE;
1330 return PERL_constant_ISIV;
1332 return PERL_constant_NOTDEF;
1337 return PERL_constant_NOTFOUND;
1341 constant_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. */
1350 if (memEQ(name, "MSG_MAXIOVLEN", 13)) {
1352 #ifdef MSG_MAXIOVLEN
1353 *iv_return = MSG_MAXIOVLEN;
1354 return PERL_constant_ISIV;
1356 return PERL_constant_NOTDEF;
1361 if (memEQ(name, "SO_ACCEPTCONN", 13)) {
1363 #ifdef SO_ACCEPTCONN
1364 *iv_return = SO_ACCEPTCONN;
1365 return PERL_constant_ISIV;
1367 return PERL_constant_NOTDEF;
1372 if (memEQ(name, "TCP_KEEPALIVE", 13)) {
1374 #ifdef TCP_KEEPALIVE
1375 *iv_return = TCP_KEEPALIVE;
1376 return PERL_constant_ISIV;
1378 return PERL_constant_NOTDEF;
1383 if (memEQ(name, "SCM_TIMESTAMP", 13)) {
1385 #ifdef SCM_TIMESTAMP
1386 *iv_return = SCM_TIMESTAMP;
1387 return PERL_constant_ISIV;
1389 return PERL_constant_NOTDEF;
1394 if (memEQ(name, "SO_DONTLINGER", 13)) {
1396 #ifdef SO_DONTLINGER
1397 *iv_return = SO_DONTLINGER;
1398 return PERL_constant_ISIV;
1400 return PERL_constant_NOTDEF;
1405 if (memEQ(name, "MSG_DONTROUTE", 13)) {
1407 #if defined(MSG_DONTROUTE) || defined(HAS_MSG_DONTROUTE) /* might be an enum */
1408 *iv_return = MSG_DONTROUTE;
1409 return PERL_constant_ISIV;
1411 return PERL_constant_NOTDEF;
1416 if (memEQ(name, "MSG_CTLIGNORE", 13)) {
1418 #ifdef MSG_CTLIGNORE
1419 *iv_return = MSG_CTLIGNORE;
1420 return PERL_constant_ISIV;
1422 return PERL_constant_NOTDEF;
1427 return PERL_constant_NOTFOUND;
1431 constant_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. */
1439 if (memEQ(name, "SO_USELOOPBACK", 14)) {
1441 #ifdef SO_USELOOPBACK
1442 *iv_return = SO_USELOOPBACK;
1443 return PERL_constant_ISIV;
1445 return PERL_constant_NOTDEF;
1450 if (memEQ(name, "SOCK_SEQPACKET", 14)) {
1452 #ifdef SOCK_SEQPACKET
1453 *iv_return = SOCK_SEQPACKET;
1454 return PERL_constant_ISIV;
1456 return PERL_constant_NOTDEF;
1461 return PERL_constant_NOTFOUND;
1465 constant (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.
1474 Regenerate these constant functions by feeding this entire source file to
1478 use ExtUtils::Constant qw (constant_types C_constant XS_constant);
1480 my $types = {IV => 1};
1481 my @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),
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"]},
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"]});
1509 print constant_types(); # macro defs
1510 foreach (C_constant ("Socket", 'constant', 'IV', $types, undef, undef, @names) ) {
1511 print $_, "\n"; # C constant subs
1513 print "#### XS Section:\n";
1514 print XS_constant ("Socket", $types);
1520 return constant_5 (name, iv_return);
1523 return constant_6 (name, iv_return);
1526 return constant_7 (name, iv_return);
1529 return constant_8 (name, iv_return);
1532 return constant_9 (name, iv_return);
1535 return constant_10 (name, iv_return);
1538 return constant_11 (name, iv_return);
1541 return constant_12 (name, iv_return);
1544 return constant_13 (name, iv_return);
1547 return constant_14 (name, iv_return);
1550 if (memEQ(name, "SCM_CREDENTIALS", 15)) {
1551 #ifdef SCM_CREDENTIALS
1552 *iv_return = SCM_CREDENTIALS;
1553 return PERL_constant_ISIV;
1555 return PERL_constant_NOTDEF;
1560 return PERL_constant_NOTFOUND;
1564 MODULE = Socket PACKAGE = Socket
1570 dXSTARG; /* Faster if we have it. */
1577 /* NV nv; Uncomment this if you need to return NVs */
1578 /* const char *pv; Uncomment this if you need to return PVs */
1581 const char * s = SvPV(sv, len);
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 */
1589 case PERL_constant_NOTFOUND:
1590 sv = sv_2mortal(newSVpvf("%s is not a valid Socket macro", s));
1593 case PERL_constant_NOTDEF:
1594 sv = sv_2mortal(newSVpvf(
1595 "Your vendor has not defined Socket macro %s, used", s));
1598 case PERL_constant_ISIV:
1600 PUSHs(&PL_sv_undef);
1603 /* Uncomment this if you need to return UVs
1604 case PERL_constant_ISUV:
1606 PUSHs(&PL_sv_undef);
1610 sv = sv_2mortal(newSVpvf(
1611 "Unexpected return type %d while processing Socket macro %s used",
1621 struct in_addr ip_address;
1622 struct hostent * phe;
1623 int ok = inet_aton(host, &ip_address);
1625 if (!ok && (phe = gethostbyname(host))) {
1626 Copy( phe->h_addr, &ip_address, phe->h_length, char );
1630 ST(0) = sv_newmortal();
1632 sv_setpvn( ST(0), (char *)&ip_address, sizeof ip_address );
1637 inet_ntoa(ip_address_sv)
1642 struct in_addr addr;
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));
1651 Copy( ip_address, &addr, sizeof addr, char );
1652 addr_str = inet_ntoa(addr);
1654 ST(0) = sv_2mortal(newSVpvn(addr_str, strlen(addr_str)));
1658 pack_sockaddr_un(pathname)
1663 struct sockaddr_un sun_ad; /* fear using sun */
1666 Zero( &sun_ad, sizeof sun_ad, char );
1667 sun_ad.sun_family = AF_UNIX;
1668 len = strlen(pathname);
1669 if (len > sizeof(sun_ad.sun_path))
1670 len = sizeof(sun_ad.sun_path);
1671 # ifdef OS2 /* Name should start with \socket\ and contain backslashes! */
1676 if (pathname[0] != '/' && pathname[0] != '\\')
1677 croak("Relative UNIX domain socket name '%s' unsupported", pathname);
1679 || pathname[7] != '/' && pathname[7] != '\\'
1680 || !strnicmp(pathname + 1, "socket", 6))
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 );
1687 s = sun_ad.sun_path + off - 1;
1693 # else /* !( defined OS2 ) */
1694 Copy( pathname, sun_ad.sun_path, len, char );
1696 ST(0) = sv_2mortal(newSVpvn((char *)&sun_ad, sizeof sun_ad));
1698 ST(0) = (SV *) not_here("pack_sockaddr_un");
1704 unpack_sockaddr_un(sun_sv)
1709 struct sockaddr_un addr;
1711 char * sun_ad = SvPV(sun_sv,sockaddrlen);
1714 /* On Linux sockaddrlen on sockets returned by accept, recvfrom,
1715 getpeername and getsockname is not equal to sizeof(addr). */
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));
1723 Copy( sun_ad, &addr, sizeof addr, char );
1725 if ( addr.sun_family != AF_UNIX ) {
1726 croak("Bad address family for %s, got %d, should be %d",
1727 "Socket::unpack_sockaddr_un",
1732 while (*e && e < addr.sun_path + sizeof addr.sun_path)
1734 ST(0) = sv_2mortal(newSVpvn(addr.sun_path, e - addr.sun_path));
1736 ST(0) = (SV *) not_here("unpack_sockaddr_un");
1741 pack_sockaddr_in(port,ip_address)
1746 struct sockaddr_in sin;
1748 Zero( &sin, sizeof sin, char );
1749 sin.sin_family = AF_INET;
1750 sin.sin_port = htons(port);
1751 Copy( ip_address, &sin.sin_addr, sizeof sin.sin_addr, char );
1753 ST(0) = sv_2mortal(newSVpvn((char *)&sin, sizeof sin));
1757 unpack_sockaddr_in(sin_sv)
1762 struct sockaddr_in addr;
1763 unsigned short port;
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));
1771 Copy( sin, &addr,sizeof addr, char );
1772 if ( addr.sin_family != AF_INET ) {
1773 croak("Bad address family for %s, got %d, should be %d",
1774 "Socket::unpack_sockaddr_in",
1778 port = ntohs(addr.sin_port);
1779 ip_address = addr.sin_addr;
1782 PUSHs(sv_2mortal(newSViv((IV) port)));
1783 PUSHs(sv_2mortal(newSVpvn((char *)&ip_address,sizeof ip_address)));
1790 struct in_addr ip_address;
1791 ip_address.s_addr = htonl(INADDR_ANY);
1792 ST(0) = sv_2mortal(newSVpvn((char *)&ip_address,sizeof ip_address ));
1799 struct in_addr ip_address;
1800 ip_address.s_addr = htonl(INADDR_LOOPBACK);
1801 ST(0) = sv_2mortal(newSVpvn((char *)&ip_address,sizeof ip_address));
1808 struct in_addr ip_address;
1809 ip_address.s_addr = htonl(INADDR_NONE);
1810 ST(0) = sv_2mortal(newSVpvn((char *)&ip_address,sizeof ip_address));
1817 struct in_addr ip_address;
1818 ip_address.s_addr = htonl(INADDR_BROADCAST);
1819 ST(0) = sv_2mortal(newSVpvn((char *)&ip_address,sizeof ip_address));