pollita         Sat Nov 29 12:16:59 2003 EDT

  Modified files:              
    /php-src/ext/standard       ftp_fopen_wrapper.c 
  Log:
  Finish off ftp://'s url_stat support
  
Index: php-src/ext/standard/ftp_fopen_wrapper.c
diff -u php-src/ext/standard/ftp_fopen_wrapper.c:1.64 
php-src/ext/standard/ftp_fopen_wrapper.c:1.65
--- php-src/ext/standard/ftp_fopen_wrapper.c:1.64       Fri Nov 28 18:25:26 2003
+++ php-src/ext/standard/ftp_fopen_wrapper.c    Sat Nov 29 12:16:58 2003
@@ -18,7 +18,7 @@
    |          Sara Golemon <[EMAIL PROTECTED]>                              |
    +----------------------------------------------------------------------+
  */
-/* $Id: ftp_fopen_wrapper.c,v 1.64 2003/11/28 23:25:26 pollita Exp $ */
+/* $Id: ftp_fopen_wrapper.c,v 1.65 2003/11/29 17:16:58 pollita Exp $ */
 
 #include "php.h"
 #include "php_globals.h"
@@ -721,14 +721,23 @@
 
        /* If ssb is NULL then someone is misbehaving */
        if (!ssb) return -1;
-       memset(ssb, 0, sizeof(php_stream_statbuf));
 
-       stream = php_ftp_fopen_connect(wrapper, url, "r", 0, NULL, NULL, context, 
&resource, NULL, NULL TSRMLS_CC);
+       stream = php_ftp_fopen_connect(wrapper, url, "r", 0, NULL, context, NULL, 
&resource, NULL, NULL TSRMLS_CC);
        if (!stream) {
                goto stat_errexit;
        }
 
-       /* Size is the only reliable attribute returned by FTP */
+       ssb->sb.st_mode = 0644;                                                        
         /* FTP won't give us a valid mode, so aproximate one based on being readable 
*/
+       php_stream_write_string(stream, "CWD ");                                /* If 
we can CWD to it, it's a directory (maybe a link, but we can't tell) */
+       php_stream_write_string(stream, resource->path);
+       php_stream_write_string(stream, "\r\n");
+       result = GET_FTP_RESULT(stream);
+       if (result < 200 || result > 299) {
+               ssb->sb.st_mode |= S_IFREG;
+       } else {
+               ssb->sb.st_mode |= S_IFDIR;
+       }
+
        php_stream_write_string(stream, "SIZE ");
        if (resource->path != NULL) {
                php_stream_write_string(stream, resource->path);
@@ -736,13 +745,30 @@
                php_stream_write_string(stream, "/");
        }
        php_stream_write_string(stream, "\r\n");
-
        result = GET_FTP_RESULT(stream);
        if (result < 200 || result > 299) {
-               goto stat_errexit;
+               /* Failure either means it doesn't exist 
+                  or it's a directory and this server
+                  fails on listing directory sizes */
+               if (ssb->sb.st_mode & S_IFDIR) {
+                       ssb->sb.st_size = 0;
+               } else {
+                       goto stat_errexit;
+               }
+       } else {
+               ssb->sb.st_size = atoi(tmp_line + 4);
        }
 
-       sscanf(tmp_line + 4, "%d", (int *)&(ssb->sb.st_size));
+       ssb->sb.st_ino = 0;                                             /* Unknown 
values */
+       ssb->sb.st_uid = 0;
+       ssb->sb.st_gid = 0;
+       ssb->sb.st_atime = -1;
+       ssb->sb.st_mtime = -1;
+       ssb->sb.st_ctime = -1;
+       ssb->sb.st_nlink = 1;
+       ssb->sb.st_rdev = -1;
+       ssb->sb.st_blksize = 4096;                              /* Guess since FTP 
won't expose this information */
+       ssb->sb.st_blocks = ceil(ssb->sb.st_size / ssb->sb.st_blksize);
 
        php_stream_close(stream);
        php_url_free(resource);

-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to