X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=ext%2FSocket%2FSocket.xs;h=48f30d902d72b186470f9902398b79d9b3831b98;hb=b56fc9ec2d9f24dd7719ac8ba4c094aaa486bd0e;hp=d844775e4f1fa24263c55d8a58d8519b719db575;hpb=1d88b533f61a8e86a0609fd906a86fecfadc6d1a;p=p5sagit%2Fp5-mst-13.2.git diff --git a/ext/Socket/Socket.xs b/ext/Socket/Socket.xs index d844775..48f30d9 100644 --- a/ext/Socket/Socket.xs +++ b/ext/Socket/Socket.xs @@ -9,7 +9,9 @@ # ifdef I_SYS_TYPES # include # endif -# include +# if !defined(ultrix) /* Avoid double definition. */ +# include +# endif # if defined(USE_SOCKS) && defined(I_SOCKS) # include # endif @@ -25,11 +27,16 @@ # if defined(NeXT) || defined(__NeXT__) # include # endif -# ifdef I_NETINET_IN +# if defined(__sgi) && !defined(AF_LINK) && defined(PF_LINK) && PF_LINK == AF_LNK +# undef PF_LINK +# endif +# if defined(I_NETINET_IN) || defined(__ultrix__) # include # endif # ifdef I_NETDB -# include +# if !defined(ultrix) /* Avoid double definition. */ +# include +# endif # endif # ifdef I_ARPA_INET # include @@ -224,10 +231,7 @@ inet_aton(host) { struct in_addr ip_address; struct hostent * phe; - int ok = - (host != NULL) && - (*host != '\0') && - inet_aton(host, &ip_address); + int ok = (*host != '\0') && inet_aton(host, &ip_address); if (!ok && (phe = gethostbyname(host))) { Copy( phe->h_addr, &ip_address, phe->h_length, char ); @@ -265,7 +269,7 @@ inet_ntoa(ip_address_sv) * in HP-UX + GCC + 64bitint (returns "0.0.0.0"), * so let's use this sprintf() workaround everywhere. * This is also more threadsafe than using inet_ntoa(). */ - New(1138, addr_str, 4 * 3 + 3 + 1, char); /* IPv6? */ + Newx(addr_str, 4 * 3 + 3 + 1, char); /* IPv6? */ sprintf(addr_str, "%d.%d.%d.%d", ((addr.s_addr >> 24) & 0xFF), ((addr.s_addr >> 16) & 0xFF), @@ -291,16 +295,17 @@ sockaddr_family(sockaddr) void pack_sockaddr_un(pathname) - char * pathname + SV * pathname CODE: { #ifdef I_SYS_UN struct sockaddr_un sun_ad; /* fear using sun */ STRLEN len; + char * pathname_pv; Zero( &sun_ad, sizeof sun_ad, char ); sun_ad.sun_family = AF_UNIX; - len = strlen(pathname); + pathname_pv = SvPV(pathname,len); if (len > sizeof(sun_ad.sun_path)) len = sizeof(sun_ad.sun_path); # ifdef OS2 /* Name should start with \socket\ and contain backslashes! */ @@ -308,16 +313,17 @@ pack_sockaddr_un(pathname) int off; char *s, *e; - if (pathname[0] != '/' && pathname[0] != '\\') - croak("Relative UNIX domain socket name '%s' unsupported", pathname); + if (pathname_pv[0] != '/' && pathname_pv[0] != '\\') + croak("Relative UNIX domain socket name '%s' unsupported", + pathname_pv); else if (len < 8 - || pathname[7] != '/' && pathname[7] != '\\' - || !strnicmp(pathname + 1, "socket", 6)) + || pathname_pv[7] != '/' && pathname_pv[7] != '\\' + || !strnicmp(pathname_pv + 1, "socket", 6)) off = 7; else off = 0; /* Preserve names starting with \socket\ */ Copy( "\\socket", sun_ad.sun_path, off, char); - Copy( pathname, sun_ad.sun_path + off, len, char ); + Copy( pathname_pv, sun_ad.sun_path + off, len, char ); s = sun_ad.sun_path + off - 1; e = s + len + 1; @@ -326,7 +332,7 @@ pack_sockaddr_un(pathname) *s = '\\'; } # else /* !( defined OS2 ) */ - Copy( pathname, sun_ad.sun_path, len, char ); + Copy( pathname_pv, sun_ad.sun_path, len, char ); # endif if (0) not_here("dummy"); ST(0) = sv_2mortal(newSVpvn((char *)&sun_ad, sizeof sun_ad)); @@ -364,10 +370,13 @@ unpack_sockaddr_un(sun_sv) addr.sun_family, AF_UNIX); } - e = addr.sun_path; - while (*e && e < addr.sun_path + sizeof addr.sun_path) + e = (char*)addr.sun_path; + /* On Linux, the name of abstract unix domain sockets begins + * with a '\0', so allow this. */ + while ((*e || (e == addr.sun_path && e[1] && sockaddrlen > 1)) + && e < (char*)addr.sun_path + sizeof addr.sun_path) ++e; - ST(0) = sv_2mortal(newSVpvn(addr.sun_path, e - addr.sun_path)); + ST(0) = sv_2mortal(newSVpvn(addr.sun_path, e - (char*)addr.sun_path)); #else ST(0) = (SV *) not_here("unpack_sockaddr_un"); #endif