{{{ proto
part updated...

Faisal

At 07:30 PM 5/17/2002, Faisal Nasim wrote:
>Hi,
>
>I don't have access to a Linux machine at the moment so I tested
>it out only on Win32/XP.
>
>Could somebody please quickly check and commit it...?
>
>Addition: ftruncate() can take a string parameter as well... I have
>added the safe_mode check (actually borrowed from unlink).
>
>That {{{ proto thing needs to docs needs to be updated as well.
>Maybe 'mixed' instead of 'resource'?
>
>Thanks!
>
>Faisal
>
>
>--
>PHP Development Mailing List <http://www.php.net/>
>To unsubscribe, visit: http://www.php.net/unsub.php
--- tests\file.c        Sun May 12 21:08:32 2002
+++ file.c      Fri May 17 19:44:48 2002
@@ -1748,31 +1748,65 @@
 }
 /* }}} */
 
-/* {{{ proto int ftruncate(resource fp, int size)
-   Truncate file to 'size' length */
+/* {{{ proto int ftruncate(mixed file, int size)
+   Truncate file (pathname or file pointer) to 'size' length */
 PHP_NAMED_FUNCTION(php_if_ftruncate)
 {
-       zval **fp , **size;
+       zval **file , **size;
        short int ret;
-       int type;
+       int type , fd;
        void *what;
+       char* filename;
 
-       if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &fp, &size) == FAILURE) {
+       if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &file, &size) == 
+FAILURE) {
                WRONG_PARAM_COUNT;
        }
-       /* XXX: add stream support --Wez. */
 
-       what = zend_fetch_resource(fp TSRMLS_CC,-1, "File-Handle", &type, 3, le_fopen, 
le_popen, le_socket);
-       ZEND_VERIFY_RESOURCE(what);
+       convert_to_long_ex(size);
+
+       if ( Z_TYPE_PP(file) == IS_STRING )
+       {
+               convert_to_string_ex(file);
+               filename = Z_STRVAL_PP(file);
+
+               /* Safe-mode check, borrowed from ulink */
+               if (PG(safe_mode) && !php_checkuid(Z_STRVAL_PP(file), NULL, 
+CHECKUID_CHECK_FILE_AND_DIR)) {
+                       RETURN_FALSE;
+               }
 
-       if (type == le_socket) {
-               php_error(E_WARNING, "can't truncate sockets!");
-               RETURN_FALSE;
+               if ( Z_STRLEN_PP(file) == 0 )
+               {
+                       php_error(E_WARNING, "ftruncate() requires non-empty string or 
+a valid file-handle");
+                       RETURN_FALSE;
+               }
+                       
+               /* Borrowed from the copy routine */
+#ifdef PHP_WIN32
+               if ((fd=VCWD_OPEN_MODE(filename, _O_WRONLY|_O_CREAT|_O_BINARY, 
+_S_IWRITE))==-1) {
+#else
+               if ((fd=VCWD_OPEN(filename, O_WRONLY))==-1) {
+#endif
+                       php_error(E_WARNING, "Unable to open '%s':  %s", filename, 
+strerror(errno));
+                       close(fd);
+                       RETURN_FALSE;
+               }
+
+               ret = ftruncate ( fd , Z_LVAL_PP(size) );
+               close ( fd );
        }
+       else
+       {
+               /* XXX: add stream support --Wez. */
+               what = zend_fetch_resource(file TSRMLS_CC,-1, "File-Handle", &type, 3, 
+le_fopen, le_popen, le_socket);
+               ZEND_VERIFY_RESOURCE(what);
 
-       convert_to_long_ex(size);
+               if (type == le_socket) {
+                       php_error(E_WARNING, "can't truncate sockets!");
+                       RETURN_FALSE;
+               }
 
-       ret = ftruncate(fileno((FILE *) what), Z_LVAL_PP(size));
+               ret = ftruncate(fileno((FILE *) what), Z_LVAL_PP(size));
+       }
        RETURN_LONG(ret + 1);
 }
 /* }}} */
-- 
PHP Development Mailing List <http://www.php.net/>
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to