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_ISNO 4
181 #define PERL_constant_ISNV 5
182 #define PERL_constant_ISPV 6
183 #define PERL_constant_ISPVN 7
184 #define PERL_constant_ISSV 8
185 #define PERL_constant_ISUNDEF 9
186 #define PERL_constant_ISUV 10
187 #define PERL_constant_ISYES 11
190 constant_6 (pTHX_ const char *name, IV *iv_return, SV **sv_return) {
191 /* When generated this function returned values for the list of names given
192 here. However, subsequent manual editing may have added or removed some.
193 AF_802 AF_DLI AF_LAT AF_MAX AF_NBS AF_NIT AF_OSI AF_PUP AF_SNA AF_X25
194 PF_802 PF_DLI PF_LAT PF_MAX PF_NBS PF_NIT PF_OSI PF_PUP PF_SNA PF_X25 */
195 /* Offset 3 gives the best switch position. */
198 if (memEQ(name, "AF_802", 6)) {
202 return PERL_constant_ISIV;
204 return PERL_constant_NOTDEF;
207 if (memEQ(name, "PF_802", 6)) {
211 return PERL_constant_ISIV;
213 return PERL_constant_NOTDEF;
218 if (memEQ(name, "AF_DLI", 6)) {
222 return PERL_constant_ISIV;
224 return PERL_constant_NOTDEF;
227 if (memEQ(name, "PF_DLI", 6)) {
231 return PERL_constant_ISIV;
233 return PERL_constant_NOTDEF;
238 if (memEQ(name, "AF_LAT", 6)) {
242 return PERL_constant_ISIV;
244 return PERL_constant_NOTDEF;
247 if (memEQ(name, "PF_LAT", 6)) {
251 return PERL_constant_ISIV;
253 return PERL_constant_NOTDEF;
258 if (memEQ(name, "AF_MAX", 6)) {
262 return PERL_constant_ISIV;
264 return PERL_constant_NOTDEF;
267 if (memEQ(name, "PF_MAX", 6)) {
271 return PERL_constant_ISIV;
273 return PERL_constant_NOTDEF;
278 if (memEQ(name, "AF_NBS", 6)) {
282 return PERL_constant_ISIV;
284 return PERL_constant_NOTDEF;
287 if (memEQ(name, "AF_NIT", 6)) {
291 return PERL_constant_ISIV;
293 return PERL_constant_NOTDEF;
296 if (memEQ(name, "PF_NBS", 6)) {
300 return PERL_constant_ISIV;
302 return PERL_constant_NOTDEF;
305 if (memEQ(name, "PF_NIT", 6)) {
309 return PERL_constant_ISIV;
311 return PERL_constant_NOTDEF;
316 if (memEQ(name, "AF_OSI", 6)) {
320 return PERL_constant_ISIV;
322 return PERL_constant_NOTDEF;
325 if (memEQ(name, "PF_OSI", 6)) {
329 return PERL_constant_ISIV;
331 return PERL_constant_NOTDEF;
336 if (memEQ(name, "AF_PUP", 6)) {
340 return PERL_constant_ISIV;
342 return PERL_constant_NOTDEF;
345 if (memEQ(name, "PF_PUP", 6)) {
349 return PERL_constant_ISIV;
351 return PERL_constant_NOTDEF;
356 if (memEQ(name, "AF_SNA", 6)) {
360 return PERL_constant_ISIV;
362 return PERL_constant_NOTDEF;
365 if (memEQ(name, "PF_SNA", 6)) {
369 return PERL_constant_ISIV;
371 return PERL_constant_NOTDEF;
376 if (memEQ(name, "AF_X25", 6)) {
380 return PERL_constant_ISIV;
382 return PERL_constant_NOTDEF;
385 if (memEQ(name, "PF_X25", 6)) {
389 return PERL_constant_ISIV;
391 return PERL_constant_NOTDEF;
396 return PERL_constant_NOTFOUND;
400 constant_7 (pTHX_ const char *name, IV *iv_return, SV **sv_return) {
401 /* When generated this function returned values for the list of names given
402 here. However, subsequent manual editing may have added or removed some.
403 AF_ECMA AF_INET AF_UNIX IOV_MAX MSG_EOF MSG_EOR MSG_FIN MSG_OOB MSG_RST
404 MSG_SYN MSG_URG PF_ECMA PF_INET PF_UNIX SHUT_RD SHUT_WR SO_TYPE */
405 /* Offset 4 gives the best switch position. */
408 if (memEQ(name, "AF_ECMA", 7)) {
411 *iv_return = AF_ECMA;
412 return PERL_constant_ISIV;
414 return PERL_constant_NOTDEF;
417 if (memEQ(name, "PF_ECMA", 7)) {
420 *iv_return = PF_ECMA;
421 return PERL_constant_ISIV;
423 return PERL_constant_NOTDEF;
428 if (memEQ(name, "MSG_EOF", 7)) {
431 *iv_return = MSG_EOF;
432 return PERL_constant_ISIV;
434 return PERL_constant_NOTDEF;
437 if (memEQ(name, "MSG_EOR", 7)) {
440 *iv_return = MSG_EOR;
441 return PERL_constant_ISIV;
443 return PERL_constant_NOTDEF;
448 if (memEQ(name, "MSG_FIN", 7)) {
451 *iv_return = MSG_FIN;
452 return PERL_constant_ISIV;
454 return PERL_constant_NOTDEF;
459 if (memEQ(name, "IOV_MAX", 7)) {
462 *iv_return = IOV_MAX;
463 return PERL_constant_ISIV;
465 return PERL_constant_NOTDEF;
470 if (memEQ(name, "AF_INET", 7)) {
473 *iv_return = AF_INET;
474 return PERL_constant_ISIV;
476 return PERL_constant_NOTDEF;
479 if (memEQ(name, "AF_UNIX", 7)) {
482 *iv_return = AF_UNIX;
483 return PERL_constant_ISIV;
485 return PERL_constant_NOTDEF;
488 if (memEQ(name, "PF_INET", 7)) {
491 *iv_return = PF_INET;
492 return PERL_constant_ISIV;
494 return PERL_constant_NOTDEF;
497 if (memEQ(name, "PF_UNIX", 7)) {
500 *iv_return = PF_UNIX;
501 return PERL_constant_ISIV;
503 return PERL_constant_NOTDEF;
508 if (memEQ(name, "MSG_OOB", 7)) {
510 #if defined(MSG_OOB) || defined(HAS_MSG_OOB) /* might be an enum */
511 *iv_return = MSG_OOB;
512 return PERL_constant_ISIV;
514 return PERL_constant_NOTDEF;
519 if (memEQ(name, "MSG_RST", 7)) {
522 *iv_return = MSG_RST;
523 return PERL_constant_ISIV;
525 return PERL_constant_NOTDEF;
530 if (memEQ(name, "MSG_SYN", 7)) {
533 *iv_return = MSG_SYN;
534 return PERL_constant_ISIV;
536 return PERL_constant_NOTDEF;
541 if (memEQ(name, "MSG_URG", 7)) {
544 *iv_return = MSG_URG;
545 return PERL_constant_ISIV;
547 return PERL_constant_NOTDEF;
552 if (memEQ(name, "SO_TYPE", 7)) {
555 *iv_return = SO_TYPE;
556 return PERL_constant_ISIV;
558 return PERL_constant_NOTDEF;
563 if (memEQ(name, "SHUT_RD", 7)) {
566 *iv_return = SHUT_RD;
567 return PERL_constant_ISIV;
570 return PERL_constant_ISIV;
573 if (memEQ(name, "SHUT_WR", 7)) {
576 *iv_return = SHUT_WR;
577 return PERL_constant_ISIV;
580 return PERL_constant_ISIV;
585 return PERL_constant_NOTFOUND;
589 constant_8 (pTHX_ const char *name, IV *iv_return, SV **sv_return) {
590 /* When generated this function returned values for the list of names given
591 here. However, subsequent manual editing may have added or removed some.
592 AF_CCITT AF_CHAOS AF_GOSIP MSG_PEEK PF_CCITT PF_CHAOS PF_GOSIP SOCK_RAW
593 SOCK_RDM SO_DEBUG SO_ERROR */
594 /* Offset 7 gives the best switch position. */
597 if (memEQ(name, "SO_DEBUG", 8)) {
600 *iv_return = SO_DEBUG;
601 return PERL_constant_ISIV;
603 return PERL_constant_NOTDEF;
608 if (memEQ(name, "MSG_PEEK", 8)) {
610 #if defined(MSG_PEEK) || defined(HAS_MSG_PEEK) /* might be an enum */
611 *iv_return = MSG_PEEK;
612 return PERL_constant_ISIV;
614 return PERL_constant_NOTDEF;
619 if (memEQ(name, "SOCK_RDM", 8)) {
622 *iv_return = SOCK_RDM;
623 return PERL_constant_ISIV;
625 return PERL_constant_NOTDEF;
630 if (memEQ(name, "AF_GOSIP", 8)) {
633 *iv_return = AF_GOSIP;
634 return PERL_constant_ISIV;
636 return PERL_constant_NOTDEF;
639 if (memEQ(name, "PF_GOSIP", 8)) {
642 *iv_return = PF_GOSIP;
643 return PERL_constant_ISIV;
645 return PERL_constant_NOTDEF;
650 if (memEQ(name, "SO_ERROR", 8)) {
653 *iv_return = SO_ERROR;
654 return PERL_constant_ISIV;
656 return PERL_constant_NOTDEF;
661 if (memEQ(name, "AF_CHAOS", 8)) {
664 *iv_return = AF_CHAOS;
665 return PERL_constant_ISIV;
667 return PERL_constant_NOTDEF;
670 if (memEQ(name, "PF_CHAOS", 8)) {
673 *iv_return = PF_CHAOS;
674 return PERL_constant_ISIV;
676 return PERL_constant_NOTDEF;
681 if (memEQ(name, "AF_CCITT", 8)) {
684 *iv_return = AF_CCITT;
685 return PERL_constant_ISIV;
687 return PERL_constant_NOTDEF;
690 if (memEQ(name, "PF_CCITT", 8)) {
693 *iv_return = PF_CCITT;
694 return PERL_constant_ISIV;
696 return PERL_constant_NOTDEF;
701 if (memEQ(name, "SOCK_RAW", 8)) {
704 *iv_return = SOCK_RAW;
705 return PERL_constant_ISIV;
707 return PERL_constant_NOTDEF;
712 return PERL_constant_NOTFOUND;
716 constant_9 (pTHX_ const char *name, IV *iv_return, SV **sv_return) {
717 /* When generated this function returned values for the list of names given
718 here. However, subsequent manual editing may have added or removed some.
719 AF_DECnet AF_HYLINK AF_OSINET AF_UNSPEC MSG_BCAST MSG_MCAST MSG_PROXY
720 MSG_TRUNC PF_DECnet PF_HYLINK PF_OSINET PF_UNSPEC SCM_CREDS SHUT_RDWR
721 SOMAXCONN SO_LINGER SO_RCVBUF SO_SNDBUF TCP_MAXRT */
722 /* Offset 6 gives the best switch position. */
725 if (memEQ(name, "MSG_BCAST", 9)) {
728 *iv_return = MSG_BCAST;
729 return PERL_constant_ISIV;
731 return PERL_constant_NOTDEF;
734 if (memEQ(name, "MSG_MCAST", 9)) {
737 *iv_return = MSG_MCAST;
738 return PERL_constant_ISIV;
740 return PERL_constant_NOTDEF;
745 if (memEQ(name, "SO_RCVBUF", 9)) {
748 *iv_return = SO_RCVBUF;
749 return PERL_constant_ISIV;
751 return PERL_constant_NOTDEF;
754 if (memEQ(name, "SO_SNDBUF", 9)) {
757 *iv_return = SO_SNDBUF;
758 return PERL_constant_ISIV;
760 return PERL_constant_NOTDEF;
765 if (memEQ(name, "SHUT_RDWR", 9)) {
768 *iv_return = SHUT_RDWR;
769 return PERL_constant_ISIV;
772 return PERL_constant_ISIV;
777 if (memEQ(name, "SCM_CREDS", 9)) {
780 *iv_return = SCM_CREDS;
781 return PERL_constant_ISIV;
783 return PERL_constant_NOTDEF;
788 if (memEQ(name, "SO_LINGER", 9)) {
791 *iv_return = SO_LINGER;
792 return PERL_constant_ISIV;
794 return PERL_constant_NOTDEF;
799 if (memEQ(name, "AF_HYLINK", 9)) {
802 *iv_return = AF_HYLINK;
803 return PERL_constant_ISIV;
805 return PERL_constant_NOTDEF;
808 if (memEQ(name, "PF_HYLINK", 9)) {
811 *iv_return = PF_HYLINK;
812 return PERL_constant_ISIV;
814 return PERL_constant_NOTDEF;
819 if (memEQ(name, "AF_OSINET", 9)) {
822 *iv_return = AF_OSINET;
823 return PERL_constant_ISIV;
825 return PERL_constant_NOTDEF;
828 if (memEQ(name, "PF_OSINET", 9)) {
831 *iv_return = PF_OSINET;
832 return PERL_constant_ISIV;
834 return PERL_constant_NOTDEF;
839 if (memEQ(name, "MSG_PROXY", 9)) {
841 #if defined(MSG_PROXY) || defined(HAS_MSG_PROXY) /* might be an enum */
842 *iv_return = MSG_PROXY;
843 return PERL_constant_ISIV;
845 return PERL_constant_NOTDEF;
848 if (memEQ(name, "SOMAXCONN", 9)) {
851 *iv_return = SOMAXCONN;
852 return PERL_constant_ISIV;
854 return PERL_constant_NOTDEF;
859 if (memEQ(name, "AF_UNSPEC", 9)) {
862 *iv_return = AF_UNSPEC;
863 return PERL_constant_ISIV;
865 return PERL_constant_NOTDEF;
868 if (memEQ(name, "PF_UNSPEC", 9)) {
871 *iv_return = PF_UNSPEC;
872 return PERL_constant_ISIV;
874 return PERL_constant_NOTDEF;
879 if (memEQ(name, "MSG_TRUNC", 9)) {
882 *iv_return = MSG_TRUNC;
883 return PERL_constant_ISIV;
885 return PERL_constant_NOTDEF;
890 if (memEQ(name, "TCP_MAXRT", 9)) {
893 *iv_return = TCP_MAXRT;
894 return PERL_constant_ISIV;
896 return PERL_constant_NOTDEF;
901 if (memEQ(name, "AF_DECnet", 9)) {
904 *iv_return = AF_DECnet;
905 return PERL_constant_ISIV;
907 return PERL_constant_NOTDEF;
910 if (memEQ(name, "PF_DECnet", 9)) {
913 *iv_return = PF_DECnet;
914 return PERL_constant_ISIV;
916 return PERL_constant_NOTDEF;
921 return PERL_constant_NOTFOUND;
925 constant_10 (pTHX_ const char *name, IV *iv_return, SV **sv_return) {
926 /* When generated this function returned values for the list of names given
927 here. However, subsequent manual editing may have added or removed some.
928 AF_DATAKIT AF_IMPLINK INADDR_ANY MSG_CTRUNC PF_DATAKIT PF_IMPLINK
929 SCM_RIGHTS SOCK_DGRAM SOL_SOCKET TCP_MAXSEG TCP_STDURG UIO_MAXIOV */
930 /* Offset 6 gives the best switch position. */
933 if (memEQ(name, "AF_DATAKIT", 10)) {
936 *iv_return = AF_DATAKIT;
937 return PERL_constant_ISIV;
939 return PERL_constant_NOTDEF;
942 if (memEQ(name, "PF_DATAKIT", 10)) {
945 *iv_return = PF_DATAKIT;
946 return PERL_constant_ISIV;
948 return PERL_constant_NOTDEF;
953 if (memEQ(name, "SOL_SOCKET", 10)) {
956 *iv_return = SOL_SOCKET;
957 return PERL_constant_ISIV;
959 return PERL_constant_NOTDEF;
964 if (memEQ(name, "TCP_STDURG", 10)) {
967 *iv_return = TCP_STDURG;
968 return PERL_constant_ISIV;
970 return PERL_constant_NOTDEF;
975 if (memEQ(name, "SCM_RIGHTS", 10)) {
977 #if defined(SCM_RIGHTS) || defined(HAS_SCM_RIGHTS) /* might be an enum */
978 *iv_return = SCM_RIGHTS;
979 return PERL_constant_ISIV;
981 return PERL_constant_NOTDEF;
984 if (memEQ(name, "SOCK_DGRAM", 10)) {
987 *iv_return = SOCK_DGRAM;
988 return PERL_constant_ISIV;
990 return PERL_constant_NOTDEF;
995 if (memEQ(name, "AF_IMPLINK", 10)) {
998 *iv_return = AF_IMPLINK;
999 return PERL_constant_ISIV;
1001 return PERL_constant_NOTDEF;
1004 if (memEQ(name, "PF_IMPLINK", 10)) {
1007 *iv_return = PF_IMPLINK;
1008 return PERL_constant_ISIV;
1010 return PERL_constant_NOTDEF;
1015 if (memEQ(name, "MSG_CTRUNC", 10)) {
1017 #if defined(MSG_CTRUNC) || defined(HAS_MSG_CTRUNC) /* might be an enum */
1018 *iv_return = MSG_CTRUNC;
1019 return PERL_constant_ISIV;
1021 return PERL_constant_NOTDEF;
1026 if (memEQ(name, "TCP_MAXSEG", 10)) {
1029 *iv_return = TCP_MAXSEG;
1030 return PERL_constant_ISIV;
1032 return PERL_constant_NOTDEF;
1035 if (memEQ(name, "UIO_MAXIOV", 10)) {
1038 *iv_return = UIO_MAXIOV;
1039 return PERL_constant_ISIV;
1041 return PERL_constant_NOTDEF;
1046 if (memEQ(name, "INADDR_ANY", 10)) {
1050 struct in_addr ip_address; ip_address.s_addr = htonl(INADDR_ANY);
1051 *sv_return = sv_2mortal(newSVpvn((char *)&ip_address,sizeof ip_address ));
1052 return PERL_constant_ISSV;
1055 return PERL_constant_NOTDEF;
1060 return PERL_constant_NOTFOUND;
1064 constant_11 (pTHX_ const char *name, IV *iv_return, SV **sv_return) {
1065 /* When generated this function returned values for the list of names given
1066 here. However, subsequent manual editing may have added or removed some.
1067 INADDR_NONE IPPROTO_TCP MSG_WAITALL SCM_CONNECT SOCK_STREAM SO_RCVLOWAT
1068 SO_RCVTIMEO SO_SNDLOWAT SO_SNDTIMEO TCP_NODELAY */
1069 /* Offset 5 gives the best switch position. */
1072 if (memEQ(name, "MSG_WAITALL", 11)) {
1075 *iv_return = MSG_WAITALL;
1076 return PERL_constant_ISIV;
1078 return PERL_constant_NOTDEF;
1083 if (memEQ(name, "SO_SNDLOWAT", 11)) {
1086 *iv_return = SO_SNDLOWAT;
1087 return PERL_constant_ISIV;
1089 return PERL_constant_NOTDEF;
1092 if (memEQ(name, "SO_SNDTIMEO", 11)) {
1095 *iv_return = SO_SNDTIMEO;
1096 return PERL_constant_ISIV;
1098 return PERL_constant_NOTDEF;
1103 if (memEQ(name, "SCM_CONNECT", 11)) {
1106 *iv_return = SCM_CONNECT;
1107 return PERL_constant_ISIV;
1109 return PERL_constant_NOTDEF;
1112 if (memEQ(name, "TCP_NODELAY", 11)) {
1115 *iv_return = TCP_NODELAY;
1116 return PERL_constant_ISIV;
1118 return PERL_constant_NOTDEF;
1123 if (memEQ(name, "INADDR_NONE", 11)) {
1127 struct in_addr ip_address; ip_address.s_addr = htonl(INADDR_NONE);
1128 *sv_return = sv_2mortal(newSVpvn((char *)&ip_address,sizeof ip_address ));
1129 return PERL_constant_ISSV;
1132 return PERL_constant_NOTDEF;
1137 if (memEQ(name, "SOCK_STREAM", 11)) {
1140 *iv_return = SOCK_STREAM;
1141 return PERL_constant_ISIV;
1143 return PERL_constant_NOTDEF;
1148 if (memEQ(name, "IPPROTO_TCP", 11)) {
1151 *iv_return = IPPROTO_TCP;
1152 return PERL_constant_ISIV;
1154 return PERL_constant_NOTDEF;
1159 if (memEQ(name, "SO_RCVLOWAT", 11)) {
1162 *iv_return = SO_RCVLOWAT;
1163 return PERL_constant_ISIV;
1165 return PERL_constant_NOTDEF;
1168 if (memEQ(name, "SO_RCVTIMEO", 11)) {
1171 *iv_return = SO_RCVTIMEO;
1172 return PERL_constant_ISIV;
1174 return PERL_constant_NOTDEF;
1179 return PERL_constant_NOTFOUND;
1183 constant_12 (pTHX_ const char *name, IV *iv_return, SV **sv_return) {
1184 /* When generated this function returned values for the list of names given
1185 here. However, subsequent manual editing may have added or removed some.
1186 AF_APPLETALK MSG_CTLFLAGS MSG_DONTWAIT MSG_ERRQUEUE MSG_NOSIGNAL
1187 PF_APPLETALK SO_BROADCAST SO_DONTROUTE SO_KEEPALIVE SO_OOBINLINE
1188 SO_REUSEADDR SO_REUSEPORT */
1189 /* Offset 10 gives the best switch position. */
1192 if (memEQ(name, "MSG_NOSIGNAL", 12)) {
1195 *iv_return = MSG_NOSIGNAL;
1196 return PERL_constant_ISIV;
1198 return PERL_constant_NOTDEF;
1203 if (memEQ(name, "SO_REUSEADDR", 12)) {
1206 *iv_return = SO_REUSEADDR;
1207 return PERL_constant_ISIV;
1209 return PERL_constant_NOTDEF;
1214 if (memEQ(name, "MSG_CTLFLAGS", 12)) {
1217 *iv_return = MSG_CTLFLAGS;
1218 return PERL_constant_ISIV;
1220 return PERL_constant_NOTDEF;
1225 if (memEQ(name, "MSG_DONTWAIT", 12)) {
1228 *iv_return = MSG_DONTWAIT;
1229 return PERL_constant_ISIV;
1231 return PERL_constant_NOTDEF;
1236 if (memEQ(name, "AF_APPLETALK", 12)) {
1239 *iv_return = AF_APPLETALK;
1240 return PERL_constant_ISIV;
1242 return PERL_constant_NOTDEF;
1245 if (memEQ(name, "PF_APPLETALK", 12)) {
1248 *iv_return = PF_APPLETALK;
1249 return PERL_constant_ISIV;
1251 return PERL_constant_NOTDEF;
1256 if (memEQ(name, "SO_OOBINLINE", 12)) {
1259 *iv_return = SO_OOBINLINE;
1260 return PERL_constant_ISIV;
1262 return PERL_constant_NOTDEF;
1267 if (memEQ(name, "SO_REUSEPORT", 12)) {
1270 *iv_return = SO_REUSEPORT;
1271 return PERL_constant_ISIV;
1273 return PERL_constant_NOTDEF;
1278 if (memEQ(name, "SO_BROADCAST", 12)) {
1281 *iv_return = SO_BROADCAST;
1282 return PERL_constant_ISIV;
1284 return PERL_constant_NOTDEF;
1289 if (memEQ(name, "SO_DONTROUTE", 12)) {
1292 *iv_return = SO_DONTROUTE;
1293 return PERL_constant_ISIV;
1295 return PERL_constant_NOTDEF;
1300 if (memEQ(name, "MSG_ERRQUEUE", 12)) {
1303 *iv_return = MSG_ERRQUEUE;
1304 return PERL_constant_ISIV;
1306 return PERL_constant_NOTDEF;
1311 if (memEQ(name, "SO_KEEPALIVE", 12)) {
1314 *iv_return = SO_KEEPALIVE;
1315 return PERL_constant_ISIV;
1317 return PERL_constant_NOTDEF;
1322 return PERL_constant_NOTFOUND;
1326 constant_13 (pTHX_ const char *name, IV *iv_return, SV **sv_return) {
1327 /* When generated this function returned values for the list of names given
1328 here. However, subsequent manual editing may have added or removed some.
1329 MSG_CTLIGNORE MSG_DONTROUTE MSG_MAXIOVLEN SCM_TIMESTAMP SO_ACCEPTCONN
1330 SO_DONTLINGER TCP_KEEPALIVE */
1331 /* Offset 5 gives the best switch position. */
1334 if (memEQ(name, "MSG_MAXIOVLEN", 13)) {
1336 #ifdef MSG_MAXIOVLEN
1337 *iv_return = MSG_MAXIOVLEN;
1338 return PERL_constant_ISIV;
1340 return PERL_constant_NOTDEF;
1345 if (memEQ(name, "SO_ACCEPTCONN", 13)) {
1347 #ifdef SO_ACCEPTCONN
1348 *iv_return = SO_ACCEPTCONN;
1349 return PERL_constant_ISIV;
1351 return PERL_constant_NOTDEF;
1356 if (memEQ(name, "TCP_KEEPALIVE", 13)) {
1358 #ifdef TCP_KEEPALIVE
1359 *iv_return = TCP_KEEPALIVE;
1360 return PERL_constant_ISIV;
1362 return PERL_constant_NOTDEF;
1367 if (memEQ(name, "SCM_TIMESTAMP", 13)) {
1369 #ifdef SCM_TIMESTAMP
1370 *iv_return = SCM_TIMESTAMP;
1371 return PERL_constant_ISIV;
1373 return PERL_constant_NOTDEF;
1378 if (memEQ(name, "SO_DONTLINGER", 13)) {
1380 #ifdef SO_DONTLINGER
1381 *iv_return = SO_DONTLINGER;
1382 return PERL_constant_ISIV;
1384 return PERL_constant_NOTDEF;
1389 if (memEQ(name, "MSG_DONTROUTE", 13)) {
1391 #if defined(MSG_DONTROUTE) || defined(HAS_MSG_DONTROUTE) /* might be an enum */
1392 *iv_return = MSG_DONTROUTE;
1393 return PERL_constant_ISIV;
1395 return PERL_constant_NOTDEF;
1400 if (memEQ(name, "MSG_CTLIGNORE", 13)) {
1402 #ifdef MSG_CTLIGNORE
1403 *iv_return = MSG_CTLIGNORE;
1404 return PERL_constant_ISIV;
1406 return PERL_constant_NOTDEF;
1411 return PERL_constant_NOTFOUND;
1415 constant (pTHX_ const char *name, STRLEN len, IV *iv_return, SV **sv_return) {
1416 /* Initially switch on the length of the name. */
1417 /* When generated this function returned values for the list of names given
1418 in this section of perl code. Rather than manually editing these functions
1419 to add or remove constants, which would result in this comment and section
1420 of code becoming inaccurate, we recommend that you edit this section of
1421 code, and use it to regenerate a new set of constant functions which you
1422 then use to replace the originals.
1424 Regenerate these constant functions by feeding this entire source file to
1428 use ExtUtils::Constant qw (constant_types C_constant XS_constant);
1430 my $types = {map {($_, 1)} qw(IV SV)};
1431 my @names = (qw(AF_802 AF_APPLETALK AF_CCITT AF_CHAOS AF_DATAKIT AF_DECnet
1432 AF_DLI AF_ECMA AF_GOSIP AF_HYLINK AF_IMPLINK AF_INET AF_LAT
1433 AF_MAX AF_NBS AF_NIT AF_NS AF_OSI AF_OSINET AF_PUP AF_SNA
1434 AF_UNIX AF_UNSPEC AF_X25 IOV_MAX IPPROTO_TCP MSG_BCAST
1435 MSG_CTLFLAGS MSG_CTLIGNORE MSG_DONTWAIT MSG_EOF MSG_EOR
1436 MSG_ERRQUEUE MSG_FIN MSG_MAXIOVLEN MSG_MCAST MSG_NOSIGNAL
1437 MSG_RST MSG_SYN MSG_TRUNC MSG_URG MSG_WAITALL PF_802
1438 PF_APPLETALK PF_CCITT PF_CHAOS PF_DATAKIT PF_DECnet PF_DLI
1439 PF_ECMA PF_GOSIP PF_HYLINK PF_IMPLINK PF_INET PF_LAT PF_MAX
1440 PF_NBS PF_NIT PF_NS PF_OSI PF_OSINET PF_PUP PF_SNA PF_UNIX
1441 PF_UNSPEC PF_X25 SCM_CONNECT SCM_CREDENTIALS SCM_CREDS
1442 SCM_TIMESTAMP SOCK_DGRAM SOCK_RAW SOCK_RDM SOCK_SEQPACKET
1443 SOCK_STREAM SOL_SOCKET SOMAXCONN SO_ACCEPTCONN SO_BROADCAST
1444 SO_DEBUG SO_DONTLINGER SO_DONTROUTE SO_ERROR SO_KEEPALIVE
1445 SO_LINGER SO_OOBINLINE SO_RCVBUF SO_RCVLOWAT SO_RCVTIMEO
1446 SO_REUSEADDR SO_REUSEPORT SO_SNDBUF SO_SNDLOWAT SO_SNDTIMEO
1447 SO_TYPE SO_USELOOPBACK TCP_KEEPALIVE TCP_MAXRT TCP_MAXSEG
1448 TCP_NODELAY TCP_STDURG UIO_MAXIOV),
1449 {name=>"INADDR_ANY", type=>"SV", value=>"sv_2mortal(newSVpvn((char *)&ip_address,sizeof ip_address ))", pre=>"struct in_addr ip_address; ip_address.s_addr = htonl(INADDR_ANY);"},
1450 {name=>"INADDR_BROADCAST", type=>"SV", value=>"sv_2mortal(newSVpvn((char *)&ip_address,sizeof ip_address ))", pre=>"struct in_addr ip_address; ip_address.s_addr = htonl(INADDR_BROADCAST);"},
1451 {name=>"INADDR_LOOPBACK", type=>"SV", value=>"sv_2mortal(newSVpvn((char *)&ip_address,sizeof ip_address ))", pre=>"struct in_addr ip_address; ip_address.s_addr = htonl(INADDR_LOOPBACK);"},
1452 {name=>"INADDR_NONE", type=>"SV", value=>"sv_2mortal(newSVpvn((char *)&ip_address,sizeof ip_address ))", pre=>"struct in_addr ip_address; ip_address.s_addr = htonl(INADDR_NONE);"},
1453 {name=>"MSG_CTRUNC", type=>"IV", macro=>["#if defined(MSG_CTRUNC) || defined(HAS_MSG_CTRUNC) /" . "* might be an enum *" . "/\n", "#endif\n"]},
1454 {name=>"MSG_DONTROUTE", type=>"IV", macro=>["#if defined(MSG_DONTROUTE) || defined(HAS_MSG_DONTROUTE) /" . "* might be an enum *" . "/\n", "#endif\n"]},
1455 {name=>"MSG_OOB", type=>"IV", macro=>["#if defined(MSG_OOB) || defined(HAS_MSG_OOB) /" . "* might be an enum *" . "/\n", "#endif\n"]},
1456 {name=>"MSG_PEEK", type=>"IV", macro=>["#if defined(MSG_PEEK) || defined(HAS_MSG_PEEK) /" . "* might be an enum *" . "/\n", "#endif\n"]},
1457 {name=>"MSG_PROXY", type=>"IV", macro=>["#if defined(MSG_PROXY) || defined(HAS_MSG_PROXY) /" . "* might be an enum *" . "/\n", "#endif\n"]},
1458 {name=>"SCM_RIGHTS", type=>"IV", macro=>["#if defined(SCM_RIGHTS) || defined(HAS_SCM_RIGHTS) /" . "* might be an enum *" . "/\n", "#endif\n"]},
1459 {name=>"SHUT_RD", type=>"IV", default=>["IV", "0"]},
1460 {name=>"SHUT_RDWR", type=>"IV", default=>["IV", "2"]},
1461 {name=>"SHUT_WR", type=>"IV", default=>["IV", "1"]});
1463 print constant_types(); # macro defs
1464 foreach (C_constant ("Socket", 'constant', 'IV', $types, undef, 3, @names) ) {
1465 print $_, "\n"; # C constant subs
1467 print "#### XS Section:\n";
1468 print XS_constant ("Socket", $types);
1474 /* Names all of length 5. */
1476 /* Offset 0 gives the best switch position. */
1479 if (memEQ(name, "AF_NS", 5)) {
1483 return PERL_constant_ISIV;
1485 return PERL_constant_NOTDEF;
1490 if (memEQ(name, "PF_NS", 5)) {
1494 return PERL_constant_ISIV;
1496 return PERL_constant_NOTDEF;
1503 return constant_6 (aTHX_ name, iv_return, sv_return);
1506 return constant_7 (aTHX_ name, iv_return, sv_return);
1509 return constant_8 (aTHX_ name, iv_return, sv_return);
1512 return constant_9 (aTHX_ name, iv_return, sv_return);
1515 return constant_10 (aTHX_ name, iv_return, sv_return);
1518 return constant_11 (aTHX_ name, iv_return, sv_return);
1521 return constant_12 (aTHX_ name, iv_return, sv_return);
1524 return constant_13 (aTHX_ name, iv_return, sv_return);
1527 /* Names all of length 14. */
1528 /* SOCK_SEQPACKET SO_USELOOPBACK */
1529 /* Offset 8 gives the best switch position. */
1532 if (memEQ(name, "SO_USELOOPBACK", 14)) {
1534 #ifdef SO_USELOOPBACK
1535 *iv_return = SO_USELOOPBACK;
1536 return PERL_constant_ISIV;
1538 return PERL_constant_NOTDEF;
1543 if (memEQ(name, "SOCK_SEQPACKET", 14)) {
1545 #ifdef SOCK_SEQPACKET
1546 *iv_return = SOCK_SEQPACKET;
1547 return PERL_constant_ISIV;
1549 return PERL_constant_NOTDEF;
1556 /* Names all of length 15. */
1557 /* INADDR_LOOPBACK SCM_CREDENTIALS */
1558 /* Offset 4 gives the best switch position. */
1561 if (memEQ(name, "SCM_CREDENTIALS", 15)) {
1563 #ifdef SCM_CREDENTIALS
1564 *iv_return = SCM_CREDENTIALS;
1565 return PERL_constant_ISIV;
1567 return PERL_constant_NOTDEF;
1572 if (memEQ(name, "INADDR_LOOPBACK", 15)) {
1574 #ifdef INADDR_LOOPBACK
1576 struct in_addr ip_address; ip_address.s_addr = htonl(INADDR_LOOPBACK);
1577 *sv_return = sv_2mortal(newSVpvn((char *)&ip_address,sizeof ip_address ));
1578 return PERL_constant_ISSV;
1581 return PERL_constant_NOTDEF;
1588 if (memEQ(name, "INADDR_BROADCAST", 16)) {
1589 #ifdef INADDR_BROADCAST
1591 struct in_addr ip_address; ip_address.s_addr = htonl(INADDR_BROADCAST);
1592 *sv_return = sv_2mortal(newSVpvn((char *)&ip_address,sizeof ip_address ));
1593 return PERL_constant_ISSV;
1596 return PERL_constant_NOTDEF;
1601 return PERL_constant_NOTFOUND;
1605 MODULE = Socket PACKAGE = Socket
1614 /* NV nv; Uncomment this if you need to return NVs */
1615 /* const char *pv; Uncomment this if you need to return PVs */
1618 const char * s = SvPV(sv, len);
1620 /* Change this to constant(s, len, &iv, &nv);
1621 if you need to return both NVs and IVs */
1622 type = constant(aTHX_ s, len, &iv, &sv);
1623 /* Return 1 or 2 items. First is error message, or undef if no error.
1624 Second, if present, is found value */
1626 case PERL_constant_NOTFOUND:
1627 sv = sv_2mortal(newSVpvf("%s is not a valid Socket macro", s));
1630 case PERL_constant_NOTDEF:
1631 sv = sv_2mortal(newSVpvf(
1632 "Your vendor has not defined Socket macro %s, used", s));
1635 case PERL_constant_ISIV:
1637 PUSHs(&PL_sv_undef);
1640 case PERL_constant_ISSV:
1642 PUSHs(&PL_sv_undef);
1645 /* Uncomment this if you need to return UVs
1646 case PERL_constant_ISUV:
1648 PUSHs(&PL_sv_undef);
1652 sv = sv_2mortal(newSVpvf(
1653 "Unexpected return type %d while processing Socket macro %s, used",
1663 struct in_addr ip_address;
1664 struct hostent * phe;
1665 int ok = inet_aton(host, &ip_address);
1667 if (!ok && (phe = gethostbyname(host))) {
1668 Copy( phe->h_addr, &ip_address, phe->h_length, char );
1672 ST(0) = sv_newmortal();
1674 sv_setpvn( ST(0), (char *)&ip_address, sizeof ip_address );
1679 inet_ntoa(ip_address_sv)
1684 struct in_addr addr;
1686 char * ip_address = SvPV(ip_address_sv,addrlen);
1687 if (addrlen != sizeof(addr)) {
1688 croak("Bad arg length for %s, length is %d, should be %d",
1689 "Socket::inet_ntoa",
1690 addrlen, sizeof(addr));
1693 Copy( ip_address, &addr, sizeof addr, char );
1694 addr_str = inet_ntoa(addr);
1696 ST(0) = sv_2mortal(newSVpvn(addr_str, strlen(addr_str)));
1700 pack_sockaddr_un(pathname)
1705 struct sockaddr_un sun_ad; /* fear using sun */
1708 Zero( &sun_ad, sizeof sun_ad, char );
1709 sun_ad.sun_family = AF_UNIX;
1710 len = strlen(pathname);
1711 if (len > sizeof(sun_ad.sun_path))
1712 len = sizeof(sun_ad.sun_path);
1713 # ifdef OS2 /* Name should start with \socket\ and contain backslashes! */
1718 if (pathname[0] != '/' && pathname[0] != '\\')
1719 croak("Relative UNIX domain socket name '%s' unsupported", pathname);
1721 || pathname[7] != '/' && pathname[7] != '\\'
1722 || !strnicmp(pathname + 1, "socket", 6))
1725 off = 0; /* Preserve names starting with \socket\ */
1726 Copy( "\\socket", sun_ad.sun_path, off, char);
1727 Copy( pathname, sun_ad.sun_path + off, len, char );
1729 s = sun_ad.sun_path + off - 1;
1735 # else /* !( defined OS2 ) */
1736 Copy( pathname, sun_ad.sun_path, len, char );
1738 if (0) not_here("dummy");
1739 ST(0) = sv_2mortal(newSVpvn((char *)&sun_ad, sizeof sun_ad));
1741 ST(0) = (SV *) not_here("pack_sockaddr_un");
1747 unpack_sockaddr_un(sun_sv)
1752 struct sockaddr_un addr;
1754 char * sun_ad = SvPV(sun_sv,sockaddrlen);
1757 /* On Linux sockaddrlen on sockets returned by accept, recvfrom,
1758 getpeername and getsockname is not equal to sizeof(addr). */
1759 if (sockaddrlen != sizeof(addr)) {
1760 croak("Bad arg length for %s, length is %d, should be %d",
1761 "Socket::unpack_sockaddr_un",
1762 sockaddrlen, sizeof(addr));
1766 Copy( sun_ad, &addr, sizeof addr, char );
1768 if ( addr.sun_family != AF_UNIX ) {
1769 croak("Bad address family for %s, got %d, should be %d",
1770 "Socket::unpack_sockaddr_un",
1775 while (*e && e < addr.sun_path + sizeof addr.sun_path)
1777 ST(0) = sv_2mortal(newSVpvn(addr.sun_path, e - addr.sun_path));
1779 ST(0) = (SV *) not_here("unpack_sockaddr_un");
1784 pack_sockaddr_in(port,ip_address)
1789 struct sockaddr_in sin;
1791 Zero( &sin, sizeof sin, char );
1792 sin.sin_family = AF_INET;
1793 sin.sin_port = htons(port);
1794 Copy( ip_address, &sin.sin_addr, sizeof sin.sin_addr, char );
1796 ST(0) = sv_2mortal(newSVpvn((char *)&sin, sizeof sin));
1800 unpack_sockaddr_in(sin_sv)
1805 struct sockaddr_in addr;
1806 unsigned short port;
1807 struct in_addr ip_address;
1808 char * sin = SvPV(sin_sv,sockaddrlen);
1809 if (sockaddrlen != sizeof(addr)) {
1810 croak("Bad arg length for %s, length is %d, should be %d",
1811 "Socket::unpack_sockaddr_in",
1812 sockaddrlen, sizeof(addr));
1814 Copy( sin, &addr,sizeof addr, char );
1815 if ( addr.sin_family != AF_INET ) {
1816 croak("Bad address family for %s, got %d, should be %d",
1817 "Socket::unpack_sockaddr_in",
1821 port = ntohs(addr.sin_port);
1822 ip_address = addr.sin_addr;
1825 PUSHs(sv_2mortal(newSViv((IV) port)));
1826 PUSHs(sv_2mortal(newSVpvn((char *)&ip_address,sizeof ip_address)));