]> git.saurik.com Git - apple/libc.git/blobdiff - posix1e/acl_file.c
Libc-1158.20.4.tar.gz
[apple/libc.git] / posix1e / acl_file.c
index 7948bc151a2a5736f071574a3fa202f3300a2558..6b62d13fb9dc1b36f096be67610b7401d4603133 100644 (file)
@@ -37,8 +37,8 @@
 #include "aclvar.h"
 
 static acl_t   acl_get_file1(const char *path, acl_type_t acl_type, int follow);
-static int     acl_set_file1(const char *path, acl_type_t acl_type, acl_t acl, int follow);
 
+int acl_delete_fd_np(int filedes, acl_type_t type);
 int
 acl_delete_fd_np(int filedes, acl_type_t type)
 {
@@ -46,6 +46,7 @@ acl_delete_fd_np(int filedes, acl_type_t type)
        return(-1);
 }
 
+int acl_delete_file_np(const char *path, acl_type_t type);
 int
 acl_delete_file_np(const char *path, acl_type_t type)
 {
@@ -53,6 +54,7 @@ acl_delete_file_np(const char *path, acl_type_t type)
        return(-1);
 }
 
+int acl_delete_link_np(const char *path, acl_type_t type);
 int
 acl_delete_link_np(const char *path, acl_type_t type)
 {
@@ -143,17 +145,12 @@ acl_set_fd(int fd, acl_t acl)
        return(acl_set_fd_np(fd, acl, ACL_TYPE_EXTENDED));
 }
 
-static int
-acl_set_file1(const char *path, acl_type_t acl_type, acl_t acl, int follow)
+int
+acl_set_file(const char *path, acl_type_t acl_type, acl_t acl)
 {
        filesec_t       fsec;
        int             error;
 
-       if (follow == 0) {              /* XXX this requires some thought - can links have ACLs? */
-               errno = ENOTSUP;
-               return(-1);
-       }
-       
        if ((fsec = filesec_init()) == NULL)
                return(-1);
        if (filesec_set_property(fsec, FILESEC_ACL, &acl) != 0) {
@@ -165,16 +162,18 @@ acl_set_file1(const char *path, acl_type_t acl_type, acl_t acl, int follow)
        return((error == 0) ? 0 : -1);
 }
 
-int
-acl_set_file(const char *path, acl_type_t acl_type, acl_t acl)
-{
-       return(acl_set_file1(path, acl_type, acl, 1));
-}
-
 int
 acl_set_link_np(const char *path, acl_type_t acl_type, acl_t acl)
 {
-       return(acl_set_file1(path, acl_type, acl, 0));
+       struct stat s;
+
+       if(lstat(path, &s) < 0)
+               return(-1);
+       if(S_ISLNK(s.st_mode)) {
+               errno = ENOTSUP;
+               return(-1);
+       }
+       return(acl_set_file(path, acl_type, acl));
 }
 
 /*