7 # include <sys/types.h>
9 #include <sys/socket.h>
12 # include <netinet/in.h>
15 #include <arpa/inet.h>
17 #include "sockadapt.h"
29 #define INADDR_NONE 0xffffffff
30 #endif /* INADDR_NONE */
31 #ifndef INADDR_LOOPBACK
32 #define INADDR_LOOPBACK 0x7F000001
33 #endif /* INADDR_LOOPBACK */
40 croak("Socket::%s not implemented on this architecture", s);
52 if (strEQ(name, "AF_802"))
58 if (strEQ(name, "AF_APPLETALK"))
64 if (strEQ(name, "AF_CCITT"))
70 if (strEQ(name, "AF_CHAOS"))
76 if (strEQ(name, "AF_DATAKIT"))
82 if (strEQ(name, "AF_DECnet"))
88 if (strEQ(name, "AF_DLI"))
94 if (strEQ(name, "AF_ECMA"))
100 if (strEQ(name, "AF_GOSIP"))
106 if (strEQ(name, "AF_HYLINK"))
112 if (strEQ(name, "AF_IMPLINK"))
118 if (strEQ(name, "AF_INET"))
124 if (strEQ(name, "AF_LAT"))
130 if (strEQ(name, "AF_MAX"))
136 if (strEQ(name, "AF_NBS"))
142 if (strEQ(name, "AF_NIT"))
148 if (strEQ(name, "AF_NS"))
154 if (strEQ(name, "AF_OSI"))
160 if (strEQ(name, "AF_OSINET"))
166 if (strEQ(name, "AF_PUP"))
172 if (strEQ(name, "AF_SNA"))
178 if (strEQ(name, "AF_UNIX"))
184 if (strEQ(name, "AF_UNSPEC"))
190 if (strEQ(name, "AF_X25"))
220 if (strEQ(name, "MSG_DONTROUTE"))
222 return MSG_DONTROUTE;
226 if (strEQ(name, "MSG_MAXIOVLEN"))
228 return MSG_MAXIOVLEN;
232 if (strEQ(name, "MSG_OOB"))
238 if (strEQ(name, "MSG_PEEK"))
250 if (strEQ(name, "PF_802"))
256 if (strEQ(name, "PF_APPLETALK"))
262 if (strEQ(name, "PF_CCITT"))
268 if (strEQ(name, "PF_CHAOS"))
274 if (strEQ(name, "PF_DATAKIT"))
280 if (strEQ(name, "PF_DECnet"))
286 if (strEQ(name, "PF_DLI"))
292 if (strEQ(name, "PF_ECMA"))
298 if (strEQ(name, "PF_GOSIP"))
304 if (strEQ(name, "PF_HYLINK"))
310 if (strEQ(name, "PF_IMPLINK"))
316 if (strEQ(name, "PF_INET"))
322 if (strEQ(name, "PF_LAT"))
328 if (strEQ(name, "PF_MAX"))
334 if (strEQ(name, "PF_NBS"))
340 if (strEQ(name, "PF_NIT"))
346 if (strEQ(name, "PF_NS"))
352 if (strEQ(name, "PF_OSI"))
358 if (strEQ(name, "PF_OSINET"))
364 if (strEQ(name, "PF_PUP"))
370 if (strEQ(name, "PF_SNA"))
376 if (strEQ(name, "PF_UNIX"))
382 if (strEQ(name, "PF_UNSPEC"))
388 if (strEQ(name, "PF_X25"))
400 if (strEQ(name, "SOCK_DGRAM"))
406 if (strEQ(name, "SOCK_RAW"))
412 if (strEQ(name, "SOCK_RDM"))
418 if (strEQ(name, "SOCK_SEQPACKET"))
419 #ifdef SOCK_SEQPACKET
420 return SOCK_SEQPACKET;
424 if (strEQ(name, "SOCK_STREAM"))
430 if (strEQ(name, "SOL_SOCKET"))
436 if (strEQ(name, "SOMAXCONN"))
442 if (strEQ(name, "SO_ACCEPTCONN"))
444 return SO_ACCEPTCONN;
448 if (strEQ(name, "SO_BROADCAST"))
454 if (strEQ(name, "SO_DEBUG"))
460 if (strEQ(name, "SO_DONTLINGER"))
462 return SO_DONTLINGER;
466 if (strEQ(name, "SO_DONTROUTE"))
472 if (strEQ(name, "SO_ERROR"))
478 if (strEQ(name, "SO_KEEPALIVE"))
484 if (strEQ(name, "SO_LINGER"))
490 if (strEQ(name, "SO_OOBINLINE"))
496 if (strEQ(name, "SO_RCVBUF"))
502 if (strEQ(name, "SO_RCVLOWAT"))
508 if (strEQ(name, "SO_RCVTIMEO"))
514 if (strEQ(name, "SO_REUSEADDR"))
520 if (strEQ(name, "SO_REUSEPORT"))
526 if (strEQ(name, "SO_SNDBUF"))
532 if (strEQ(name, "SO_SNDLOWAT"))
538 if (strEQ(name, "SO_SNDTIMEO"))
544 if (strEQ(name, "SO_TYPE"))
550 if (strEQ(name, "SO_USELOOPBACK"))
551 #ifdef SO_USELOOPBACK
552 return SO_USELOOPBACK;
581 MODULE = Socket PACKAGE = Socket
594 struct in_addr ip_address;
595 struct hostent * phe;
597 if (phe = gethostbyname(host)) {
598 Copy( phe->h_addr, &ip_address, phe->h_length, char );
600 ip_address.s_addr = inet_addr(host);
603 ST(0) = sv_newmortal();
604 if(ip_address.s_addr != INADDR_NONE) {
605 sv_setpvn( ST(0), (char *)&ip_address, sizeof ip_address );
610 inet_ntoa(ip_address_sv)
617 char * ip_address = SvPV(ip_address_sv,addrlen);
618 if (addrlen != sizeof(addr)) {
619 croak("Bad arg length for %s, length is %d, should be %d",
621 addrlen, sizeof(addr));
624 Copy( ip_address, &addr, sizeof addr, char );
625 addr_str = inet_ntoa(addr);
627 ST(0) = sv_2mortal(newSVpv(addr_str, strlen(addr_str)));
631 pack_sockaddr_un(pathname)
635 struct sockaddr_un sun_ad; /* fear using sun */
636 Zero( &sun_ad, sizeof sun_ad, char );
637 sun_ad.sun_family = AF_UNIX;
638 Copy( pathname, sun_ad.sun_path, sizeof sun_ad.sun_path, char );
639 ST(0) = sv_2mortal(newSVpv((char *)&sun_ad, sizeof sun_ad));
643 unpack_sockaddr_un(sun_sv)
648 struct sockaddr_un addr;
649 char * sun_ad = SvPV(sun_sv,sockaddrlen);
651 if (sockaddrlen != sizeof(addr)) {
652 croak("Bad arg length for %s, length is %d, should be %d",
653 "Socket::unpack_sockaddr_un",
654 sockaddrlen, sizeof(addr));
657 Copy( sun_ad, &addr, sizeof addr, char );
659 if ( addr.sun_family != AF_UNIX ) {
660 croak("Bad address family for %s, got %d, should be %d",
661 "Socket::unpack_sockaddr_un",
665 ST(0) = sv_2mortal(newSVpv(addr.sun_path, strlen(addr.sun_path)));
669 pack_sockaddr_in(port,ip_address)
674 struct sockaddr_in sin;
676 Zero( &sin, sizeof sin, char );
677 sin.sin_family = AF_INET;
678 sin.sin_port = htons(port);
679 Copy( ip_address, &sin.sin_addr, sizeof sin.sin_addr, char );
681 ST(0) = sv_2mortal(newSVpv((char *)&sin, sizeof sin));
685 unpack_sockaddr_in(sin_sv)
690 struct sockaddr_in addr;
692 struct in_addr ip_address;
693 char * sin = SvPV(sin_sv,sockaddrlen);
694 if (sockaddrlen != sizeof(addr)) {
695 croak("Bad arg length for %s, length is %d, should be %d",
696 "Socket::unpack_sockaddr_in",
697 sockaddrlen, sizeof(addr));
699 Copy( sin, &addr,sizeof addr, char );
700 if ( addr.sin_family != AF_INET ) {
701 croak("Bad address family for %s, got %d, should be %d",
702 "Socket::unpack_sockaddr_in",
706 port = ntohs(addr.sin_port);
707 ip_address = addr.sin_addr;
710 PUSHs(sv_2mortal(newSViv(port)));
711 PUSHs(sv_2mortal(newSVpv((char *)&ip_address,sizeof ip_address)));
718 struct in_addr ip_address;
719 ip_address.s_addr = htonl(INADDR_ANY);
720 ST(0) = sv_2mortal(newSVpv((char *)&ip_address,sizeof ip_address ));
727 struct in_addr ip_address;
728 ip_address.s_addr = htonl(INADDR_LOOPBACK);
729 ST(0) = sv_2mortal(newSVpv((char *)&ip_address,sizeof ip_address));
736 struct in_addr ip_address;
737 ip_address.s_addr = htonl(INADDR_NONE);
738 ST(0) = sv_2mortal(newSVpv((char *)&ip_address,sizeof ip_address));