This union ipbox thingy in ftp.c makes a bunch of assumptions of
wordsize and endianness, it does not work on my platform Solaris 8 in
64bit mode.

Proposed patch, this should be as portable as possible since s_addr
and sin_port must be in network byte order:

diff -ur php-4.0.6/ext/ftp/ftp.c php-4.0.6.new/ext/ftp/ftp.c
--- php-4.0.6/ext/ftp/ftp.c     Fri Nov  3 22:53:24 2000
+++ php-4.0.6.new/ext/ftp/ftp.c Thu Jul 26 18:05:19 2001
@@ -101,14 +101,6 @@
 static char**          ftp_genlist(ftpbuf_t *ftp,
                                const char *cmd, const char *path);
 
-/* IP and port conversion box */
-union ipbox {
-       unsigned long   l[2];
-       unsigned short  s[4];
-       unsigned char   c[8];
-};
-
-
 ftpbuf_t*
 ftp_open(const char *host, short port)
 {
@@ -454,8 +446,7 @@
 ftp_pasv(ftpbuf_t *ftp, int pasv)
 {
        char                    *ptr;
-       union ipbox             ipbox;
-       unsigned long           b[6];
+       unsigned long           b1,b2,b3,b4,b5,b6;
        int                     n;
 
        if (ftp == NULL)
@@ -476,17 +467,14 @@
        /* parse out the IP and port */
        for (ptr = ftp->inbuf; *ptr && !isdigit(*ptr); ptr++);
        n = sscanf(ptr, "%lu,%lu,%lu,%lu,%lu,%lu",
-               &b[0], &b[1], &b[2], &b[3], &b[4], &b[5]);
+               &b1, &b2, &b3, &b4, &b5, &b6);
        if (n != 6)
                return 0;
 
-       for (n=0; n<6; n++)
-               ipbox.c[n] = (unsigned char) b[n];
-
        memset(&ftp->pasvaddr, 0, sizeof(ftp->pasvaddr));
-       ftp->pasvaddr.sin_family = AF_INET;
-       ftp->pasvaddr.sin_addr.s_addr = ipbox.l[0];
-       ftp->pasvaddr.sin_port = ipbox.s[2];
+       ftp->pasvaddr.sin_family      = AF_INET;
+       ftp->pasvaddr.sin_addr.s_addr = b1 << 24 | b2 << 16 | b3 << 8 | b4;
+       ftp->pasvaddr.sin_port        = b5 << 8 | b6;
 
        ftp->pasv = 2;
 
@@ -990,7 +978,6 @@
        databuf_t               *data;
        struct sockaddr_in      addr;
        int                     size;
-       union ipbox             ipbox;
        char                    arg[sizeof("255,255,255,255,255,255")];
 
 
@@ -1062,11 +1049,13 @@
        data->listener = fd;
 
        /* send the PORT */
-       ipbox.l[0] = ftp->localaddr.s_addr;
-       ipbox.s[2] = addr.sin_port;
        sprintf(arg, "%u,%u,%u,%u,%u,%u",
-               ipbox.c[0], ipbox.c[1], ipbox.c[2], ipbox.c[3],
-               ipbox.c[4], ipbox.c[5]);
+               ftp->localaddr.s_addr >> 24 & 0xff,
+               ftp->localaddr.s_addr >> 16 & 0xff,
+               ftp->localaddr.s_addr >>  8 & 0xff,
+               ftp->localaddr.s_addr >>  0 & 0xff,
+               addr.sin_port         >>  8 & 0xff,
+               addr.sin_port         >>  0 & 0xff);
 
        if (!ftp_putcmd(ftp, "PORT", arg))
                goto bail;

-- 
 - Terje
[EMAIL PROTECTED]

-- 
PHP Development Mailing List <http://www.php.net/>
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
To contact the list administrators, e-mail: [EMAIL PROTECTED]

Reply via email to