7 # include <sys/types.h>
9 #include <sys/socket.h>
14 # include <netinet/in.h>
17 #include <arpa/inet.h>
19 #include "sockadapt.h"
31 #define INADDR_NONE 0xffffffff
32 #endif /* INADDR_NONE */
33 #ifndef INADDR_LOOPBACK
34 #define INADDR_LOOPBACK 0x7F000001
35 #endif /* INADDR_LOOPBACK */
42 croak("Socket::%s not implemented on this architecture", s);
54 if (strEQ(name, "AF_802"))
60 if (strEQ(name, "AF_APPLETALK"))
66 if (strEQ(name, "AF_CCITT"))
72 if (strEQ(name, "AF_CHAOS"))
78 if (strEQ(name, "AF_DATAKIT"))
84 if (strEQ(name, "AF_DECnet"))
90 if (strEQ(name, "AF_DLI"))
96 if (strEQ(name, "AF_ECMA"))
102 if (strEQ(name, "AF_GOSIP"))
108 if (strEQ(name, "AF_HYLINK"))
114 if (strEQ(name, "AF_IMPLINK"))
120 if (strEQ(name, "AF_INET"))
126 if (strEQ(name, "AF_LAT"))
132 if (strEQ(name, "AF_MAX"))
138 if (strEQ(name, "AF_NBS"))
144 if (strEQ(name, "AF_NIT"))
150 if (strEQ(name, "AF_NS"))
156 if (strEQ(name, "AF_OSI"))
162 if (strEQ(name, "AF_OSINET"))
168 if (strEQ(name, "AF_PUP"))
174 if (strEQ(name, "AF_SNA"))
180 if (strEQ(name, "AF_UNIX"))
186 if (strEQ(name, "AF_UNSPEC"))
192 if (strEQ(name, "AF_X25"))
222 if (strEQ(name, "MSG_DONTROUTE"))
224 return MSG_DONTROUTE;
228 if (strEQ(name, "MSG_MAXIOVLEN"))
230 return MSG_MAXIOVLEN;
234 if (strEQ(name, "MSG_OOB"))
240 if (strEQ(name, "MSG_PEEK"))
252 if (strEQ(name, "PF_802"))
258 if (strEQ(name, "PF_APPLETALK"))
264 if (strEQ(name, "PF_CCITT"))
270 if (strEQ(name, "PF_CHAOS"))
276 if (strEQ(name, "PF_DATAKIT"))
282 if (strEQ(name, "PF_DECnet"))
288 if (strEQ(name, "PF_DLI"))
294 if (strEQ(name, "PF_ECMA"))
300 if (strEQ(name, "PF_GOSIP"))
306 if (strEQ(name, "PF_HYLINK"))
312 if (strEQ(name, "PF_IMPLINK"))
318 if (strEQ(name, "PF_INET"))
324 if (strEQ(name, "PF_LAT"))
330 if (strEQ(name, "PF_MAX"))
336 if (strEQ(name, "PF_NBS"))
342 if (strEQ(name, "PF_NIT"))
348 if (strEQ(name, "PF_NS"))
354 if (strEQ(name, "PF_OSI"))
360 if (strEQ(name, "PF_OSINET"))
366 if (strEQ(name, "PF_PUP"))
372 if (strEQ(name, "PF_SNA"))
378 if (strEQ(name, "PF_UNIX"))
384 if (strEQ(name, "PF_UNSPEC"))
390 if (strEQ(name, "PF_X25"))
402 if (strEQ(name, "SOCK_DGRAM"))
408 if (strEQ(name, "SOCK_RAW"))
414 if (strEQ(name, "SOCK_RDM"))
420 if (strEQ(name, "SOCK_SEQPACKET"))
421 #ifdef SOCK_SEQPACKET
422 return SOCK_SEQPACKET;
426 if (strEQ(name, "SOCK_STREAM"))
432 if (strEQ(name, "SOL_SOCKET"))
438 if (strEQ(name, "SOMAXCONN"))
444 if (strEQ(name, "SO_ACCEPTCONN"))
446 return SO_ACCEPTCONN;
450 if (strEQ(name, "SO_BROADCAST"))
456 if (strEQ(name, "SO_DEBUG"))
462 if (strEQ(name, "SO_DONTLINGER"))
464 return SO_DONTLINGER;
468 if (strEQ(name, "SO_DONTROUTE"))
474 if (strEQ(name, "SO_ERROR"))
480 if (strEQ(name, "SO_KEEPALIVE"))
486 if (strEQ(name, "SO_LINGER"))
492 if (strEQ(name, "SO_OOBINLINE"))
498 if (strEQ(name, "SO_RCVBUF"))
504 if (strEQ(name, "SO_RCVLOWAT"))
510 if (strEQ(name, "SO_RCVTIMEO"))
516 if (strEQ(name, "SO_REUSEADDR"))
522 if (strEQ(name, "SO_REUSEPORT"))
528 if (strEQ(name, "SO_SNDBUF"))
534 if (strEQ(name, "SO_SNDLOWAT"))
540 if (strEQ(name, "SO_SNDTIMEO"))
546 if (strEQ(name, "SO_TYPE"))
552 if (strEQ(name, "SO_USELOOPBACK"))
553 #ifdef SO_USELOOPBACK
554 return SO_USELOOPBACK;
583 MODULE = Socket PACKAGE = Socket
596 struct in_addr ip_address;
597 struct hostent * phe;
599 if (phe = gethostbyname(host)) {
600 Copy( phe->h_addr, &ip_address, phe->h_length, char );
602 ip_address.s_addr = inet_addr(host);
605 ST(0) = sv_newmortal();
606 if(ip_address.s_addr != INADDR_NONE) {
607 sv_setpvn( ST(0), (char *)&ip_address, sizeof ip_address );
612 inet_ntoa(ip_address_sv)
619 char * ip_address = SvPV(ip_address_sv,addrlen);
620 if (addrlen != sizeof(addr)) {
621 croak("Bad arg length for %s, length is %d, should be %d",
623 addrlen, sizeof(addr));
626 Copy( ip_address, &addr, sizeof addr, char );
627 addr_str = inet_ntoa(addr);
629 ST(0) = sv_2mortal(newSVpv(addr_str, strlen(addr_str)));
633 pack_sockaddr_un(pathname)
638 struct sockaddr_un sun_ad; /* fear using sun */
639 Zero( &sun_ad, sizeof sun_ad, char );
640 sun_ad.sun_family = AF_UNIX;
641 Copy( pathname, sun_ad.sun_path, sizeof sun_ad.sun_path, char );
642 ST(0) = sv_2mortal(newSVpv((char *)&sun_ad, sizeof sun_ad));
644 ST(0) = (SV *) not_here("pack_sockaddr_un");
650 unpack_sockaddr_un(sun_sv)
656 struct sockaddr_un addr;
657 char * sun_ad = SvPV(sun_sv,sockaddrlen);
659 if (sockaddrlen != sizeof(addr)) {
660 croak("Bad arg length for %s, length is %d, should be %d",
661 "Socket::unpack_sockaddr_un",
662 sockaddrlen, sizeof(addr));
665 Copy( sun_ad, &addr, sizeof addr, char );
667 if ( addr.sun_family != AF_UNIX ) {
668 croak("Bad address family for %s, got %d, should be %d",
669 "Socket::unpack_sockaddr_un",
673 ST(0) = sv_2mortal(newSVpv(addr.sun_path, strlen(addr.sun_path)));
675 ST(0) = (SV *) not_here("unpack_sockaddr_un");
680 pack_sockaddr_in(port,ip_address)
685 struct sockaddr_in sin;
687 Zero( &sin, sizeof sin, char );
688 sin.sin_family = AF_INET;
689 sin.sin_port = htons(port);
690 Copy( ip_address, &sin.sin_addr, sizeof sin.sin_addr, char );
692 ST(0) = sv_2mortal(newSVpv((char *)&sin, sizeof sin));
696 unpack_sockaddr_in(sin_sv)
701 struct sockaddr_in addr;
703 struct in_addr ip_address;
704 char * sin = SvPV(sin_sv,sockaddrlen);
705 if (sockaddrlen != sizeof(addr)) {
706 croak("Bad arg length for %s, length is %d, should be %d",
707 "Socket::unpack_sockaddr_in",
708 sockaddrlen, sizeof(addr));
710 Copy( sin, &addr,sizeof addr, char );
711 if ( addr.sin_family != AF_INET ) {
712 croak("Bad address family for %s, got %d, should be %d",
713 "Socket::unpack_sockaddr_in",
717 port = ntohs(addr.sin_port);
718 ip_address = addr.sin_addr;
721 PUSHs(sv_2mortal(newSViv((IV) port)));
722 PUSHs(sv_2mortal(newSVpv((char *)&ip_address,sizeof ip_address)));
729 struct in_addr ip_address;
730 ip_address.s_addr = htonl(INADDR_ANY);
731 ST(0) = sv_2mortal(newSVpv((char *)&ip_address,sizeof ip_address ));
738 struct in_addr ip_address;
739 ip_address.s_addr = htonl(INADDR_LOOPBACK);
740 ST(0) = sv_2mortal(newSVpv((char *)&ip_address,sizeof ip_address));
747 struct in_addr ip_address;
748 ip_address.s_addr = htonl(INADDR_NONE);
749 ST(0) = sv_2mortal(newSVpv((char *)&ip_address,sizeof ip_address));