7 # include <sys/types.h>
9 #include <sys/socket.h>
11 # include <netinet/in.h>
14 #include <arpa/inet.h>
16 #include "sockadapt.h"
28 #define INADDR_NONE 0xffffffff
29 #endif /* INADDR_NONE */
30 #ifndef INADDR_LOOPBACK
31 #define INADDR_LOOPBACK 0x7F000001
32 #endif /* INADDR_LOOPBACK */
39 croak("Socket::%s not implemented on this architecture", s);
51 if (strEQ(name, "AF_802"))
57 if (strEQ(name, "AF_APPLETALK"))
63 if (strEQ(name, "AF_CCITT"))
69 if (strEQ(name, "AF_CHAOS"))
75 if (strEQ(name, "AF_DATAKIT"))
81 if (strEQ(name, "AF_DECnet"))
87 if (strEQ(name, "AF_DLI"))
93 if (strEQ(name, "AF_ECMA"))
99 if (strEQ(name, "AF_GOSIP"))
105 if (strEQ(name, "AF_HYLINK"))
111 if (strEQ(name, "AF_IMPLINK"))
117 if (strEQ(name, "AF_INET"))
123 if (strEQ(name, "AF_LAT"))
129 if (strEQ(name, "AF_MAX"))
135 if (strEQ(name, "AF_NBS"))
141 if (strEQ(name, "AF_NIT"))
147 if (strEQ(name, "AF_NS"))
153 if (strEQ(name, "AF_OSI"))
159 if (strEQ(name, "AF_OSINET"))
165 if (strEQ(name, "AF_PUP"))
171 if (strEQ(name, "AF_SNA"))
177 if (strEQ(name, "AF_UNIX"))
183 if (strEQ(name, "AF_UNSPEC"))
189 if (strEQ(name, "AF_X25"))
219 if (strEQ(name, "MSG_DONTROUTE"))
221 return MSG_DONTROUTE;
225 if (strEQ(name, "MSG_MAXIOVLEN"))
227 return MSG_MAXIOVLEN;
231 if (strEQ(name, "MSG_OOB"))
237 if (strEQ(name, "MSG_PEEK"))
249 if (strEQ(name, "PF_802"))
255 if (strEQ(name, "PF_APPLETALK"))
261 if (strEQ(name, "PF_CCITT"))
267 if (strEQ(name, "PF_CHAOS"))
273 if (strEQ(name, "PF_DATAKIT"))
279 if (strEQ(name, "PF_DECnet"))
285 if (strEQ(name, "PF_DLI"))
291 if (strEQ(name, "PF_ECMA"))
297 if (strEQ(name, "PF_GOSIP"))
303 if (strEQ(name, "PF_HYLINK"))
309 if (strEQ(name, "PF_IMPLINK"))
315 if (strEQ(name, "PF_INET"))
321 if (strEQ(name, "PF_LAT"))
327 if (strEQ(name, "PF_MAX"))
333 if (strEQ(name, "PF_NBS"))
339 if (strEQ(name, "PF_NIT"))
345 if (strEQ(name, "PF_NS"))
351 if (strEQ(name, "PF_OSI"))
357 if (strEQ(name, "PF_OSINET"))
363 if (strEQ(name, "PF_PUP"))
369 if (strEQ(name, "PF_SNA"))
375 if (strEQ(name, "PF_UNIX"))
381 if (strEQ(name, "PF_UNSPEC"))
387 if (strEQ(name, "PF_X25"))
399 if (strEQ(name, "SOCK_DGRAM"))
405 if (strEQ(name, "SOCK_RAW"))
411 if (strEQ(name, "SOCK_RDM"))
417 if (strEQ(name, "SOCK_SEQPACKET"))
418 #ifdef SOCK_SEQPACKET
419 return SOCK_SEQPACKET;
423 if (strEQ(name, "SOCK_STREAM"))
429 if (strEQ(name, "SOL_SOCKET"))
435 if (strEQ(name, "SOMAXCONN"))
441 if (strEQ(name, "SO_ACCEPTCONN"))
443 return SO_ACCEPTCONN;
447 if (strEQ(name, "SO_BROADCAST"))
453 if (strEQ(name, "SO_DEBUG"))
459 if (strEQ(name, "SO_DONTLINGER"))
461 return SO_DONTLINGER;
465 if (strEQ(name, "SO_DONTROUTE"))
471 if (strEQ(name, "SO_ERROR"))
477 if (strEQ(name, "SO_KEEPALIVE"))
483 if (strEQ(name, "SO_LINGER"))
489 if (strEQ(name, "SO_OOBINLINE"))
495 if (strEQ(name, "SO_RCVBUF"))
501 if (strEQ(name, "SO_RCVLOWAT"))
507 if (strEQ(name, "SO_RCVTIMEO"))
513 if (strEQ(name, "SO_REUSEADDR"))
519 if (strEQ(name, "SO_REUSEPORT"))
525 if (strEQ(name, "SO_SNDBUF"))
531 if (strEQ(name, "SO_SNDLOWAT"))
537 if (strEQ(name, "SO_SNDTIMEO"))
543 if (strEQ(name, "SO_TYPE"))
549 if (strEQ(name, "SO_USELOOPBACK"))
550 #ifdef SO_USELOOPBACK
551 return SO_USELOOPBACK;
580 MODULE = Socket PACKAGE = Socket
593 struct in_addr ip_address;
594 struct hostent * phe;
596 if (phe = gethostbyname(host)) {
597 Copy( phe->h_addr, &ip_address, phe->h_length, char );
599 ip_address.s_addr = inet_addr(host);
602 ST(0) = sv_newmortal();
603 if(ip_address.s_addr != INADDR_NONE) {
604 sv_setpvn( ST(0), (char *)&ip_address, sizeof ip_address );
609 inet_ntoa(ip_address_sv)
616 char * ip_address = SvPV(ip_address_sv,addrlen);
617 if (addrlen != sizeof(addr)) {
618 croak("Bad arg length for %s, length is %d, should be %d",
620 addrlen, sizeof(addr));
623 Copy( ip_address, &addr, sizeof addr, char );
624 addr_str = inet_ntoa(addr);
626 ST(0) = sv_2mortal(newSVpv(addr_str, strlen(addr_str)));
630 pack_sockaddr_in(family,port,ip_address)
636 struct sockaddr_in sin;
638 Zero( &sin, sizeof sin, char );
639 sin.sin_family = family;
640 sin.sin_port = htons(port);
641 Copy( ip_address, &sin.sin_addr, sizeof sin.sin_addr, char );
643 ST(0) = sv_2mortal(newSVpv((char *)&sin, sizeof sin));
647 unpack_sockaddr_in(sin_sv)
652 struct sockaddr_in addr;
655 struct in_addr ip_address;
656 char * sin = SvPV(sin_sv,sockaddrlen);
657 if (sockaddrlen != sizeof(addr)) {
658 croak("Bad arg length for %s, length is %d, should be %d",
659 "Socket::unpack_sockaddr_in",
660 sockaddrlen, sizeof(addr));
663 Copy( sin, &addr,sizeof addr, char );
664 family = addr.sin_family;
665 port = ntohs(addr.sin_port);
666 ip_address = addr.sin_addr;
669 PUSHs(sv_2mortal(newSViv(family)));
670 PUSHs(sv_2mortal(newSViv(port)));
671 PUSHs(sv_2mortal(newSVpv((char *)&ip_address,sizeof ip_address)));
678 struct in_addr ip_address;
679 ip_address.s_addr = htonl(INADDR_ANY);
680 ST(0) = sv_2mortal(newSVpv((char *)&ip_address,sizeof ip_address ));
687 struct in_addr ip_address;
688 ip_address.s_addr = htonl(INADDR_LOOPBACK);
689 ST(0) = sv_2mortal(newSVpv((char *)&ip_address,sizeof ip_address));
696 struct in_addr ip_address;
697 ip_address.s_addr = htonl(INADDR_NONE);
698 ST(0) = sv_2mortal(newSVpv((char *)&ip_address,sizeof ip_address));