OS/2 socket fixes.
[p5sagit/p5-mst-13.2.git] / ext / Socket / Socket.xs
index b2b1455..336e6c4 100644 (file)
@@ -929,12 +929,37 @@ 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;
        len = strlen(pathname);
        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);
+           else if (len < 8 
+                    || pathname[7] != '/' && pathname[7] != '\\'
+                    || !strnicmp(pathname + 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 );
+
+           s = sun_ad.sun_path + off - 1;
+           e = s + len + 1;
+           while (++s < e)
+               if (*s = '/')
+                   *s = '\\';
+       }
+#  else        /* !( defined OS2 ) */ 
        Copy( pathname, sun_ad.sun_path, len, char );
+#  endif
        ST(0) = sv_2mortal(newSVpvn((char *)&sun_ad, sizeof sun_ad));
 #else
        ST(0) = (SV *) not_here("pack_sockaddr_un");