|
|
|
@ -790,7 +790,6 @@ int |
|
|
|
ftp_get(ftpbuf_t *ftp, php_stream *outstream, const char *path, ftptype_t type, int resumepos TSRMLS_DC) |
|
|
|
{ |
|
|
|
databuf_t *data = NULL; |
|
|
|
char *ptr; |
|
|
|
int lastch; |
|
|
|
size_t rcvd; |
|
|
|
char arg[11]; |
|
|
|
@ -840,22 +839,45 @@ ftp_get(ftpbuf_t *ftp, php_stream *outstream, const char *path, ftptype_t type, |
|
|
|
} |
|
|
|
|
|
|
|
if (type == FTPTYPE_ASCII) { |
|
|
|
for (ptr = data->buf; rcvd; rcvd--, ptr++) { |
|
|
|
if (lastch == '\r' && *ptr != '\n') |
|
|
|
char *s; |
|
|
|
char *ptr = data->buf; |
|
|
|
char *e = ptr + rcvd; |
|
|
|
/* logic depends on the OS EOL |
|
|
|
* Win32 -> \r\n |
|
|
|
* Everything Else \n |
|
|
|
*/ |
|
|
|
#ifdef PHP_WIN32 |
|
|
|
while ((s = strpbrk(ptr, "\r\n"))) { |
|
|
|
if (*s == '\n') { |
|
|
|
php_stream_putc(outstream, '\r'); |
|
|
|
if (*ptr != '\r') |
|
|
|
php_stream_putc(outstream, *ptr); |
|
|
|
lastch = *ptr; |
|
|
|
} else if (*s == '\r' && *(s + 1) == '\n') { |
|
|
|
s++; |
|
|
|
} |
|
|
|
s++; |
|
|
|
php_stream_write(outstream, ptr, (s - ptr)); |
|
|
|
if (*(s - 1) == '\r') { |
|
|
|
php_stream_putc(outstream, '\n'); |
|
|
|
} |
|
|
|
ptr = s; |
|
|
|
} |
|
|
|
#else |
|
|
|
while ((s = memchr(ptr, '\r', (e - ptr)))) { |
|
|
|
php_stream_write(outstream, ptr, (s - ptr)); |
|
|
|
if (*(s + 1) == '\n') { |
|
|
|
s++; |
|
|
|
} |
|
|
|
php_stream_putc(outstream, '\n'); |
|
|
|
ptr = s + 1; |
|
|
|
} |
|
|
|
#endif |
|
|
|
if (ptr < e) { |
|
|
|
php_stream_write(outstream, ptr, (e - ptr)); |
|
|
|
} |
|
|
|
} else if (rcvd != php_stream_write(outstream, data->buf, rcvd)) { |
|
|
|
goto bail; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
if (type == FTPTYPE_ASCII && lastch == '\r') { |
|
|
|
php_stream_putc(outstream, '\r'); |
|
|
|
} |
|
|
|
|
|
|
|
ftp->data = data = data_close(ftp, data); |
|
|
|
|
|
|
|
if (!ftp_getresp(ftp) || (ftp->resp != 226 && ftp->resp != 250)) { |
|
|
|
|