]> granicus.if.org Git - php/commitdiff
- Added the lchown() and lchgrp() functions which change permissions and group
authorDerick Rethans <derick@php.net>
Wed, 4 Jan 2006 12:22:23 +0000 (12:22 +0000)
committerDerick Rethans <derick@php.net>
Wed, 4 Jan 2006 12:22:23 +0000 (12:22 +0000)
  permissions on symbolic links.
#- We'll also add this to PHP 5.1.3? or PHP 5.2, so I didn't add it to NEWS.

TSRM/tsrm_virtual_cwd.c
TSRM/tsrm_virtual_cwd.h
configure.in
ext/standard/basic_functions.c
ext/standard/filestat.c
ext/standard/php_filestat.h

index 5d9f04bb4dcf7c8bc6a448aedf21a263bff01b02..8aa21905ddadc4d82a355e07793944e7d34072b1 100644 (file)
@@ -777,7 +777,7 @@ CWD_API int virtual_chmod(const char *filename, mode_t mode TSRMLS_DC)
 }
 
 #if !defined(TSRM_WIN32) && !defined(NETWARE)
-CWD_API int virtual_chown(const char *filename, uid_t owner, gid_t group TSRMLS_DC)
+CWD_API int virtual_chown(const char *filename, uid_t owner, gid_t group, int link TSRMLS_DC)
 {
        cwd_state new_state;
        int ret;
@@ -785,7 +785,15 @@ CWD_API int virtual_chown(const char *filename, uid_t owner, gid_t group TSRMLS_
        CWD_STATE_COPY(&new_state, &CWDG(cwd));
        virtual_file_ex(&new_state, filename, NULL, 0);
 
-       ret = chown(new_state.cwd, owner, group);
+       if (link) {
+#if HAVE_LCHOWN
+               ret = lchown(new_state.cwd, owner, group);
+#else
+               ret = -1;
+#endif
+       } else {
+               ret = chown(new_state.cwd, owner, group);
+       }
 
        CWD_STATE_FREE(&new_state);
        return ret;
index 2b64cf4336eaeffcd3ffbfec78c5e8d76614db39..c35131976264e66d1a7144fe7f611244b397b295 100644 (file)
@@ -190,7 +190,7 @@ CWD_API int virtual_utime(const char *filename, struct utimbuf *buf TSRMLS_DC);
 #endif
 CWD_API int virtual_chmod(const char *filename, mode_t mode TSRMLS_DC);
 #if !defined(TSRM_WIN32) && !defined(NETWARE)
-CWD_API int virtual_chown(const char *filename, uid_t owner, gid_t group TSRMLS_DC);
+CWD_API int virtual_chown(const char *filename, uid_t owner, gid_t group, int link TSRMLS_DC);
 #endif
 
 CWD_API int virtual_file_ex(cwd_state *state, const char *path, verify_path_func verify_path, int use_realpath);
@@ -262,7 +262,8 @@ extern virtual_cwd_globals cwd_globals;
 #endif
 #define VCWD_CHMOD(path, mode) virtual_chmod(path, mode TSRMLS_CC)
 #if !defined(TSRM_WIN32) && !defined(NETWARE)
-#define VCWD_CHOWN(path, owner, group) virtual_chown(path, owner, group TSRMLS_CC)
+#define VCWD_CHOWN(path, owner, group) virtual_chown(path, owner, group, 0 TSRMLS_CC)
+#define VCWD_LCHOWN(path, owner, group) virtual_chown(path, owner, group, 1 TSRMLS_CC)
 #endif
 
 #else
@@ -305,6 +306,7 @@ extern virtual_cwd_globals cwd_globals;
 #define VCWD_CHMOD(path, mode) chmod(path, mode)
 #if !defined(TSRM_WIN32) && !defined(NETWARE)
 #define VCWD_CHOWN(path, owner, group) chown(path, owner, group)
+#define VCWD_LCHOWN(path, owner, group) lchown(path, owner, group)
 #endif
 
 #endif
index 8adbfe00d2c481fced5431a7c663b48dd5a4f7a8..f6442aaecbaa094621ee6c943b7ad8686d8a91fa 100644 (file)
@@ -482,6 +482,7 @@ isascii \
 link \
 localtime_r \
 lockf \
+lchown \
 lrand48 \
 memcpy \
 memmove \
index 55106d26cc62c47ab83ddb9f91a187159acc74e0..5943d37b4e6475c4143e97b4d37df924e7206b4f 100644 (file)
@@ -695,6 +695,12 @@ zend_function_entry basic_functions[] = {
 #ifndef NETWARE
        PHP_FE(chown,                                                                                                                   NULL)
        PHP_FE(chgrp,                                                                                                                   NULL)
+#endif
+#if HAVE_LCHOWN
+       PHP_FE(lchown,                                                                                                                  NULL)
+#endif
+#if HAVE_LCHOWN
+       PHP_FE(lchgrp,                                                                                                                  NULL)
 #endif
        PHP_FE(chmod,                                                                                                                   NULL)
 #if HAVE_UTIME
index 04130abcb2e28ee0a9460b036af01567674ef36a..94460b4677d001d301a8ffa4499ee238d2cb994b 100644 (file)
@@ -323,12 +323,9 @@ PHP_FUNCTION(disk_free_space)
 }
 /* }}} */
 
-/* {{{ proto bool chgrp(string filename, mixed group)
-   Change file group */
-#ifndef NETWARE
-PHP_FUNCTION(chgrp)
+
+static void php_do_chgrp(INTERNAL_FUNCTION_PARAMETERS, int do_lchgrp)
 {
-#if !defined(WINDOWS)
        zval **filename, **group;
        gid_t gid;
        struct group *gr=NULL;
@@ -360,25 +357,48 @@ PHP_FUNCTION(chgrp)
                RETURN_FALSE;
        }
 
-       ret = VCWD_CHOWN(Z_STRVAL_PP(filename), -1, gid);
+       if (do_lchgrp) {
+               ret = VCWD_LCHOWN(Z_STRVAL_PP(filename), -1, gid);
+       } else {
+               ret = VCWD_CHOWN(Z_STRVAL_PP(filename), -1, gid);
+       }
        if (ret == -1) {
                php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", strerror(errno));
                RETURN_FALSE;
        }
        RETURN_TRUE;
+}
+
+#ifndef NETWARE
+/* {{{ proto bool chgrp(string filename, mixed group)
+   Change file group */
+PHP_FUNCTION(chgrp)
+{
+#if !defined(WINDOWS)
+       php_do_chgrp(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0);
 #else
        RETURN_FALSE;
 #endif
 }
+/* }}} */
+
+/* {{{ proto bool lchgrp(string filename, mixed group)
+   Change symlink group */
+#if HAVE_LCHOWN
+PHP_FUNCTION(lchgrp)
+{
+# if !defined(WINDOWS)
+       php_do_chgrp(INTERNAL_FUNCTION_PARAM_PASSTHRU, 1);
+# else
+       RETURN_FALSE;
+# endif
+}
 #endif
 /* }}} */
+#endif
 
-/* {{{ proto bool chown (string filename, mixed user)
-   Change file owner */
-#ifndef NETWARE
-PHP_FUNCTION(chown)
+static void php_do_chown(INTERNAL_FUNCTION_PARAMETERS, int do_lchown)
 {
-#if !defined(WINDOWS)
        zval **filename, **user;
        int ret;
        uid_t uid;
@@ -410,16 +430,46 @@ PHP_FUNCTION(chown)
                RETURN_FALSE;
        }
 
-       ret = VCWD_CHOWN(Z_STRVAL_PP(filename), uid, -1);
+       if (do_lchown) {
+               ret = VCWD_LCHOWN(Z_STRVAL_PP(filename), uid, -1);
+       } else {
+               ret = VCWD_CHOWN(Z_STRVAL_PP(filename), uid, -1);
+       }
        if (ret == -1) {
                php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", strerror(errno));
                RETURN_FALSE;
        }
+}
+
+#ifndef NETWARE
+/* {{{ proto bool chown (string filename, mixed user)
+   Change file owner */
+PHP_FUNCTION(chown)
+{
+#if !defined(WINDOWS)
+       RETVAL_TRUE;
+       php_do_chown(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0);
+#else
+       RETURN_FALSE;
 #endif
-       RETURN_TRUE;
+}
+/* }}} */
+
+/* {{{ proto bool chown (string filename, mixed user)
+   Change file owner */
+#if HAVE_LCHOWN
+PHP_FUNCTION(lchown)
+{
+# if !defined(WINDOWS)
+       RETVAL_TRUE;
+       php_do_chown(INTERNAL_FUNCTION_PARAM_PASSTHRU, 1);
+# else
+       RETURN_FALSE;
+# endif
 }
 #endif
 /* }}} */
+#endif
 
 /* {{{ proto bool chmod(string filename, int mode)
    Change file mode */
index 66d690a5d018f18888422017dc4c25fec104f268..4c18392d062bc9e68a40557b70b38e0fc4196033 100644 (file)
@@ -47,9 +47,18 @@ PHP_FUNCTION(disk_total_space);
 PHP_FUNCTION(disk_free_space);
 PHP_FUNCTION(chown);
 PHP_FUNCTION(chgrp);
+#if HAVE_LCHOWN
+PHP_FUNCTION(lchown);
+#endif
+#if HAVE_LCHOWN
+PHP_FUNCTION(lchgrp);
+#endif
 PHP_FUNCTION(chmod);
 #if HAVE_UTIME
 PHP_FUNCTION(touch);
+# if HAVE_LTOUCH
+PHP_FUNCTION(ltouch);
+# endif
 #endif
 PHP_FUNCTION(clearstatcache);