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]