inet_aton() should do DNS lookup only if arg isn't a dotted-quad
[p5sagit/p5-mst-13.2.git] / ext / Socket / Socket.xs
index d37208f..cefcb24 100644 (file)
@@ -323,8 +323,14 @@ constant(char *name, int arg)
     case 'L':
        break;
     case 'M':
+       if (strEQ(name, "MSG_CTRUNC"))
+#if defined(MSG_CTRUNC) || defined(HAS_GNULIBC) /* XXX it's an enum */
+           return MSG_CTRUNC;
+#else
+           goto not_there;
+#endif
        if (strEQ(name, "MSG_DONTROUTE"))
-#ifdef MSG_DONTROUTE
+#if defined(MSG_DONTROUTE) || defined(HAS_GNULIBC) /* XXX it's an enum */
            return MSG_DONTROUTE;
 #else
            goto not_there;
@@ -336,17 +342,23 @@ constant(char *name, int arg)
            goto not_there;
 #endif
        if (strEQ(name, "MSG_OOB"))
-#ifdef MSG_OOB
+#if defined(MSG_OOB) || defined(HAS_GNULIBC) /* XXX it's an enum */
            return MSG_OOB;
 #else
            goto not_there;
 #endif
        if (strEQ(name, "MSG_PEEK"))
-#ifdef MSG_PEEK
+#if defined(MSG_PEEK) || defined(HAS_GNULIBC) /* XXX it's an enum */
            return MSG_PEEK;
 #else
            goto not_there;
 #endif
+       if (strEQ(name, "MSG_PROXY"))
+#if defined(MSG_PROXY) || defined(HAS_GNULIBC) /* XXX it's an enum */
+           return MSG_PROXY;
+#else
+           goto not_there;
+#endif
        break;
     case 'N':
        break;
@@ -699,13 +711,11 @@ inet_aton(host)
        {
        struct in_addr ip_address;
        struct hostent * phe;
-       int ok;
+       int ok = inet_aton(host, &ip_address);
 
-       if (phe = gethostbyname(host)) {
+       if (!ok && (phe = gethostbyname(host))) {
                Copy( phe->h_addr, &ip_address, phe->h_length, char );
                ok = 1;
-       } else {
-               ok = inet_aton(host, &ip_address);
        }
 
        ST(0) = sv_newmortal();
@@ -742,9 +752,13 @@ pack_sockaddr_un(pathname)
        {
 #ifdef I_SYS_UN
        struct sockaddr_un sun_ad; /* fear using sun */
+       STRLEN len;
        Zero( &sun_ad, sizeof sun_ad, char );
        sun_ad.sun_family = AF_UNIX;
-       Copy( pathname, sun_ad.sun_path, sizeof sun_ad.sun_path, char );
+       len = strlen(pathname);
+       if (len > sizeof(sun_ad.sun_path))
+           len = sizeof(sun_ad.sun_path);
+       Copy( pathname, sun_ad.sun_path, len, char );
        ST(0) = sv_2mortal(newSVpv((char *)&sun_ad, sizeof sun_ad));
 #else
        ST(0) = (SV *) not_here("pack_sockaddr_un");
@@ -758,9 +772,10 @@ unpack_sockaddr_un(sun_sv)
        CODE:
        {
 #ifdef I_SYS_UN
-       STRLEN sockaddrlen;
        struct sockaddr_un addr;
-       char *  sun_ad = SvPV(sun_sv,sockaddrlen);
+       STRLEN sockaddrlen;
+       char * sun_ad = SvPV(sun_sv,sockaddrlen);
+       char * e;
 
        if (sockaddrlen != sizeof(addr)) {
            croak("Bad arg length for %s, length is %d, should be %d",
@@ -775,8 +790,11 @@ unpack_sockaddr_un(sun_sv)
                        "Socket::unpack_sockaddr_un",
                        addr.sun_family,
                        AF_UNIX);
-       } 
-       ST(0) = sv_2mortal(newSVpv(addr.sun_path, strlen(addr.sun_path)));
+       }
+       e = addr.sun_path;
+       while (*e && e < addr.sun_path + sizeof addr.sun_path)
+           ++e;
+       ST(0) = sv_2mortal(newSVpv(addr.sun_path, e - addr.sun_path));
 #else
        ST(0) = (SV *) not_here("unpack_sockaddr_un");
 #endif
@@ -823,7 +841,7 @@ unpack_sockaddr_in(sin_sv)
        port = ntohs(addr.sin_port);
        ip_address = addr.sin_addr;
 
-       EXTEND(sp, 2);
+       EXTEND(SP, 2);
        PUSHs(sv_2mortal(newSViv((IV) port)));
        PUSHs(sv_2mortal(newSVpv((char *)&ip_address,sizeof ip_address)));
        }