[win32] merge change#896 from maintbranch
[p5sagit/p5-mst-13.2.git] / ext / Socket / Socket.xs
1 #include "EXTERN.h"
2 #include "perl.h"
3 #include "XSUB.h"
4
5 #ifndef VMS
6 # ifdef I_SYS_TYPES
7 #  include <sys/types.h>
8 # endif
9 #include <sys/socket.h>
10 #ifdef I_SYS_UN
11 #include <sys/un.h>
12 #endif
13 # ifdef I_NETINET_IN
14 #  include <netinet/in.h>
15 # endif
16 #include <netdb.h>
17 #include <arpa/inet.h>
18 #else
19 #include "sockadapt.h"
20 #endif
21
22 #ifndef AF_NBS
23 #undef PF_NBS
24 #endif
25
26 #ifndef AF_X25
27 #undef PF_X25
28 #endif
29
30 #ifndef INADDR_NONE
31 #define INADDR_NONE     0xffffffff
32 #endif /* INADDR_NONE */
33 #ifndef INADDR_BROADCAST
34 #define INADDR_BROADCAST        0xffffffff
35 #endif /* INADDR_BROADCAST */
36 #ifndef INADDR_LOOPBACK
37 #define INADDR_LOOPBACK         0x7F000001
38 #endif /* INADDR_LOOPBACK */
39
40 #ifndef HAS_INET_ATON
41
42 /* 
43  * Check whether "cp" is a valid ascii representation
44  * of an Internet address and convert to a binary address.
45  * Returns 1 if the address is valid, 0 if not.
46  * This replaces inet_addr, the return value from which
47  * cannot distinguish between failure and a local broadcast address.
48  */
49 static int
50 my_inet_aton(register const char *cp, struct in_addr *addr)
51 {
52         register U32 val;
53         register int base;
54         register char c;
55         int nparts;
56         const char *s;
57         unsigned int parts[4];
58         register unsigned int *pp = parts;
59
60         if (!cp)
61                 return 0;
62         for (;;) {
63                 /*
64                  * Collect number up to ``.''.
65                  * Values are specified as for C:
66                  * 0x=hex, 0=octal, other=decimal.
67                  */
68                 val = 0; base = 10;
69                 if (*cp == '0') {
70                         if (*++cp == 'x' || *cp == 'X')
71                                 base = 16, cp++;
72                         else
73                                 base = 8;
74                 }
75                 while ((c = *cp) != '\0') {
76                         if (isDIGIT(c)) {
77                                 val = (val * base) + (c - '0');
78                                 cp++;
79                                 continue;
80                         }
81                         if (base == 16 && (s=strchr(hexdigit,c))) {
82                                 val = (val << 4) + 
83                                         ((s - hexdigit) & 15);
84                                 cp++;
85                                 continue;
86                         }
87                         break;
88                 }
89                 if (*cp == '.') {
90                         /*
91                          * Internet format:
92                          *      a.b.c.d
93                          *      a.b.c   (with c treated as 16-bits)
94                          *      a.b     (with b treated as 24 bits)
95                          */
96                         if (pp >= parts + 3 || val > 0xff)
97                                 return 0;
98                         *pp++ = val, cp++;
99                 } else
100                         break;
101         }
102         /*
103          * Check for trailing characters.
104          */
105         if (*cp && !isSPACE(*cp))
106                 return 0;
107         /*
108          * Concoct the address according to
109          * the number of parts specified.
110          */
111         nparts = pp - parts + 1;        /* force to an int for switch() */
112         switch (nparts) {
113
114         case 1:                         /* a -- 32 bits */
115                 break;
116
117         case 2:                         /* a.b -- 8.24 bits */
118                 if (val > 0xffffff)
119                         return 0;
120                 val |= parts[0] << 24;
121                 break;
122
123         case 3:                         /* a.b.c -- 8.8.16 bits */
124                 if (val > 0xffff)
125                         return 0;
126                 val |= (parts[0] << 24) | (parts[1] << 16);
127                 break;
128
129         case 4:                         /* a.b.c.d -- 8.8.8.8 bits */
130                 if (val > 0xff)
131                         return 0;
132                 val |= (parts[0] << 24) | (parts[1] << 16) | (parts[2] << 8);
133                 break;
134         }
135         addr->s_addr = htonl(val);
136         return 1;
137 }
138
139 #undef inet_aton
140 #define inet_aton my_inet_aton
141
142 #endif /* ! HAS_INET_ATON */
143
144
145 static int
146 not_here(char *s)
147 {
148     croak("Socket::%s not implemented on this architecture", s);
149     return -1;
150 }
151
152 static double
153 constant(char *name, int arg)
154 {
155     errno = 0;
156     switch (*name) {
157     case 'A':
158         if (strEQ(name, "AF_802"))
159 #ifdef AF_802
160             return AF_802;
161 #else
162             goto not_there;
163 #endif
164         if (strEQ(name, "AF_APPLETALK"))
165 #ifdef AF_APPLETALK
166             return AF_APPLETALK;
167 #else
168             goto not_there;
169 #endif
170         if (strEQ(name, "AF_CCITT"))
171 #ifdef AF_CCITT
172             return AF_CCITT;
173 #else
174             goto not_there;
175 #endif
176         if (strEQ(name, "AF_CHAOS"))
177 #ifdef AF_CHAOS
178             return AF_CHAOS;
179 #else
180             goto not_there;
181 #endif
182         if (strEQ(name, "AF_DATAKIT"))
183 #ifdef AF_DATAKIT
184             return AF_DATAKIT;
185 #else
186             goto not_there;
187 #endif
188         if (strEQ(name, "AF_DECnet"))
189 #ifdef AF_DECnet
190             return AF_DECnet;
191 #else
192             goto not_there;
193 #endif
194         if (strEQ(name, "AF_DLI"))
195 #ifdef AF_DLI
196             return AF_DLI;
197 #else
198             goto not_there;
199 #endif
200         if (strEQ(name, "AF_ECMA"))
201 #ifdef AF_ECMA
202             return AF_ECMA;
203 #else
204             goto not_there;
205 #endif
206         if (strEQ(name, "AF_GOSIP"))
207 #ifdef AF_GOSIP
208             return AF_GOSIP;
209 #else
210             goto not_there;
211 #endif
212         if (strEQ(name, "AF_HYLINK"))
213 #ifdef AF_HYLINK
214             return AF_HYLINK;
215 #else
216             goto not_there;
217 #endif
218         if (strEQ(name, "AF_IMPLINK"))
219 #ifdef AF_IMPLINK
220             return AF_IMPLINK;
221 #else
222             goto not_there;
223 #endif
224         if (strEQ(name, "AF_INET"))
225 #ifdef AF_INET
226             return AF_INET;
227 #else
228             goto not_there;
229 #endif
230         if (strEQ(name, "AF_LAT"))
231 #ifdef AF_LAT
232             return AF_LAT;
233 #else
234             goto not_there;
235 #endif
236         if (strEQ(name, "AF_MAX"))
237 #ifdef AF_MAX
238             return AF_MAX;
239 #else
240             goto not_there;
241 #endif
242         if (strEQ(name, "AF_NBS"))
243 #ifdef AF_NBS
244             return AF_NBS;
245 #else
246             goto not_there;
247 #endif
248         if (strEQ(name, "AF_NIT"))
249 #ifdef AF_NIT
250             return AF_NIT;
251 #else
252             goto not_there;
253 #endif
254         if (strEQ(name, "AF_NS"))
255 #ifdef AF_NS
256             return AF_NS;
257 #else
258             goto not_there;
259 #endif
260         if (strEQ(name, "AF_OSI"))
261 #ifdef AF_OSI
262             return AF_OSI;
263 #else
264             goto not_there;
265 #endif
266         if (strEQ(name, "AF_OSINET"))
267 #ifdef AF_OSINET
268             return AF_OSINET;
269 #else
270             goto not_there;
271 #endif
272         if (strEQ(name, "AF_PUP"))
273 #ifdef AF_PUP
274             return AF_PUP;
275 #else
276             goto not_there;
277 #endif
278         if (strEQ(name, "AF_SNA"))
279 #ifdef AF_SNA
280             return AF_SNA;
281 #else
282             goto not_there;
283 #endif
284         if (strEQ(name, "AF_UNIX"))
285 #ifdef AF_UNIX
286             return AF_UNIX;
287 #else
288             goto not_there;
289 #endif
290         if (strEQ(name, "AF_UNSPEC"))
291 #ifdef AF_UNSPEC
292             return AF_UNSPEC;
293 #else
294             goto not_there;
295 #endif
296         if (strEQ(name, "AF_X25"))
297 #ifdef AF_X25
298             return AF_X25;
299 #else
300             goto not_there;
301 #endif
302         break;
303     case 'B':
304         break;
305     case 'C':
306         break;
307     case 'D':
308         break;
309     case 'E':
310         break;
311     case 'F':
312         break;
313     case 'G':
314         break;
315     case 'H':
316         break;
317     case 'I':
318         break;
319     case 'J':
320         break;
321     case 'K':
322         break;
323     case 'L':
324         break;
325     case 'M':
326         if (strEQ(name, "MSG_CTRUNC"))
327 #if defined(MSG_CTRUNC) || defined(HAS_GNULIBC) /* XXX it's an enum */
328             return MSG_CTRUNC;
329 #else
330             goto not_there;
331 #endif
332         if (strEQ(name, "MSG_DONTROUTE"))
333 #if defined(MSG_DONTROUTE) || defined(HAS_GNULIBC) /* XXX it's an enum */
334             return MSG_DONTROUTE;
335 #else
336             goto not_there;
337 #endif
338         if (strEQ(name, "MSG_MAXIOVLEN"))
339 #ifdef MSG_MAXIOVLEN
340             return MSG_MAXIOVLEN;
341 #else
342             goto not_there;
343 #endif
344         if (strEQ(name, "MSG_OOB"))
345 #if defined(MSG_OOB) || defined(HAS_GNULIBC) /* XXX it's an enum */
346             return MSG_OOB;
347 #else
348             goto not_there;
349 #endif
350         if (strEQ(name, "MSG_PEEK"))
351 #if defined(MSG_PEEK) || defined(HAS_GNULIBC) /* XXX it's an enum */
352             return MSG_PEEK;
353 #else
354             goto not_there;
355 #endif
356         if (strEQ(name, "MSG_PROXY"))
357 #if defined(MSG_PROXY) || defined(HAS_GNULIBC) /* XXX it's an enum */
358             return MSG_PROXY;
359 #else
360             goto not_there;
361 #endif
362         break;
363     case 'N':
364         break;
365     case 'O':
366         break;
367     case 'P':
368         if (strEQ(name, "PF_802"))
369 #ifdef PF_802
370             return PF_802;
371 #else
372             goto not_there;
373 #endif
374         if (strEQ(name, "PF_APPLETALK"))
375 #ifdef PF_APPLETALK
376             return PF_APPLETALK;
377 #else
378             goto not_there;
379 #endif
380         if (strEQ(name, "PF_CCITT"))
381 #ifdef PF_CCITT
382             return PF_CCITT;
383 #else
384             goto not_there;
385 #endif
386         if (strEQ(name, "PF_CHAOS"))
387 #ifdef PF_CHAOS
388             return PF_CHAOS;
389 #else
390             goto not_there;
391 #endif
392         if (strEQ(name, "PF_DATAKIT"))
393 #ifdef PF_DATAKIT
394             return PF_DATAKIT;
395 #else
396             goto not_there;
397 #endif
398         if (strEQ(name, "PF_DECnet"))
399 #ifdef PF_DECnet
400             return PF_DECnet;
401 #else
402             goto not_there;
403 #endif
404         if (strEQ(name, "PF_DLI"))
405 #ifdef PF_DLI
406             return PF_DLI;
407 #else
408             goto not_there;
409 #endif
410         if (strEQ(name, "PF_ECMA"))
411 #ifdef PF_ECMA
412             return PF_ECMA;
413 #else
414             goto not_there;
415 #endif
416         if (strEQ(name, "PF_GOSIP"))
417 #ifdef PF_GOSIP
418             return PF_GOSIP;
419 #else
420             goto not_there;
421 #endif
422         if (strEQ(name, "PF_HYLINK"))
423 #ifdef PF_HYLINK
424             return PF_HYLINK;
425 #else
426             goto not_there;
427 #endif
428         if (strEQ(name, "PF_IMPLINK"))
429 #ifdef PF_IMPLINK
430             return PF_IMPLINK;
431 #else
432             goto not_there;
433 #endif
434         if (strEQ(name, "PF_INET"))
435 #ifdef PF_INET
436             return PF_INET;
437 #else
438             goto not_there;
439 #endif
440         if (strEQ(name, "PF_LAT"))
441 #ifdef PF_LAT
442             return PF_LAT;
443 #else
444             goto not_there;
445 #endif
446         if (strEQ(name, "PF_MAX"))
447 #ifdef PF_MAX
448             return PF_MAX;
449 #else
450             goto not_there;
451 #endif
452         if (strEQ(name, "PF_NBS"))
453 #ifdef PF_NBS
454             return PF_NBS;
455 #else
456             goto not_there;
457 #endif
458         if (strEQ(name, "PF_NIT"))
459 #ifdef PF_NIT
460             return PF_NIT;
461 #else
462             goto not_there;
463 #endif
464         if (strEQ(name, "PF_NS"))
465 #ifdef PF_NS
466             return PF_NS;
467 #else
468             goto not_there;
469 #endif
470         if (strEQ(name, "PF_OSI"))
471 #ifdef PF_OSI
472             return PF_OSI;
473 #else
474             goto not_there;
475 #endif
476         if (strEQ(name, "PF_OSINET"))
477 #ifdef PF_OSINET
478             return PF_OSINET;
479 #else
480             goto not_there;
481 #endif
482         if (strEQ(name, "PF_PUP"))
483 #ifdef PF_PUP
484             return PF_PUP;
485 #else
486             goto not_there;
487 #endif
488         if (strEQ(name, "PF_SNA"))
489 #ifdef PF_SNA
490             return PF_SNA;
491 #else
492             goto not_there;
493 #endif
494         if (strEQ(name, "PF_UNIX"))
495 #ifdef PF_UNIX
496             return PF_UNIX;
497 #else
498             goto not_there;
499 #endif
500         if (strEQ(name, "PF_UNSPEC"))
501 #ifdef PF_UNSPEC
502             return PF_UNSPEC;
503 #else
504             goto not_there;
505 #endif
506         if (strEQ(name, "PF_X25"))
507 #ifdef PF_X25
508             return PF_X25;
509 #else
510             goto not_there;
511 #endif
512         break;
513     case 'Q':
514         break;
515     case 'R':
516         break;
517     case 'S':
518         if (strEQ(name, "SOCK_DGRAM"))
519 #ifdef SOCK_DGRAM
520             return SOCK_DGRAM;
521 #else
522             goto not_there;
523 #endif
524         if (strEQ(name, "SOCK_RAW"))
525 #ifdef SOCK_RAW
526             return SOCK_RAW;
527 #else
528             goto not_there;
529 #endif
530         if (strEQ(name, "SOCK_RDM"))
531 #ifdef SOCK_RDM
532             return SOCK_RDM;
533 #else
534             goto not_there;
535 #endif
536         if (strEQ(name, "SOCK_SEQPACKET"))
537 #ifdef SOCK_SEQPACKET
538             return SOCK_SEQPACKET;
539 #else
540             goto not_there;
541 #endif
542         if (strEQ(name, "SOCK_STREAM"))
543 #ifdef SOCK_STREAM
544             return SOCK_STREAM;
545 #else
546             goto not_there;
547 #endif
548         if (strEQ(name, "SOL_SOCKET"))
549 #ifdef SOL_SOCKET
550             return SOL_SOCKET;
551 #else
552             goto not_there;
553 #endif
554         if (strEQ(name, "SOMAXCONN"))
555 #ifdef SOMAXCONN
556             return SOMAXCONN;
557 #else
558             goto not_there;
559 #endif
560         if (strEQ(name, "SO_ACCEPTCONN"))
561 #ifdef SO_ACCEPTCONN
562             return SO_ACCEPTCONN;
563 #else
564             goto not_there;
565 #endif
566         if (strEQ(name, "SO_BROADCAST"))
567 #ifdef SO_BROADCAST
568             return SO_BROADCAST;
569 #else
570             goto not_there;
571 #endif
572         if (strEQ(name, "SO_DEBUG"))
573 #ifdef SO_DEBUG
574             return SO_DEBUG;
575 #else
576             goto not_there;
577 #endif
578         if (strEQ(name, "SO_DONTLINGER"))
579 #ifdef SO_DONTLINGER
580             return SO_DONTLINGER;
581 #else
582             goto not_there;
583 #endif
584         if (strEQ(name, "SO_DONTROUTE"))
585 #ifdef SO_DONTROUTE
586             return SO_DONTROUTE;
587 #else
588             goto not_there;
589 #endif
590         if (strEQ(name, "SO_ERROR"))
591 #ifdef SO_ERROR
592             return SO_ERROR;
593 #else
594             goto not_there;
595 #endif
596         if (strEQ(name, "SO_KEEPALIVE"))
597 #ifdef SO_KEEPALIVE
598             return SO_KEEPALIVE;
599 #else
600             goto not_there;
601 #endif
602         if (strEQ(name, "SO_LINGER"))
603 #ifdef SO_LINGER
604             return SO_LINGER;
605 #else
606             goto not_there;
607 #endif
608         if (strEQ(name, "SO_OOBINLINE"))
609 #ifdef SO_OOBINLINE
610             return SO_OOBINLINE;
611 #else
612             goto not_there;
613 #endif
614         if (strEQ(name, "SO_RCVBUF"))
615 #ifdef SO_RCVBUF
616             return SO_RCVBUF;
617 #else
618             goto not_there;
619 #endif
620         if (strEQ(name, "SO_RCVLOWAT"))
621 #ifdef SO_RCVLOWAT
622             return SO_RCVLOWAT;
623 #else
624             goto not_there;
625 #endif
626         if (strEQ(name, "SO_RCVTIMEO"))
627 #ifdef SO_RCVTIMEO
628             return SO_RCVTIMEO;
629 #else
630             goto not_there;
631 #endif
632         if (strEQ(name, "SO_REUSEADDR"))
633 #ifdef SO_REUSEADDR
634             return SO_REUSEADDR;
635 #else
636             goto not_there;
637 #endif
638         if (strEQ(name, "SO_REUSEPORT"))
639 #ifdef SO_REUSEPORT
640             return SO_REUSEPORT;
641 #else
642             goto not_there;
643 #endif
644         if (strEQ(name, "SO_SNDBUF"))
645 #ifdef SO_SNDBUF
646             return SO_SNDBUF;
647 #else
648             goto not_there;
649 #endif
650         if (strEQ(name, "SO_SNDLOWAT"))
651 #ifdef SO_SNDLOWAT
652             return SO_SNDLOWAT;
653 #else
654             goto not_there;
655 #endif
656         if (strEQ(name, "SO_SNDTIMEO"))
657 #ifdef SO_SNDTIMEO
658             return SO_SNDTIMEO;
659 #else
660             goto not_there;
661 #endif
662         if (strEQ(name, "SO_TYPE"))
663 #ifdef SO_TYPE
664             return SO_TYPE;
665 #else
666             goto not_there;
667 #endif
668         if (strEQ(name, "SO_USELOOPBACK"))
669 #ifdef SO_USELOOPBACK
670             return SO_USELOOPBACK;
671 #else
672             goto not_there;
673 #endif
674         break;
675     case 'T':
676         break;
677     case 'U':
678         break;
679     case 'V':
680         break;
681     case 'W':
682         break;
683     case 'X':
684         break;
685     case 'Y':
686         break;
687     case 'Z':
688         break;
689     }
690     errno = EINVAL;
691     return 0;
692
693 not_there:
694     errno = ENOENT;
695     return 0;
696 }
697
698
699 MODULE = Socket         PACKAGE = Socket
700
701 double
702 constant(name,arg)
703         char *          name
704         int             arg
705
706
707 void
708 inet_aton(host)
709         char *  host
710         CODE:
711         {
712         struct in_addr ip_address;
713         struct hostent * phe;
714         int ok;
715
716         if (phe = gethostbyname(host)) {
717                 Copy( phe->h_addr, &ip_address, phe->h_length, char );
718                 ok = 1;
719         } else {
720                 ok = inet_aton(host, &ip_address);
721         }
722
723         ST(0) = sv_newmortal();
724         if (ok) {
725                 sv_setpvn( ST(0), (char *)&ip_address, sizeof ip_address );
726         }
727         }
728
729 void
730 inet_ntoa(ip_address_sv)
731         SV *    ip_address_sv
732         CODE:
733         {
734         STRLEN addrlen;
735         struct in_addr addr;
736         char * addr_str;
737         char * ip_address = SvPV(ip_address_sv,addrlen);
738         if (addrlen != sizeof(addr)) {
739             croak("Bad arg length for %s, length is %d, should be %d",
740                         "Socket::inet_ntoa",
741                         addrlen, sizeof(addr));
742         }
743
744         Copy( ip_address, &addr, sizeof addr, char );
745         addr_str = inet_ntoa(addr);
746
747         ST(0) = sv_2mortal(newSVpv(addr_str, strlen(addr_str)));
748         }
749
750 void
751 pack_sockaddr_un(pathname)
752         char *  pathname
753         CODE:
754         {
755 #ifdef I_SYS_UN
756         struct sockaddr_un sun_ad; /* fear using sun */
757         STRLEN len;
758         Zero( &sun_ad, sizeof sun_ad, char );
759         sun_ad.sun_family = AF_UNIX;
760         len = strlen(pathname);
761         if (len > sizeof(sun_ad.sun_path))
762             len = sizeof(sun_ad.sun_path);
763         Copy( pathname, sun_ad.sun_path, len, char );
764         ST(0) = sv_2mortal(newSVpv((char *)&sun_ad, sizeof sun_ad));
765 #else
766         ST(0) = (SV *) not_here("pack_sockaddr_un");
767 #endif
768         
769         }
770
771 void
772 unpack_sockaddr_un(sun_sv)
773         SV *    sun_sv
774         CODE:
775         {
776 #ifdef I_SYS_UN
777         struct sockaddr_un addr;
778         STRLEN sockaddrlen;
779         char * sun_ad = SvPV(sun_sv,sockaddrlen);
780         char * e;
781
782         if (sockaddrlen != sizeof(addr)) {
783             croak("Bad arg length for %s, length is %d, should be %d",
784                         "Socket::unpack_sockaddr_un",
785                         sockaddrlen, sizeof(addr));
786         }
787
788         Copy( sun_ad, &addr, sizeof addr, char );
789
790         if ( addr.sun_family != AF_UNIX ) {
791             croak("Bad address family for %s, got %d, should be %d",
792                         "Socket::unpack_sockaddr_un",
793                         addr.sun_family,
794                         AF_UNIX);
795         }
796         e = addr.sun_path;
797         while (*e && e < addr.sun_path + sizeof addr.sun_path)
798             ++e;
799         ST(0) = sv_2mortal(newSVpvn(addr.sun_path, e - addr.sun_path));
800 #else
801         ST(0) = (SV *) not_here("unpack_sockaddr_un");
802 #endif
803         }
804
805 void
806 pack_sockaddr_in(port,ip_address)
807         unsigned short  port
808         char *  ip_address
809         CODE:
810         {
811         struct sockaddr_in sin;
812
813         Zero( &sin, sizeof sin, char );
814         sin.sin_family = AF_INET;
815         sin.sin_port = htons(port);
816         Copy( ip_address, &sin.sin_addr, sizeof sin.sin_addr, char );
817
818         ST(0) = sv_2mortal(newSVpv((char *)&sin, sizeof sin));
819         }
820
821 void
822 unpack_sockaddr_in(sin_sv)
823         SV *    sin_sv
824         PPCODE:
825         {
826         STRLEN sockaddrlen;
827         struct sockaddr_in addr;
828         unsigned short  port;
829         struct in_addr  ip_address;
830         char *  sin = SvPV(sin_sv,sockaddrlen);
831         if (sockaddrlen != sizeof(addr)) {
832             croak("Bad arg length for %s, length is %d, should be %d",
833                         "Socket::unpack_sockaddr_in",
834                         sockaddrlen, sizeof(addr));
835         }
836         Copy( sin, &addr,sizeof addr, char );
837         if ( addr.sin_family != AF_INET ) {
838             croak("Bad address family for %s, got %d, should be %d",
839                         "Socket::unpack_sockaddr_in",
840                         addr.sin_family,
841                         AF_INET);
842         } 
843         port = ntohs(addr.sin_port);
844         ip_address = addr.sin_addr;
845
846         EXTEND(SP, 2);
847         PUSHs(sv_2mortal(newSViv((IV) port)));
848         PUSHs(sv_2mortal(newSVpv((char *)&ip_address,sizeof ip_address)));
849         }
850
851 void
852 INADDR_ANY()
853         CODE:
854         {
855         struct in_addr  ip_address;
856         ip_address.s_addr = htonl(INADDR_ANY);
857         ST(0) = sv_2mortal(newSVpv((char *)&ip_address,sizeof ip_address ));
858         }
859
860 void
861 INADDR_LOOPBACK()
862         CODE:
863         {
864         struct in_addr  ip_address;
865         ip_address.s_addr = htonl(INADDR_LOOPBACK);
866         ST(0) = sv_2mortal(newSVpv((char *)&ip_address,sizeof ip_address));
867         }
868
869 void
870 INADDR_NONE()
871         CODE:
872         {
873         struct in_addr  ip_address;
874         ip_address.s_addr = htonl(INADDR_NONE);
875         ST(0) = sv_2mortal(newSVpv((char *)&ip_address,sizeof ip_address));
876         }
877
878 void
879 INADDR_BROADCAST()
880         CODE:
881         {
882         struct in_addr  ip_address;
883         ip_address.s_addr = htonl(INADDR_BROADCAST);
884         ST(0) = sv_2mortal(newSVpv((char *)&ip_address,sizeof ip_address));
885         }