# ifdef I_SYS_TYPES
# include <sys/types.h>
# endif
-# include <sys/socket.h>
+# if !defined(ultrix) /* Avoid double definition. */
+# include <sys/socket.h>
+# endif
# if defined(USE_SOCKS) && defined(I_SOCKS)
# include <socks.h>
# endif
# if defined(NeXT) || defined(__NeXT__)
# include <netinet/in_systm.h>
# 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 <netinet/in.h>
# endif
# ifdef I_NETDB
-# include <netdb.h>
+# if !defined(ultrix) /* Avoid double definition. */
+# include <netdb.h>
+# endif
# endif
# ifdef I_ARPA_INET
# include <arpa/inet.h>
{
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))) {
+ if (!ok && (phe = gethostbyname(host)) &&
+ phe->h_addrtype == AF_INET && phe->h_length == 4) {
Copy( phe->h_addr, &ip_address, phe->h_length, char );
ok = 1;
}
* 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),
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! */
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;
*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));
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