Diff for /embedaddon/rsync/lib/sysacls.c between versions 1.1.1.2 and 1.1.1.3

version 1.1.1.2, 2016/11/01 09:54:32 version 1.1.1.3, 2021/03/17 00:32:36
Line 2 Line 2
  * Unix SMB/CIFS implementation.   * Unix SMB/CIFS implementation.
  * Based on the Samba ACL support code.   * Based on the Samba ACL support code.
  * Copyright (C) Jeremy Allison 2000.   * Copyright (C) Jeremy Allison 2000.
 * Copyright (C) 2007-2015 Wayne Davison * Copyright (C) 2007-2020 Wayne Davison
  *   *
  * The permission functions have been changed to get/set all bits via   * The permission functions have been changed to get/set all bits via
  * one call.  Some functions that rsync doesn't need were also removed.   * one call.  Some functions that rsync doesn't need were also removed.
Line 29 Line 29
 #ifdef DEBUG  #ifdef DEBUG
 #undef DEBUG  #undef DEBUG
 #endif  #endif
#define DEBUG(x,y)#define DEBUG(x, y)
   
 void SAFE_FREE(void *mem)  void SAFE_FREE(void *mem)
 {  {
Line 44  void SAFE_FREE(void *mem) Line 44  void SAFE_FREE(void *mem)
   
  The interfaces that each ACL implementation must support are as follows :   The interfaces that each ACL implementation must support are as follows :
   
 int sys_acl_get_entry( SMB_ACL_T theacl, int entry_id, SMB_ACL_ENTRY_T *entry_p) int sys_acl_get_entry(SMB_ACL_T theacl, int entry_id, SMB_ACL_ENTRY_T *entry_p)
 int sys_acl_get_tag_type( SMB_ACL_ENTRY_T entry_d, SMB_ACL_TAG_T *tag_type_p) int sys_acl_get_tag_type(SMB_ACL_ENTRY_T entry_d, SMB_ACL_TAG_T *tag_type_p)
  int sys_acl_get_info(SMB_ACL_ENTRY_T entry, SMB_ACL_TAG_T *tag_type_p, uint32 *bits_p, id_t *u_g_id_p)   int sys_acl_get_info(SMB_ACL_ENTRY_T entry, SMB_ACL_TAG_T *tag_type_p, uint32 *bits_p, id_t *u_g_id_p)
 SMB_ACL_T sys_acl_get_file( const char *path_p, SMB_ACL_TYPE_T type) SMB_ACL_T sys_acl_get_file(const char *path_p, SMB_ACL_TYPE_T type)
  SMB_ACL_T sys_acl_get_fd(int fd)   SMB_ACL_T sys_acl_get_fd(int fd)
 SMB_ACL_T sys_acl_init( int count) SMB_ACL_T sys_acl_init(int count)
 int sys_acl_create_entry( SMB_ACL_T *pacl, SMB_ACL_ENTRY_T *pentry) int sys_acl_create_entry(SMB_ACL_T *pacl, SMB_ACL_ENTRY_T *pentry)
  int sys_acl_set_info(SMB_ACL_ENTRY_T entry, SMB_ACL_TAG_T tag_type, uint32 bits, id_t u_g_id)   int sys_acl_set_info(SMB_ACL_ENTRY_T entry, SMB_ACL_TAG_T tag_type, uint32 bits, id_t u_g_id)
  int sys_acl_set_access_bits(SMB_ACL_ENTRY_T entry, uint32 bits)   int sys_acl_set_access_bits(SMB_ACL_ENTRY_T entry, uint32 bits)
 int sys_acl_valid( SMB_ACL_T theacl ) int sys_acl_valid(SMB_ACL_T theacl)
 int sys_acl_set_file( const char *name, SMB_ACL_TYPE_T acltype, SMB_ACL_T theacl) int sys_acl_set_file(const char *name, SMB_ACL_TYPE_T acltype, SMB_ACL_T theacl)
 int sys_acl_set_fd( int fd, SMB_ACL_T theacl) int sys_acl_set_fd(int fd, SMB_ACL_T theacl)
  int sys_acl_delete_def_file(const char *path)   int sys_acl_delete_def_file(const char *path)
  int sys_acl_free_acl(SMB_ACL_T posix_acl)   int sys_acl_free_acl(SMB_ACL_T posix_acl)
   
Line 65  void SAFE_FREE(void *mem) Line 65  void SAFE_FREE(void *mem)
   
 /* Identity mapping - easy. */  /* Identity mapping - easy. */
   
int sys_acl_get_entry( SMB_ACL_T the_acl, int entry_id, SMB_ACL_ENTRY_T *entry_p)int sys_acl_get_entry(SMB_ACL_T the_acl, int entry_id, SMB_ACL_ENTRY_T *entry_p)
 {  {
        return acl_get_entry( the_acl, entry_id, entry_p);        return acl_get_entry(the_acl, entry_id, entry_p);
 }  }
   
int sys_acl_get_tag_type( SMB_ACL_ENTRY_T entry_d, SMB_ACL_TAG_T *tag_type_p)int sys_acl_get_tag_type(SMB_ACL_ENTRY_T entry_d, SMB_ACL_TAG_T *tag_type_p)
 {  {
        return acl_get_tag_type( entry_d, tag_type_p);        return acl_get_tag_type(entry_d, tag_type_p);
 }  }
   
SMB_ACL_T sys_acl_get_file( const char *path_p, SMB_ACL_TYPE_T type)SMB_ACL_T sys_acl_get_file(const char *path_p, SMB_ACL_TYPE_T type)
 {  {
        return acl_get_file( path_p, type);        return acl_get_file(path_p, type);
 }  }
   
   #if 0
 SMB_ACL_T sys_acl_get_fd(int fd)  SMB_ACL_T sys_acl_get_fd(int fd)
 {  {
         return acl_get_fd(fd);          return acl_get_fd(fd);
 }  }
   #endif
   
 int sys_acl_get_brand( SMB_ACL_T the_acl, int *brand_p)  
 {  
         return acl_get_brand_np(the_acl, brand_p);  
 }  
   
 int sys_acl_get_brand_file( const char *path_p, int *brand_p)  
 {  
         int fd;  
         acl_t acl;  
   
         if ((fd = open(path_p, O_RDONLY|O_NONBLOCK)) < 0)  
                 return -1;  
         if ((acl = acl_get_fd(fd)) == NULL) {  
                 close(fd);  
                 return -1;  
         }  
         close(fd);  
         if (acl_get_brand_np(acl, brand_p) < 0) {  
                 acl_free(acl);  
                 return -1;  
         }  
   
         acl_free(acl);  
         return 0;  
 }  
   
 #if defined(HAVE_ACL_GET_PERM_NP)  #if defined(HAVE_ACL_GET_PERM_NP)
 #define acl_get_perm(p, b) acl_get_perm_np(p, b)  #define acl_get_perm(p, b) acl_get_perm_np(p, b)
 #endif  #endif
Line 138  int sys_acl_get_info(SMB_ACL_ENTRY_T entry, SMB_ACL_TA Line 114  int sys_acl_get_info(SMB_ACL_ENTRY_T entry, SMB_ACL_TA
         return 0;          return 0;
 }  }
   
SMB_ACL_T sys_acl_init( int count)SMB_ACL_T sys_acl_init(int count)
 {  {
         return acl_init(count);          return acl_init(count);
 }  }
   
int sys_acl_create_entry( SMB_ACL_T *pacl, SMB_ACL_ENTRY_T *pentry)int sys_acl_create_entry(SMB_ACL_T *pacl, SMB_ACL_ENTRY_T *pentry)
 {  {
         return acl_create_entry(pacl, pentry);          return acl_create_entry(pacl, pentry);
 }  }
Line 177  int sys_acl_set_access_bits(SMB_ACL_ENTRY_T entry, uin Line 153  int sys_acl_set_access_bits(SMB_ACL_ENTRY_T entry, uin
         return acl_set_permset(entry, permset);          return acl_set_permset(entry, permset);
 }  }
   
int sys_acl_valid( SMB_ACL_T theacl )int sys_acl_valid(SMB_ACL_T theacl)
 {  {
         return acl_valid(theacl);          return acl_valid(theacl);
 }  }
Line 188  int sys_acl_set_file(const char *name, SMB_ACL_TYPE_T  Line 164  int sys_acl_set_file(const char *name, SMB_ACL_TYPE_T 
 }  }
   
 #if 0  #if 0
int sys_acl_set_fd( int fd, SMB_ACL_T theacl)int sys_acl_set_fd(int fd, SMB_ACL_T theacl)
 {  {
         return acl_set_fd(fd, theacl);          return acl_set_fd(fd, theacl);
 }  }
Line 215  int sys_acl_free_acl(SMB_ACL_T the_acl)  Line 191  int sys_acl_free_acl(SMB_ACL_T the_acl) 
  * to be broken on Tru64 so we have to manipulate   * to be broken on Tru64 so we have to manipulate
  * the permission bits in the permset directly.   * the permission bits in the permset directly.
  */   */
int sys_acl_get_entry( SMB_ACL_T the_acl, int entry_id, SMB_ACL_ENTRY_T *entry_p)int sys_acl_get_entry(SMB_ACL_T the_acl, int entry_id, SMB_ACL_ENTRY_T *entry_p)
 {  {
         SMB_ACL_ENTRY_T entry;          SMB_ACL_ENTRY_T entry;
   
Line 232  int sys_acl_get_entry( SMB_ACL_T the_acl, int entry_id Line 208  int sys_acl_get_entry( SMB_ACL_T the_acl, int entry_id
         return errno ? -1 : 0;          return errno ? -1 : 0;
 }  }
   
int sys_acl_get_tag_type( SMB_ACL_ENTRY_T entry_d, SMB_ACL_TAG_T *tag_type_p)int sys_acl_get_tag_type(SMB_ACL_ENTRY_T entry_d, SMB_ACL_TAG_T *tag_type_p)
 {  {
        return acl_get_tag_type( entry_d, tag_type_p);        return acl_get_tag_type(entry_d, tag_type_p);
 }  }
   
SMB_ACL_T sys_acl_get_file( const char *path_p, SMB_ACL_TYPE_T type)SMB_ACL_T sys_acl_get_file(const char *path_p, SMB_ACL_TYPE_T type)
 {  {
         return acl_get_file((char *)path_p, type);          return acl_get_file((char *)path_p, type);
 }  }
Line 270  int sys_acl_get_info(SMB_ACL_ENTRY_T entry, SMB_ACL_TA Line 246  int sys_acl_get_info(SMB_ACL_ENTRY_T entry, SMB_ACL_TA
         return 0;          return 0;
 }  }
   
SMB_ACL_T sys_acl_init( int count)SMB_ACL_T sys_acl_init(int count)
 {  {
         return acl_init(count);          return acl_init(count);
 }  }
   
int sys_acl_create_entry( SMB_ACL_T *pacl, SMB_ACL_ENTRY_T *pentry)int sys_acl_create_entry(SMB_ACL_T *pacl, SMB_ACL_ENTRY_T *pentry)
 {  {
         SMB_ACL_ENTRY_T entry;          SMB_ACL_ENTRY_T entry;
   
Line 310  int sys_acl_set_access_bits(SMB_ACL_ENTRY_T entry, uin Line 286  int sys_acl_set_access_bits(SMB_ACL_ENTRY_T entry, uin
         return acl_set_permset(entry, permset);          return acl_set_permset(entry, permset);
 }  }
   
int sys_acl_valid( SMB_ACL_T theacl )int sys_acl_valid(SMB_ACL_T theacl)
 {  {
         acl_entry_t     entry;          acl_entry_t     entry;
   
         return acl_valid(theacl, &entry);          return acl_valid(theacl, &entry);
 }  }
   
int sys_acl_set_file( const char *name, SMB_ACL_TYPE_T acltype, SMB_ACL_T theacl)int sys_acl_set_file(const char *name, SMB_ACL_TYPE_T acltype, SMB_ACL_T theacl)
 {  {
         return acl_set_file((char *)name, acltype, theacl);          return acl_set_file((char *)name, acltype, theacl);
 }  }
   
 #if 0  #if 0
int sys_acl_set_fd( int fd, SMB_ACL_T theacl)int sys_acl_set_fd(int fd, SMB_ACL_T theacl)
 {  {
         return acl_set_fd(fd, ACL_TYPE_ACCESS, theacl);          return acl_set_fd(fd, ACL_TYPE_ACCESS, theacl);
 }  }
Line 474  SMB_ACL_T sys_acl_get_file(const char *path_p, SMB_ACL Line 450  SMB_ACL_T sys_acl_get_file(const char *path_p, SMB_ACL
          *           *
          * Note: we assume that the acl() system call returned a           * Note: we assume that the acl() system call returned a
          * well formed ACL which is sorted so that all of the           * well formed ACL which is sorted so that all of the
         * access ACL entries preceed any default ACL entries         * access ACL entries precede any default ACL entries
          */           */
         for (naccess = 0; naccess < count; naccess++) {          for (naccess = 0; naccess < count; naccess++) {
                 if (acl_d->acl[naccess].a_type & ACL_DEFAULT)                  if (acl_d->acl[naccess].a_type & ACL_DEFAULT)
Line 726  int sys_acl_set_file(const char *name, SMB_ACL_TYPE_T  Line 702  int sys_acl_set_file(const char *name, SMB_ACL_TYPE_T 
                  * copy the access control and default entries into the buffer                   * copy the access control and default entries into the buffer
                  */                   */
                 memcpy(&acl_buf[0], &acc_acl->acl[0],                  memcpy(&acl_buf[0], &acc_acl->acl[0],
                        acc_acl->count * sizeof(acl_buf[0]));                        acc_acl->count * sizeof acl_buf[0]);
   
                 memcpy(&acl_buf[acc_acl->count], &def_acl->acl[0],                  memcpy(&acl_buf[acc_acl->count], &def_acl->acl[0],
                        def_acl->count * sizeof(acl_buf[0]));                        def_acl->count * sizeof acl_buf[0]);
   
                 /*                  /*
                  * set the ACL_DEFAULT flag on the default entries                   * set the ACL_DEFAULT flag on the default entries
Line 791  int sys_acl_free_acl(SMB_ACL_T acl_d)  Line 767  int sys_acl_free_acl(SMB_ACL_T acl_d) 
   
 #elif defined(HAVE_HPUX_ACLS) /*---------------------------------------------*/  #elif defined(HAVE_HPUX_ACLS) /*---------------------------------------------*/
   
   #ifdef HAVE_DL_H
 #include <dl.h>  #include <dl.h>
   #endif
   
 /*  /*
  * Based on the Solaris/SCO code - with modifications.   * Based on the Solaris/SCO code - with modifications.
Line 819  int sys_acl_free_acl(SMB_ACL_T acl_d)  Line 797  int sys_acl_free_acl(SMB_ACL_T acl_d) 
 /* so it is important to check this and avoid acl()    */  /* so it is important to check this and avoid acl()    */
 /* calls if it isn't there.                            */  /* calls if it isn't there.                            */
   
static BOOL hpux_acl_call_presence(void)#ifdef __TANDEM
 inline int do_acl(const char *path_p, int cmd, int nentries, struct acl *aclbufp)
 {  {
           return acl((char*)path_p, cmd, nentries, aclbufp);
   }
   #define acl(p,c,n,a) do_acl(p,c,n,a)
   #endif
   
   static BOOL hpux_acl_call_presence(void)
   {
   #ifndef __TANDEM
         shl_t handle = NULL;          shl_t handle = NULL;
         void *value;          void *value;
         int ret_val=0;          int ret_val=0;
         static BOOL already_checked=0;          static BOOL already_checked=0;
   
        if(already_checked)        if (already_checked)
                 return True;                  return True;
   
   
         ret_val = shl_findsym(&handle, "acl", TYPE_PROCEDURE, &value);          ret_val = shl_findsym(&handle, "acl", TYPE_PROCEDURE, &value);
   
        if(ret_val != 0) {        if (ret_val != 0) {
                 DEBUG(5, ("hpux_acl_call_presence: shl_findsym() returned %d, errno = %d, error %s\n",                  DEBUG(5, ("hpux_acl_call_presence: shl_findsym() returned %d, errno = %d, error %s\n",
                         ret_val, errno, strerror(errno)));                          ret_val, errno, strerror(errno)));
                DEBUG(5,("hpux_acl_call_presence: acl() system call is not present. Check if you have JFS 3.3 and above?\n"));                DEBUG(5, ("hpux_acl_call_presence: acl() system call is not present. Check if you have JFS 3.3 and above?\n"));
                 return False;                  return False;
         }          }
   
        DEBUG(10,("hpux_acl_call_presence: acl() system call is present. We have JFS 3.3 or above \n"));        DEBUG(10, ("hpux_acl_call_presence: acl() system call is present. We have JFS 3.3 or above \n"));
   
         already_checked = True;          already_checked = True;
   #endif
         return True;          return True;
 }  }
   
Line 908  SMB_ACL_T sys_acl_get_file(const char *path_p, SMB_ACL Line 894  SMB_ACL_T sys_acl_get_file(const char *path_p, SMB_ACL
         int             naccess;        /* # of access ACL entries      */          int             naccess;        /* # of access ACL entries      */
         int             ndefault;       /* # of default ACL entries     */          int             ndefault;       /* # of default ACL entries     */
   
        if(hpux_acl_call_presence() == False) {        if (hpux_acl_call_presence() == False) {
                 /* Looks like we don't have the acl() system call on HPUX.                   /* Looks like we don't have the acl() system call on HPUX. 
                  * May be the system doesn't have the latest version of JFS.                   * May be the system doesn't have the latest version of JFS.
                  */                   */
Line 956  SMB_ACL_T sys_acl_get_file(const char *path_p, SMB_ACL Line 942  SMB_ACL_T sys_acl_get_file(const char *path_p, SMB_ACL
          *           *
          * Note: we assume that the acl() system call returned a           * Note: we assume that the acl() system call returned a
          * well formed ACL which is sorted so that all of the           * well formed ACL which is sorted so that all of the
         * access ACL entries preceed any default ACL entries         * access ACL entries precede any default ACL entries
          */           */
         for (naccess = 0; naccess < count; naccess++) {          for (naccess = 0; naccess < count; naccess++) {
                 if (acl_d->acl[naccess].a_type & ACL_DEFAULT)                  if (acl_d->acl[naccess].a_type & ACL_DEFAULT)
Line 1035  SMB_ACL_T sys_acl_init(int count) Line 1021  SMB_ACL_T sys_acl_init(int count)
          * acl[] array, this actually allocates an ACL with room           * acl[] array, this actually allocates an ACL with room
          * for (count+1) entries           * for (count+1) entries
          */           */
        if ((a = (SMB_ACL_T)SMB_MALLOC(sizeof a[0] + count * sizeof(struct acl))) == NULL) {        if ((a = (SMB_ACL_T)SMB_MALLOC(sizeof a[0] + count * sizeof (struct acl))) == NULL) {
                 errno = ENOMEM;                  errno = ENOMEM;
                 return NULL;                  return NULL;
         }          }
Line 1119  struct hpux_acl_types { Line 1105  struct hpux_acl_types {
  * structures.   * structures.
  * Inputs:   * Inputs:
  *   *
 * acl_count      - Count of ACLs in the array of ACL strucutres. * acl_count      - Count of ACLs in the array of ACL structures.
  * aclp           - Array of ACL structures.   * aclp           - Array of ACL structures.
  * acl_type_count - Pointer to acl_types structure. Should already be   * acl_type_count - Pointer to acl_types structure. Should already be
  *                  allocated.   *                  allocated.
Line 1133  static void hpux_count_obj(int acl_count, struct acl * Line 1119  static void hpux_count_obj(int acl_count, struct acl *
 {  {
         int i;          int i;
   
        memset(acl_type_count, 0, sizeof(struct hpux_acl_types));        memset(acl_type_count, 0, sizeof (struct hpux_acl_types));
   
        for(i=0;i<acl_count;i++) {        for (i = 0; i < acl_count; i++) {
                switch(aclp[i].a_type) {                switch (aclp[i].a_type) {
                 case USER:                   case USER: 
                         acl_type_count->n_user++;                          acl_type_count->n_user++;
                         break;                          break;
Line 1218  static void hpux_swap_acl_entries(struct acl *aclp0, s Line 1204  static void hpux_swap_acl_entries(struct acl *aclp0, s
   
 static BOOL hpux_prohibited_duplicate_type(int acl_type)  static BOOL hpux_prohibited_duplicate_type(int acl_type)
 {  {
        switch(acl_type) {        switch (acl_type) {
                case USER:        case USER:
                case GROUP:        case GROUP:
                case DEF_USER:         case DEF_USER: 
                case DEF_GROUP:        case DEF_GROUP:
                        return True;                return True;
                default:        default:
                        return False;                return False;
         }          }
 }  }
   
Line 1239  static BOOL hpux_prohibited_duplicate_type(int acl_typ Line 1225  static BOOL hpux_prohibited_duplicate_type(int acl_typ
   
 static int hpux_get_needed_class_perm(struct acl *aclp)  static int hpux_get_needed_class_perm(struct acl *aclp)
 {  {
        switch(aclp->a_type) {        switch (aclp->a_type) {
                case USER:         case USER: 
                case GROUP_OBJ:         case GROUP_OBJ: 
                case GROUP:         case GROUP: 
                case DEF_USER_OBJ:         case DEF_USER_OBJ: 
                case DEF_USER:        case DEF_USER:
                case DEF_GROUP_OBJ:         case DEF_GROUP_OBJ: 
                case DEF_GROUP:        case DEF_GROUP:
                case DEF_CLASS_OBJ:        case DEF_CLASS_OBJ:
                case DEF_OTHER_OBJ:         case DEF_OTHER_OBJ: 
                        return aclp->a_perm;                return aclp->a_perm;
                default:         default: 
                        return 0;                return 0;
         }          }
 }  }
   
Line 1280  static int hpux_acl_sort(int acl_count, int calclass,  Line 1266  static int hpux_acl_sort(int acl_count, int calclass, 
 {  {
 #if !defined(HAVE_HPUX_ACLSORT)  #if !defined(HAVE_HPUX_ACLSORT)
         /*          /*
         * The aclsort() system call is availabe on the latest HPUX General         * The aclsort() system call is available on the latest HPUX General
          * Patch Bundles. So for HPUX, we developed our version of acl_sort            * Patch Bundles. So for HPUX, we developed our version of acl_sort 
          * function. Because, we don't want to update to a new            * function. Because, we don't want to update to a new 
          * HPUX GR bundle just for aclsort() call.           * HPUX GR bundle just for aclsort() call.
Line 1290  static int hpux_acl_sort(int acl_count, int calclass,  Line 1276  static int hpux_acl_sort(int acl_count, int calclass, 
         int n_class_obj_perm = 0;          int n_class_obj_perm = 0;
         int i, j;          int i, j;
     
        if(!acl_count) {        if (!acl_count) {
                DEBUG(10,("Zero acl count passed. Returning Success\n"));                DEBUG(10, ("Zero acl count passed. Returning Success\n"));
                 return 0;                  return 0;
         }          }
   
        if(aclp == NULL) {        if (aclp == NULL) {
                DEBUG(0,("Null ACL pointer in hpux_acl_sort. Returning Failure. \n"));                DEBUG(0, ("Null ACL pointer in hpux_acl_sort. Returning Failure. \n"));
                 return -1;                  return -1;
         }          }
   
Line 1308  static int hpux_acl_sort(int acl_count, int calclass,  Line 1294  static int hpux_acl_sort(int acl_count, int calclass, 
          * CLASS_OBJ and OTHER_OBJ            * CLASS_OBJ and OTHER_OBJ 
          */           */
   
        if( (acl_obj_count.n_user_obj  != 1) ||         if (acl_obj_count.n_user_obj != 1
                (acl_obj_count.n_group_obj != 1) ||          || acl_obj_count.n_group_obj != 1
                (acl_obj_count.n_class_obj != 1) ||         || acl_obj_count.n_class_obj != 1
                (acl_obj_count.n_other_obj != 1)          || acl_obj_count.n_other_obj != 1) {
        ) {                DEBUG(0, ("hpux_acl_sort: More than one entry or no entries for \
                DEBUG(0,("hpux_acl_sort: More than one entry or no entries for \ 
 USER OBJ or GROUP_OBJ or OTHER_OBJ or CLASS_OBJ\n"));  USER OBJ or GROUP_OBJ or OTHER_OBJ or CLASS_OBJ\n"));
                 return -1;                  return -1;
         }          }
Line 1321  USER OBJ or GROUP_OBJ or OTHER_OBJ or CLASS_OBJ\n")); Line 1306  USER OBJ or GROUP_OBJ or OTHER_OBJ or CLASS_OBJ\n"));
         /* If any of the default objects are present, there should be only          /* If any of the default objects are present, there should be only
          * one of them each.           * one of them each.
          */           */
        if (acl_obj_count.n_def_user_obj > 1 || acl_obj_count.n_def_group_obj > 1
        if( (acl_obj_count.n_def_user_obj  > 1) || (acl_obj_count.n_def_group_obj > 1) ||          || acl_obj_count.n_def_other_obj > 1 || acl_obj_count.n_def_class_obj > 1) {
                        (acl_obj_count.n_def_other_obj > 1) || (acl_obj_count.n_def_class_obj > 1) ) {                DEBUG(0, ("hpux_acl_sort: More than one entry for DEF_CLASS_OBJ \
                DEBUG(0,("hpux_acl_sort: More than one entry for DEF_CLASS_OBJ \ 
 or DEF_USER_OBJ or DEF_GROUP_OBJ or DEF_OTHER_OBJ\n"));  or DEF_USER_OBJ or DEF_GROUP_OBJ or DEF_OTHER_OBJ\n"));
                 return -1;                  return -1;
         }          }
Line 1335  or DEF_USER_OBJ or DEF_GROUP_OBJ or DEF_OTHER_OBJ\n")) Line 1319  or DEF_USER_OBJ or DEF_GROUP_OBJ or DEF_OTHER_OBJ\n"))
          * Sorting crieteria - First sort by ACL type. If there are multiple entries of           * Sorting crieteria - First sort by ACL type. If there are multiple entries of
          * same ACL type, sort by ACL id.           * same ACL type, sort by ACL id.
          *           *
         * I am using the trival kind of sorting method here because, performance isn't          * I am using the trivial kind of sorting method here because, performance isn't 
          * really effected by the ACLs feature. More over there aren't going to be more           * really effected by the ACLs feature. More over there aren't going to be more
          * than 17 entries on HPUX.            * than 17 entries on HPUX. 
          */           */
   
        for(i=0; i<acl_count;i++) {        for (i = 0; i < acl_count; i++) {
                for (j=i+1; j<acl_count; j++) {                for (j = i+1; j < acl_count; j++) {
                        if( aclp[i].a_type > aclp[j].a_type ) {                        if (aclp[i].a_type > aclp[j].a_type) {
                                 /* ACL entries out of order, swap them */                                  /* ACL entries out of order, swap them */
   
                                 hpux_swap_acl_entries((aclp+i), (aclp+j));                                  hpux_swap_acl_entries((aclp+i), (aclp+j));
                        } else if (aclp[i].a_type == aclp[j].a_type) {
                        } else if ( aclp[i].a_type == aclp[j].a_type ) { 
 
                                 /* ACL entries of same type, sort by id */                                  /* ACL entries of same type, sort by id */
                                if (aclp[i].a_id > aclp[j].a_id) {
                                if(aclp[i].a_id > aclp[j].a_id) { 
                                         hpux_swap_acl_entries((aclp+i), (aclp+j));                                          hpux_swap_acl_entries((aclp+i), (aclp+j));
                                 } else if (aclp[i].a_id == aclp[j].a_id) {                                  } else if (aclp[i].a_id == aclp[j].a_id) {
                                         /* We have a duplicate entry. */                                          /* We have a duplicate entry. */
                                        if(hpux_prohibited_duplicate_type(aclp[i].a_type)) {                                        if (hpux_prohibited_duplicate_type(aclp[i].a_type)) {
                                                 DEBUG(0, ("hpux_acl_sort: Duplicate entry: Type(hex): %x Id: %d\n",                                                  DEBUG(0, ("hpux_acl_sort: Duplicate entry: Type(hex): %x Id: %d\n",
                                                         aclp[i].a_type, aclp[i].a_id));                                                          aclp[i].a_type, aclp[i].a_id));
                                                 return -1;                                                  return -1;
                                         }                                          }
                                 }                                  }
   
                         }                          }
                 }                  }
         }          }
   
         /* set the class obj permissions to the computed one. */          /* set the class obj permissions to the computed one. */
        if(calclass) {        if (calclass) {
                 int n_class_obj_index = -1;                  int n_class_obj_index = -1;
   
                for(i=0;i<acl_count;i++) {                for (i = 0;i < acl_count; i++) {
                         n_class_obj_perm |= hpux_get_needed_class_perm((aclp+i));                          n_class_obj_perm |= hpux_get_needed_class_perm((aclp+i));
                        if (aclp[i].a_type == CLASS_OBJ)
                        if(aclp[i].a_type == CLASS_OBJ) 
                                 n_class_obj_index = i;                                  n_class_obj_index = i;
                 }                  }
                 aclp[n_class_obj_index].a_perm = n_class_obj_perm;                  aclp[n_class_obj_index].a_perm = n_class_obj_perm;
Line 1426  int sys_acl_set_file(const char *name, SMB_ACL_TYPE_T  Line 1404  int sys_acl_set_file(const char *name, SMB_ACL_TYPE_T 
         struct acl      *acl_buf        = NULL;          struct acl      *acl_buf        = NULL;
         int             ret;          int             ret;
   
        if(hpux_acl_call_presence() == False) {        if (hpux_acl_call_presence() == False) {
                 /* Looks like we don't have the acl() system call on HPUX.                   /* Looks like we don't have the acl() system call on HPUX. 
                  * May be the system doesn't have the latest version of JFS.                   * May be the system doesn't have the latest version of JFS.
                  */                   */
Line 1489  int sys_acl_set_file(const char *name, SMB_ACL_TYPE_T  Line 1467  int sys_acl_set_file(const char *name, SMB_ACL_TYPE_T 
                  * copy the access control and default entries into the buffer                   * copy the access control and default entries into the buffer
                  */                   */
                 memcpy(&acl_buf[0], &acc_acl->acl[0],                  memcpy(&acl_buf[0], &acc_acl->acl[0],
                        acc_acl->count * sizeof(acl_buf[0]));                        acc_acl->count * sizeof acl_buf[0]);
   
                 memcpy(&acl_buf[acc_acl->count], &def_acl->acl[0],                  memcpy(&acl_buf[acc_acl->count], &def_acl->acl[0],
                        def_acl->count * sizeof(acl_buf[0]));                        def_acl->count * sizeof acl_buf[0]);
   
                 /*                  /*
                  * set the ACL_DEFAULT flag on the default entries                   * set the ACL_DEFAULT flag on the default entries
Line 1758  int sys_acl_free_acl(SMB_ACL_T acl_d)  Line 1736  int sys_acl_free_acl(SMB_ACL_T acl_d) 
   
 /* Donated by Medha Date, mdate@austin.ibm.com, for IBM */  /* Donated by Medha Date, mdate@austin.ibm.com, for IBM */
   
int sys_acl_get_entry( SMB_ACL_T theacl, int entry_id, SMB_ACL_ENTRY_T *entry_p)int sys_acl_get_entry(SMB_ACL_T theacl, int entry_id, SMB_ACL_ENTRY_T *entry_p)
 {  {
         struct acl_entry_link *link;          struct acl_entry_link *link;
         struct new_acl_entry *entry;          struct new_acl_entry *entry;
Line 1771  int sys_acl_get_entry( SMB_ACL_T theacl, int entry_id, Line 1749  int sys_acl_get_entry( SMB_ACL_T theacl, int entry_id,
                 return -1;                  return -1;
         }          }
   
        DEBUG(10,("This is the count: %d\n",theacl->count));        DEBUG(10, ("This is the count: %d\n", theacl->count));
   
         /* Check if count was previously set to -1. *          /* Check if count was previously set to -1. *
          * If it was, that means we reached the end *           * If it was, that means we reached the end *
          * of the acl last time.                    */           * of the acl last time.                    */
        if(theacl->count == -1)        if (theacl->count == -1)
                return(0);                return 0;
   
         link = theacl;          link = theacl;
         /* To get to the next acl, traverse linked list until index *          /* To get to the next acl, traverse linked list until index *
          * of acl matches the count we are keeping.  This count is  *           * of acl matches the count we are keeping.  This count is  *
          * incremented each time we return an acl entry.            */           * incremented each time we return an acl entry.            */
   
        for(keep_going = 0; keep_going < theacl->count; keep_going++)        for (keep_going = 0; keep_going < theacl->count; keep_going++)
                 link = link->nextp;                  link = link->nextp;
   
         entry = *entry_p =  link->entryp;          entry = *entry_p =  link->entryp;
   
        DEBUG(10,("*entry_p is %d\n",entry_p));        DEBUG(10, ("*entry_p is %d\n", entry_p));
        DEBUG(10,("*entry_p->ace_access is %d\n",entry->ace_access));        DEBUG(10, ("*entry_p->ace_access is %d\n", entry->ace_access));
   
         /* Increment count */          /* Increment count */
         theacl->count++;          theacl->count++;
        if(link->nextp == NULL)        if (link->nextp == NULL)
                 theacl->count = -1;                  theacl->count = -1;
   
        return(1);        return 1;
 }  }
   
int sys_acl_get_tag_type( SMB_ACL_ENTRY_T entry_d, SMB_ACL_TAG_T *tag_type_p)int sys_acl_get_tag_type(SMB_ACL_ENTRY_T entry_d, SMB_ACL_TAG_T *tag_type_p)
 {  {
         /* Initialize tag type */          /* Initialize tag type */
   
         *tag_type_p = -1;          *tag_type_p = -1;
        DEBUG(10,("the tagtype is %d\n",entry_d->ace_id->id_type));        DEBUG(10, ("the tagtype is %d\n", entry_d->ace_id->id_type));
   
         /* Depending on what type of entry we have, *          /* Depending on what type of entry we have, *
          * return tag type.                         */           * return tag type.                         */
        switch(entry_d->ace_id->id_type) {        switch (entry_d->ace_id->id_type) {
         case ACEID_USER:          case ACEID_USER:
                 *tag_type_p = SMB_ACL_USER;                  *tag_type_p = SMB_ACL_USER;
                 break;                  break;
Line 1824  int sys_acl_get_tag_type( SMB_ACL_ENTRY_T entry_d, SMB Line 1802  int sys_acl_get_tag_type( SMB_ACL_ENTRY_T entry_d, SMB
                 break;                  break;
   
         default:          default:
                return(-1);                return -1;
         }          }
   
        return(0);        return 0;
 }  }
   
SMB_ACL_T sys_acl_get_file( const char *path_p, SMB_ACL_TYPE_T type)SMB_ACL_T sys_acl_get_file(const char *path_p, SMB_ACL_TYPE_T type)
 {  {
         struct acl *file_acl = (struct acl *)NULL;          struct acl *file_acl = (struct acl *)NULL;
         struct acl_entry *acl_entry;          struct acl_entry *acl_entry;
Line 1842  SMB_ACL_T sys_acl_get_file( const char *path_p, SMB_AC Line 1820  SMB_ACL_T sys_acl_get_file( const char *path_p, SMB_AC
         int rc = 0;          int rc = 0;
   
         /* AIX has no DEFAULT */          /* AIX has no DEFAULT */
        if  ( type == SMB_ACL_TYPE_DEFAULT ) {        if  (type == SMB_ACL_TYPE_DEFAULT) {
 #ifdef ENOTSUP  #ifdef ENOTSUP
                 errno = ENOTSUP;                  errno = ENOTSUP;
 #else  #else
Line 1853  SMB_ACL_T sys_acl_get_file( const char *path_p, SMB_AC Line 1831  SMB_ACL_T sys_acl_get_file( const char *path_p, SMB_AC
   
         /* Get the acl using statacl */          /* Get the acl using statacl */
     
        DEBUG(10,("Entering sys_acl_get_file\n"));        DEBUG(10, ("Entering sys_acl_get_file\n"));
        DEBUG(10,("path_p is %s\n",path_p));        DEBUG(10, ("path_p is %s\n", path_p));
   
         file_acl = (struct acl *)SMB_MALLOC(BUFSIZ);          file_acl = (struct acl *)SMB_MALLOC(BUFSIZ);
     
        if(file_acl == NULL) {        if (file_acl == NULL) {
                 errno=ENOMEM;                  errno=ENOMEM;
                DEBUG(0,("Error in AIX sys_acl_get_file: %d\n",errno));                DEBUG(0, ("Error in AIX sys_acl_get_file: %d\n", errno));
                return(NULL);                return NULL;
         }          }
   
        memset(file_acl,0,BUFSIZ);        memset(file_acl, 0, BUFSIZ);
   
        rc = statacl((char *)path_p,0,file_acl,BUFSIZ);        rc = statacl((char *)path_p, 0, file_acl, BUFSIZ);
        if(rc == -1) {        if (rc == -1) {
                DEBUG(0,("statacl returned %d with errno %d\n",rc,errno));                DEBUG(0, ("statacl returned %d with errno %d\n", rc, errno));
                 SAFE_FREE(file_acl);                  SAFE_FREE(file_acl);
                return(NULL);                return NULL;
         }          }
   
        DEBUG(10,("Got facl and returned it\n"));        DEBUG(10, ("Got facl and returned it\n"));
   
         /* Point to the first acl entry in the acl */          /* Point to the first acl entry in the acl */
         acl_entry =  file_acl->acl_ext;          acl_entry =  file_acl->acl_ext;
Line 1884  SMB_ACL_T sys_acl_get_file( const char *path_p, SMB_AC Line 1862  SMB_ACL_T sys_acl_get_file( const char *path_p, SMB_AC
          * code.                                          */           * code.                                          */
   
         acl_entry_link_head = acl_entry_link = sys_acl_init(0);          acl_entry_link_head = acl_entry_link = sys_acl_init(0);
        if(acl_entry_link_head == NULL)        if (acl_entry_link_head == NULL)
                return(NULL);                return NULL;
   
         acl_entry_link->entryp = SMB_MALLOC_P(struct new_acl_entry);          acl_entry_link->entryp = SMB_MALLOC_P(struct new_acl_entry);
        if(acl_entry_link->entryp == NULL) {        if (acl_entry_link->entryp == NULL) {
                 SAFE_FREE(file_acl);                  SAFE_FREE(file_acl);
                 errno = ENOMEM;                  errno = ENOMEM;
                DEBUG(0,("Error in AIX sys_acl_get_file is %d\n",errno));                DEBUG(0, ("Error in AIX sys_acl_get_file is %d\n", errno));
                return(NULL);                return NULL;
         }          }
   
        DEBUG(10,("acl_entry is %d\n",acl_entry));        DEBUG(10, ("acl_entry is %d\n", acl_entry));
        DEBUG(10,("acl_last(file_acl) id %d\n",acl_last(file_acl)));        DEBUG(10, ("acl_last(file_acl) id %d\n", acl_last(file_acl)));
   
         /* Check if the extended acl bit is on.   *          /* Check if the extended acl bit is on.   *
          * If it isn't, do not show the           *           * If it isn't, do not show the           *
          * contents of the acl since AIX intends *           * contents of the acl since AIX intends *
          * the extended info to remain unused     */           * the extended info to remain unused     */
   
        if(file_acl->acl_mode & S_IXACL){        if (file_acl->acl_mode & S_IXACL){
                 /* while we are not pointing to the very end */                  /* while we are not pointing to the very end */
                while(acl_entry < acl_last(file_acl)) {                while (acl_entry < acl_last(file_acl)) {
                         /* before we malloc anything, make sure this is  */                          /* before we malloc anything, make sure this is  */
                         /* a valid acl entry and one that we want to map */                          /* a valid acl entry and one that we want to map */
                         idp = id_nxt(acl_entry->ace_id);                          idp = id_nxt(acl_entry->ace_id);
                        if((acl_entry->ace_type == ACC_SPECIFY ||                        if ((acl_entry->ace_type == ACC_SPECIFY || acl_entry->ace_type == ACC_PERMIT)
                                (acl_entry->ace_type == ACC_PERMIT)) && (idp != id_last(acl_entry))) {                         && idp != id_last(acl_entry)) {
                                        acl_entry = acl_nxt(acl_entry);                                acl_entry = acl_nxt(acl_entry);
                                        continue;                                continue;
                         }                          }
   
                         idp = acl_entry->ace_id;                          idp = acl_entry->ace_id;
Line 1921  SMB_ACL_T sys_acl_get_file( const char *path_p, SMB_AC Line 1899  SMB_ACL_T sys_acl_get_file( const char *path_p, SMB_AC
                          * The first entry needs to keep prevp pointing to NULL *                           * The first entry needs to keep prevp pointing to NULL *
                          * and already has entryp allocated.                  */                           * and already has entryp allocated.                  */
   
                        if(acl_entry_link_head->count != 0) {                        if (acl_entry_link_head->count != 0) {
                                 acl_entry_link->nextp = SMB_MALLOC_P(struct acl_entry_link);                                  acl_entry_link->nextp = SMB_MALLOC_P(struct acl_entry_link);
   
                                if(acl_entry_link->nextp == NULL) {                                if (acl_entry_link->nextp == NULL) {
                                         SAFE_FREE(file_acl);                                          SAFE_FREE(file_acl);
                                         errno = ENOMEM;                                          errno = ENOMEM;
                                        DEBUG(0,("Error in AIX sys_acl_get_file is %d\n",errno));                                        DEBUG(0, ("Error in AIX sys_acl_get_file is %d\n", errno));
                                        return(NULL);                                        return NULL;
                                 }                                  }
   
                                 acl_entry_link->nextp->prevp = acl_entry_link;                                  acl_entry_link->nextp->prevp = acl_entry_link;
                                 acl_entry_link = acl_entry_link->nextp;                                  acl_entry_link = acl_entry_link->nextp;
                                 acl_entry_link->entryp = SMB_MALLOC_P(struct new_acl_entry);                                  acl_entry_link->entryp = SMB_MALLOC_P(struct new_acl_entry);
                                if(acl_entry_link->entryp == NULL) {                                if (acl_entry_link->entryp == NULL) {
                                         SAFE_FREE(file_acl);                                          SAFE_FREE(file_acl);
                                         errno = ENOMEM;                                          errno = ENOMEM;
                                        DEBUG(0,("Error in AIX sys_acl_get_file is %d\n",errno));                                        DEBUG(0, ("Error in AIX sys_acl_get_file is %d\n", errno));
                                        return(NULL);                                        return NULL;
                                 }                                  }
                                 acl_entry_link->nextp = NULL;                                  acl_entry_link->nextp = NULL;
                         }                          }
Line 1952  SMB_ACL_T sys_acl_get_file( const char *path_p, SMB_AC Line 1930  SMB_ACL_T sys_acl_get_file( const char *path_p, SMB_AC
     
                         acl_entry_link->entryp->ace_access = acl_entry->ace_access;                          acl_entry_link->entryp->ace_access = acl_entry->ace_access;
     
                        memcpy(acl_entry_link->entryp->ace_id,idp,sizeof(struct ace_id));                        memcpy(acl_entry_link->entryp->ace_id, idp, sizeof (struct ace_id));
   
                         /* The access in the acl entries must be left shifted by *                          /* The access in the acl entries must be left shifted by *
                          * three bites, because they will ultimately be compared *                           * three bites, because they will ultimately be compared *
                          * to S_IRUSR, S_IWUSR, and S_IXUSR.                  */                           * to S_IRUSR, S_IWUSR, and S_IXUSR.                  */
   
                        switch(acl_entry->ace_type){                        switch (acl_entry->ace_type){
                         case ACC_PERMIT:                          case ACC_PERMIT:
                         case ACC_SPECIFY:                          case ACC_SPECIFY:
                                 acl_entry_link->entryp->ace_access = acl_entry->ace_access;                                  acl_entry_link->entryp->ace_access = acl_entry->ace_access;
Line 1968  SMB_ACL_T sys_acl_get_file( const char *path_p, SMB_AC Line 1946  SMB_ACL_T sys_acl_get_file( const char *path_p, SMB_AC
                         case ACC_DENY:                          case ACC_DENY:
                                 /* Since there is no way to return a DENY acl entry *                                  /* Since there is no way to return a DENY acl entry *
                                  * change to PERMIT and then shift.                 */                                   * change to PERMIT and then shift.                 */
                                DEBUG(10,("acl_entry->ace_access is %d\n",acl_entry->ace_access));                                DEBUG(10, ("acl_entry->ace_access is %d\n", acl_entry->ace_access));
                                 acl_entry_link->entryp->ace_access = ~acl_entry->ace_access & 7;                                  acl_entry_link->entryp->ace_access = ~acl_entry->ace_access & 7;
                                DEBUG(10,("acl_entry_link->entryp->ace_access is %d\n",acl_entry_link->entryp->ace_access));                                DEBUG(10, ("acl_entry_link->entryp->ace_access is %d\n", acl_entry_link->entryp->ace_access));
                                 acl_entry_link->entryp->ace_access <<= 6;                                  acl_entry_link->entryp->ace_access <<= 6;
                                 acl_entry_link_head->count++;                                  acl_entry_link_head->count++;
                                 break;                                  break;
                         default:                          default:
                                return(0);                                return 0;
                         }                          }
   
                        DEBUG(10,("acl_entry = %d\n",acl_entry));                        DEBUG(10, ("acl_entry = %d\n", acl_entry));
                        DEBUG(10,("The ace_type is %d\n",acl_entry->ace_type));                        DEBUG(10, ("The ace_type is %d\n", acl_entry->ace_type));
     
                         acl_entry = acl_nxt(acl_entry);                          acl_entry = acl_nxt(acl_entry);
                 }                  }
Line 1989  SMB_ACL_T sys_acl_get_file( const char *path_p, SMB_AC Line 1967  SMB_ACL_T sys_acl_get_file( const char *path_p, SMB_AC
          * part of the acl entries in an acl, they must  *           * part of the acl entries in an acl, they must  *
          * be dummied up to become part of the list.     */           * be dummied up to become part of the list.     */
   
        for( i = 1; i < 4; i++) {        for (i = 1; i < 4; i++) {
                DEBUG(10,("i is %d\n",i));                DEBUG(10, ("i is %d\n", i));
                if(acl_entry_link_head->count != 0) {                if (acl_entry_link_head->count != 0) {
                         acl_entry_link->nextp = SMB_MALLOC_P(struct acl_entry_link);                          acl_entry_link->nextp = SMB_MALLOC_P(struct acl_entry_link);
                        if(acl_entry_link->nextp == NULL) {                        if (acl_entry_link->nextp == NULL) {
                                 SAFE_FREE(file_acl);                                  SAFE_FREE(file_acl);
                                 errno = ENOMEM;                                  errno = ENOMEM;
                                DEBUG(0,("Error in AIX sys_acl_get_file is %d\n",errno));                                DEBUG(0, ("Error in AIX sys_acl_get_file is %d\n", errno));
                                return(NULL);                                return NULL;
                         }                          }
   
                         acl_entry_link->nextp->prevp = acl_entry_link;                          acl_entry_link->nextp->prevp = acl_entry_link;
                         acl_entry_link = acl_entry_link->nextp;                          acl_entry_link = acl_entry_link->nextp;
                         acl_entry_link->entryp = SMB_MALLOC_P(struct new_acl_entry);                          acl_entry_link->entryp = SMB_MALLOC_P(struct new_acl_entry);
                        if(acl_entry_link->entryp == NULL) {                        if (acl_entry_link->entryp == NULL) {
                                 SAFE_FREE(file_acl);                                  SAFE_FREE(file_acl);
                                 errno = ENOMEM;                                  errno = ENOMEM;
                                DEBUG(0,("Error in AIX sys_acl_get_file is %d\n",errno));                                DEBUG(0, ("Error in AIX sys_acl_get_file is %d\n", errno));
                                return(NULL);                                return NULL;
                         }                          }
                 }                  }
   
Line 2016  SMB_ACL_T sys_acl_get_file( const char *path_p, SMB_AC Line 1994  SMB_ACL_T sys_acl_get_file( const char *path_p, SMB_AC
                 new_acl_entry = acl_entry_link->entryp;                  new_acl_entry = acl_entry_link->entryp;
                 idp = new_acl_entry->ace_id;                  idp = new_acl_entry->ace_id;
   
                new_acl_entry->ace_len = sizeof(struct acl_entry);                new_acl_entry->ace_len = sizeof (struct acl_entry);
                 new_acl_entry->ace_type = ACC_PERMIT;                  new_acl_entry->ace_type = ACC_PERMIT;
                idp->id_len = sizeof(struct ace_id);                idp->id_len = sizeof (struct ace_id);
                DEBUG(10,("idp->id_len = %d\n",idp->id_len));                DEBUG(10, ("idp->id_len = %d\n", idp->id_len));
                memset(idp->id_data,0,sizeof(uid_t));                memset(idp->id_data, 0, sizeof (uid_t));
   
                switch(i) {                switch (i) {
                 case 2:                  case 2:
                         new_acl_entry->ace_access = file_acl->g_access << 6;                          new_acl_entry->ace_access = file_acl->g_access << 6;
                         idp->id_type = SMB_ACL_GROUP_OBJ;                          idp->id_type = SMB_ACL_GROUP_OBJ;
Line 2039  SMB_ACL_T sys_acl_get_file( const char *path_p, SMB_AC Line 2017  SMB_ACL_T sys_acl_get_file( const char *path_p, SMB_AC
                         break;                          break;
     
                 default:                  default:
                        return(NULL);                        return NULL;
   
                 }                  }
   
                 acl_entry_link_head->count++;                  acl_entry_link_head->count++;
                DEBUG(10,("new_acl_entry->ace_access = %d\n",new_acl_entry->ace_access));                DEBUG(10, ("new_acl_entry->ace_access = %d\n", new_acl_entry->ace_access));
         }          }
   
         acl_entry_link_head->count = 0;          acl_entry_link_head->count = 0;
         SAFE_FREE(file_acl);          SAFE_FREE(file_acl);
   
        return(acl_entry_link_head);        return acl_entry_link_head;
 }  }
   
 #if 0  #if 0
Line 2067  SMB_ACL_T sys_acl_get_fd(int fd) Line 2045  SMB_ACL_T sys_acl_get_fd(int fd)
   
         /* Get the acl using fstatacl */          /* Get the acl using fstatacl */
         
        DEBUG(10,("Entering sys_acl_get_fd\n"));        DEBUG(10, ("Entering sys_acl_get_fd\n"));
        DEBUG(10,("fd is %d\n",fd));        DEBUG(10, ("fd is %d\n", fd));
         file_acl = (struct acl *)SMB_MALLOC(BUFSIZ);          file_acl = (struct acl *)SMB_MALLOC(BUFSIZ);
   
        if(file_acl == NULL) {        if (file_acl == NULL) {
                 errno=ENOMEM;                  errno=ENOMEM;
                DEBUG(0,("Error in sys_acl_get_fd is %d\n",errno));                DEBUG(0, ("Error in sys_acl_get_fd is %d\n", errno));
                return(NULL);                return NULL;
         }          }
   
        memset(file_acl,0,BUFSIZ);        memset(file_acl, 0, BUFSIZ);
   
        rc = fstatacl(fd,0,file_acl,BUFSIZ);        rc = fstatacl(fd, 0, file_acl, BUFSIZ);
        if(rc == -1) {        if (rc == -1) {
                DEBUG(0,("The fstatacl call returned %d with errno %d\n",rc,errno));                DEBUG(0, ("The fstatacl call returned %d with errno %d\n", rc, errno));
                 SAFE_FREE(file_acl);                  SAFE_FREE(file_acl);
                return(NULL);                return NULL;
         }          }
   
        DEBUG(10,("Got facl and returned it\n"));        DEBUG(10, ("Got facl and returned it\n"));
   
         /* Point to the first acl entry in the acl */          /* Point to the first acl entry in the acl */
   
Line 2097  SMB_ACL_T sys_acl_get_fd(int fd) Line 2075  SMB_ACL_T sys_acl_get_fd(int fd)
          * code.                                        */           * code.                                        */
   
         acl_entry_link_head = acl_entry_link = sys_acl_init(0);          acl_entry_link_head = acl_entry_link = sys_acl_init(0);
        if(acl_entry_link_head == NULL){        if (acl_entry_link_head == NULL){
                 SAFE_FREE(file_acl);                  SAFE_FREE(file_acl);
                return(NULL);                return NULL;
         }          }
   
         acl_entry_link->entryp = SMB_MALLOC_P(struct new_acl_entry);          acl_entry_link->entryp = SMB_MALLOC_P(struct new_acl_entry);
   
        if(acl_entry_link->entryp == NULL) {        if (acl_entry_link->entryp == NULL) {
                 errno = ENOMEM;                  errno = ENOMEM;
                DEBUG(0,("Error in sys_acl_get_fd is %d\n",errno));                DEBUG(0, ("Error in sys_acl_get_fd is %d\n", errno));
                 SAFE_FREE(file_acl);                  SAFE_FREE(file_acl);
                return(NULL);                return NULL;
         }          }
   
        DEBUG(10,("acl_entry is %d\n",acl_entry));        DEBUG(10, ("acl_entry is %d\n", acl_entry));
        DEBUG(10,("acl_last(file_acl) id %d\n",acl_last(file_acl)));        DEBUG(10, ("acl_last(file_acl) id %d\n", acl_last(file_acl)));
     
         /* Check if the extended acl bit is on.   *          /* Check if the extended acl bit is on.   *
          * If it isn't, do not show the           *           * If it isn't, do not show the           *
          * contents of the acl since AIX intends  *           * contents of the acl since AIX intends  *
          * the extended info to remain unused     */           * the extended info to remain unused     */
     
        if(file_acl->acl_mode & S_IXACL){        if (file_acl->acl_mode & S_IXACL){
                 /* while we are not pointing to the very end */                  /* while we are not pointing to the very end */
                while(acl_entry < acl_last(file_acl)) {                while (acl_entry < acl_last(file_acl)) {
                         /* before we malloc anything, make sure this is  */                          /* before we malloc anything, make sure this is  */
                         /* a valid acl entry and one that we want to map */                          /* a valid acl entry and one that we want to map */
   
                         idp = id_nxt(acl_entry->ace_id);                          idp = id_nxt(acl_entry->ace_id);
                        if((acl_entry->ace_type == ACC_SPECIFY ||                        if ((acl_entry->ace_type == ACC_SPECIFY ||
                                 (acl_entry->ace_type == ACC_PERMIT)) && (idp != id_last(acl_entry))) {                                  (acl_entry->ace_type == ACC_PERMIT)) && (idp != id_last(acl_entry))) {
                                         acl_entry = acl_nxt(acl_entry);                                          acl_entry = acl_nxt(acl_entry);
                                         continue;                                          continue;
Line 2138  SMB_ACL_T sys_acl_get_fd(int fd) Line 2116  SMB_ACL_T sys_acl_get_fd(int fd)
                          * The first entry needs to keep prevp pointing to NULL *                           * The first entry needs to keep prevp pointing to NULL *
                          * and already has entryp allocated.                 */                           * and already has entryp allocated.                 */
   
                        if(acl_entry_link_head->count != 0) {                        if (acl_entry_link_head->count != 0) {
                                 acl_entry_link->nextp = SMB_MALLOC_P(struct acl_entry_link);                                  acl_entry_link->nextp = SMB_MALLOC_P(struct acl_entry_link);
                                if(acl_entry_link->nextp == NULL) {                                if (acl_entry_link->nextp == NULL) {
                                         errno = ENOMEM;                                          errno = ENOMEM;
                                        DEBUG(0,("Error in sys_acl_get_fd is %d\n",errno));                                        DEBUG(0, ("Error in sys_acl_get_fd is %d\n", errno));
                                         SAFE_FREE(file_acl);                                          SAFE_FREE(file_acl);
                                        return(NULL);                                        return NULL;
                                 }                                  }
                                 acl_entry_link->nextp->prevp = acl_entry_link;                                  acl_entry_link->nextp->prevp = acl_entry_link;
                                 acl_entry_link = acl_entry_link->nextp;                                  acl_entry_link = acl_entry_link->nextp;
                                 acl_entry_link->entryp = SMB_MALLOC_P(struct new_acl_entry);                                  acl_entry_link->entryp = SMB_MALLOC_P(struct new_acl_entry);
                                if(acl_entry_link->entryp == NULL) {                                if (acl_entry_link->entryp == NULL) {
                                         errno = ENOMEM;                                          errno = ENOMEM;
                                        DEBUG(0,("Error in sys_acl_get_fd is %d\n",errno));                                        DEBUG(0, ("Error in sys_acl_get_fd is %d\n", errno));
                                         SAFE_FREE(file_acl);                                          SAFE_FREE(file_acl);
                                        return(NULL);                                        return NULL;
                                 }                                  }
   
                                 acl_entry_link->nextp = NULL;                                  acl_entry_link->nextp = NULL;
Line 2167  SMB_ACL_T sys_acl_get_fd(int fd) Line 2145  SMB_ACL_T sys_acl_get_fd(int fd)
                         acl_entry_link->entryp->ace_type = acl_entry->ace_type;                          acl_entry_link->entryp->ace_type = acl_entry->ace_type;
                         acl_entry_link->entryp->ace_access = acl_entry->ace_access;                          acl_entry_link->entryp->ace_access = acl_entry->ace_access;
   
                        memcpy(acl_entry_link->entryp->ace_id, idp, sizeof(struct ace_id));                        memcpy(acl_entry_link->entryp->ace_id, idp, sizeof (struct ace_id));
   
                         /* The access in the acl entries must be left shifted by *                          /* The access in the acl entries must be left shifted by *
                          * three bites, because they will ultimately be compared *                           * three bites, because they will ultimately be compared *
                          * to S_IRUSR, S_IWUSR, and S_IXUSR.                  */                           * to S_IRUSR, S_IWUSR, and S_IXUSR.                  */
   
                        switch(acl_entry->ace_type){                        switch (acl_entry->ace_type){
                         case ACC_PERMIT:                          case ACC_PERMIT:
                         case ACC_SPECIFY:                          case ACC_SPECIFY:
                                 acl_entry_link->entryp->ace_access = acl_entry->ace_access;                                  acl_entry_link->entryp->ace_access = acl_entry->ace_access;
Line 2183  SMB_ACL_T sys_acl_get_fd(int fd) Line 2161  SMB_ACL_T sys_acl_get_fd(int fd)
                         case ACC_DENY:                          case ACC_DENY:
                                 /* Since there is no way to return a DENY acl entry *                                  /* Since there is no way to return a DENY acl entry *
                                  * change to PERMIT and then shift.                 */                                   * change to PERMIT and then shift.                 */
                                DEBUG(10,("acl_entry->ace_access is %d\n",acl_entry->ace_access));                                DEBUG(10, ("acl_entry->ace_access is %d\n", acl_entry->ace_access));
                                 acl_entry_link->entryp->ace_access = ~acl_entry->ace_access & 7;                                  acl_entry_link->entryp->ace_access = ~acl_entry->ace_access & 7;
                                DEBUG(10,("acl_entry_link->entryp->ace_access is %d\n",acl_entry_link->entryp->ace_access));                                DEBUG(10, ("acl_entry_link->entryp->ace_access is %d\n", acl_entry_link->entryp->ace_access));
                                 acl_entry_link->entryp->ace_access <<= 6;                                  acl_entry_link->entryp->ace_access <<= 6;
                                 acl_entry_link_head->count++;                                  acl_entry_link_head->count++;
                                 break;                                  break;
                         default:                          default:
                                return(0);                                return 0;
                         }                          }
   
                        DEBUG(10,("acl_entry = %d\n",acl_entry));                        DEBUG(10, ("acl_entry = %d\n", acl_entry));
                        DEBUG(10,("The ace_type is %d\n",acl_entry->ace_type));                        DEBUG(10, ("The ace_type is %d\n", acl_entry->ace_type));
     
                         acl_entry = acl_nxt(acl_entry);                          acl_entry = acl_nxt(acl_entry);
                 }                  }
Line 2204  SMB_ACL_T sys_acl_get_fd(int fd) Line 2182  SMB_ACL_T sys_acl_get_fd(int fd)
          * part of the acl entries in an acl, they must  *           * part of the acl entries in an acl, they must  *
          * be dummied up to become part of the list.     */           * be dummied up to become part of the list.     */
   
        for( i = 1; i < 4; i++) {        for (i = 1; i < 4; i++) {
                DEBUG(10,("i is %d\n",i));                DEBUG(10, ("i is %d\n", i));
                if(acl_entry_link_head->count != 0){                if (acl_entry_link_head->count != 0){
                         acl_entry_link->nextp = SMB_MALLOC_P(struct acl_entry_link);                          acl_entry_link->nextp = SMB_MALLOC_P(struct acl_entry_link);
                        if(acl_entry_link->nextp == NULL) {                        if (acl_entry_link->nextp == NULL) {
                                 errno = ENOMEM;                                  errno = ENOMEM;
                                DEBUG(0,("Error in sys_acl_get_fd is %d\n",errno));                                DEBUG(0, ("Error in sys_acl_get_fd is %d\n", errno));
                                 SAFE_FREE(file_acl);                                  SAFE_FREE(file_acl);
                                return(NULL);                                return NULL;
                         }                          }
   
                         acl_entry_link->nextp->prevp = acl_entry_link;                          acl_entry_link->nextp->prevp = acl_entry_link;
                         acl_entry_link = acl_entry_link->nextp;                          acl_entry_link = acl_entry_link->nextp;
                         acl_entry_link->entryp = SMB_MALLOC_P(struct new_acl_entry);                          acl_entry_link->entryp = SMB_MALLOC_P(struct new_acl_entry);
   
                        if(acl_entry_link->entryp == NULL) {                        if (acl_entry_link->entryp == NULL) {
                                 SAFE_FREE(file_acl);                                  SAFE_FREE(file_acl);
                                 errno = ENOMEM;                                  errno = ENOMEM;
                                DEBUG(0,("Error in sys_acl_get_fd is %d\n",errno));                                DEBUG(0, ("Error in sys_acl_get_fd is %d\n", errno));
                                return(NULL);                                return NULL;
                         }                          }
                 }                  }
   
Line 2232  SMB_ACL_T sys_acl_get_fd(int fd) Line 2210  SMB_ACL_T sys_acl_get_fd(int fd)
                 new_acl_entry = acl_entry_link->entryp;                  new_acl_entry = acl_entry_link->entryp;
                 idp = new_acl_entry->ace_id;                  idp = new_acl_entry->ace_id;
     
                new_acl_entry->ace_len = sizeof(struct acl_entry);                new_acl_entry->ace_len = sizeof (struct acl_entry);
                 new_acl_entry->ace_type = ACC_PERMIT;                  new_acl_entry->ace_type = ACC_PERMIT;
                idp->id_len = sizeof(struct ace_id);                idp->id_len = sizeof (struct ace_id);
                DEBUG(10,("idp->id_len = %d\n",idp->id_len));                DEBUG(10, ("idp->id_len = %d\n", idp->id_len));
                memset(idp->id_data,0,sizeof(uid_t));                memset(idp->id_data, 0, sizeof (uid_t));
     
                switch(i) {                switch (i) {
                 case 2:                  case 2:
                         new_acl_entry->ace_access = file_acl->g_access << 6;                          new_acl_entry->ace_access = file_acl->g_access << 6;
                         idp->id_type = SMB_ACL_GROUP_OBJ;                          idp->id_type = SMB_ACL_GROUP_OBJ;
Line 2255  SMB_ACL_T sys_acl_get_fd(int fd) Line 2233  SMB_ACL_T sys_acl_get_fd(int fd)
                         break;                          break;
     
                 default:                  default:
                        return(NULL);                        return NULL;
                 }                  }
     
                 acl_entry_link_head->count++;                  acl_entry_link_head->count++;
                DEBUG(10,("new_acl_entry->ace_access = %d\n",new_acl_entry->ace_access));                DEBUG(10, ("new_acl_entry->ace_access = %d\n", new_acl_entry->ace_access));
         }          }
   
         acl_entry_link_head->count = 0;          acl_entry_link_head->count = 0;
         SAFE_FREE(file_acl);          SAFE_FREE(file_acl);
     
        return(acl_entry_link_head);        return acl_entry_link_head;
 }  }
 #endif  #endif
   
Line 2281  int sys_acl_get_info(SMB_ACL_ENTRY_T entry, SMB_ACL_TA Line 2259  int sys_acl_get_info(SMB_ACL_ENTRY_T entry, SMB_ACL_TA
   
         permset = &entry->ace_access;          permset = &entry->ace_access;
   
        DEBUG(10,("*permset is %d\n",*permset));        DEBUG(10, ("*permset is %d\n", *permset));
         *bits_p = (*permset & S_IRUSR ? 4 : 0)          *bits_p = (*permset & S_IRUSR ? 4 : 0)
                 | (*permset & S_IWUSR ? 2 : 0)                  | (*permset & S_IWUSR ? 2 : 0)
                 | (*permset & S_IXUSR ? 1 : 0);                  | (*permset & S_IXUSR ? 1 : 0);
Line 2289  int sys_acl_get_info(SMB_ACL_ENTRY_T entry, SMB_ACL_TA Line 2267  int sys_acl_get_info(SMB_ACL_ENTRY_T entry, SMB_ACL_TA
         return 0;          return 0;
 }  }
   
SMB_ACL_T sys_acl_init( int count)SMB_ACL_T sys_acl_init(int count)
 {  {
         struct acl_entry_link *theacl = NULL;          struct acl_entry_link *theacl = NULL;
     
Line 2298  SMB_ACL_T sys_acl_init( int count) Line 2276  SMB_ACL_T sys_acl_init( int count)
                 return NULL;                  return NULL;
         }          }
   
        DEBUG(10,("Entering sys_acl_init\n"));        DEBUG(10, ("Entering sys_acl_init\n"));
   
         theacl = SMB_MALLOC_P(struct acl_entry_link);          theacl = SMB_MALLOC_P(struct acl_entry_link);
        if(theacl == NULL) {        if (theacl == NULL) {
                 errno = ENOMEM;                  errno = ENOMEM;
                DEBUG(0,("Error in sys_acl_init is %d\n",errno));                DEBUG(0, ("Error in sys_acl_init is %d\n", errno));
                return(NULL);                return NULL;
         }          }
   
         theacl->count = 0;          theacl->count = 0;
         theacl->nextp = NULL;          theacl->nextp = NULL;
         theacl->prevp = NULL;          theacl->prevp = NULL;
         theacl->entryp = NULL;          theacl->entryp = NULL;
        DEBUG(10,("Exiting sys_acl_init\n"));        DEBUG(10, ("Exiting sys_acl_init\n"));
        return(theacl);        return theacl;
 }  }
   
int sys_acl_create_entry( SMB_ACL_T *pacl, SMB_ACL_ENTRY_T *pentry)int sys_acl_create_entry(SMB_ACL_T *pacl, SMB_ACL_ENTRY_T *pentry)
 {  {
         struct acl_entry_link *theacl;          struct acl_entry_link *theacl;
         struct acl_entry_link *acl_entryp;          struct acl_entry_link *acl_entryp;
         struct acl_entry_link *temp_entry;          struct acl_entry_link *temp_entry;
         int counting;          int counting;
   
        DEBUG(10,("Entering the sys_acl_create_entry\n"));        DEBUG(10, ("Entering the sys_acl_create_entry\n"));
   
         theacl = acl_entryp = *pacl;          theacl = acl_entryp = *pacl;
   
         /* Get to the end of the acl before adding entry */          /* Get to the end of the acl before adding entry */
   
        for(counting=0; counting < theacl->count; counting++){        for (counting = 0; counting < theacl->count; counting++){
                DEBUG(10,("The acl_entryp is %d\n",acl_entryp));                DEBUG(10, ("The acl_entryp is %d\n", acl_entryp));
                 temp_entry = acl_entryp;                  temp_entry = acl_entryp;
                 acl_entryp = acl_entryp->nextp;                  acl_entryp = acl_entryp->nextp;
         }          }
   
        if(theacl->count != 0){        if (theacl->count != 0){
                 temp_entry->nextp = acl_entryp = SMB_MALLOC_P(struct acl_entry_link);                  temp_entry->nextp = acl_entryp = SMB_MALLOC_P(struct acl_entry_link);
                if(acl_entryp == NULL) {                if (acl_entryp == NULL) {
                         errno = ENOMEM;                          errno = ENOMEM;
                        DEBUG(0,("Error in sys_acl_create_entry is %d\n",errno));                        DEBUG(0, ("Error in sys_acl_create_entry is %d\n", errno));
                        return(-1);                        return -1;
                 }                  }
   
                DEBUG(10,("The acl_entryp is %d\n",acl_entryp));                DEBUG(10, ("The acl_entryp is %d\n", acl_entryp));
                 acl_entryp->prevp = temp_entry;                  acl_entryp->prevp = temp_entry;
                DEBUG(10,("The acl_entryp->prevp is %d\n",acl_entryp->prevp));                DEBUG(10, ("The acl_entryp->prevp is %d\n", acl_entryp->prevp));
         }          }
   
         *pentry = acl_entryp->entryp = SMB_MALLOC_P(struct new_acl_entry);          *pentry = acl_entryp->entryp = SMB_MALLOC_P(struct new_acl_entry);
        if(*pentry == NULL) {        if (*pentry == NULL) {
                 errno = ENOMEM;                  errno = ENOMEM;
                DEBUG(0,("Error in sys_acl_create_entry is %d\n",errno));                DEBUG(0, ("Error in sys_acl_create_entry is %d\n", errno));
                return(-1);                return -1;
         }          }
   
        memset(*pentry,0,sizeof(struct new_acl_entry));        memset(*pentry, 0, sizeof (struct new_acl_entry));
        acl_entryp->entryp->ace_len = sizeof(struct acl_entry);        acl_entryp->entryp->ace_len = sizeof (struct acl_entry);
         acl_entryp->entryp->ace_type = ACC_PERMIT;          acl_entryp->entryp->ace_type = ACC_PERMIT;
        acl_entryp->entryp->ace_id->id_len = sizeof(struct ace_id);        acl_entryp->entryp->ace_id->id_len = sizeof (struct ace_id);
         acl_entryp->nextp = NULL;          acl_entryp->nextp = NULL;
         theacl->count++;          theacl->count++;
        DEBUG(10,("Exiting sys_acl_create_entry\n"));        DEBUG(10, ("Exiting sys_acl_create_entry\n"));
        return(0);        return 0;
 }  }
   
 int sys_acl_set_info(SMB_ACL_ENTRY_T entry, SMB_ACL_TAG_T tag_type, uint32 bits, id_t u_g_id)  int sys_acl_set_info(SMB_ACL_ENTRY_T entry, SMB_ACL_TAG_T tag_type, uint32 bits, id_t u_g_id)
 {  {
         entry->ace_id->id_type = tag_type;          entry->ace_id->id_type = tag_type;
        DEBUG(10,("The tag type is %d\n",entry->ace_id->id_type));        DEBUG(10, ("The tag type is %d\n", entry->ace_id->id_type));
   
         if (tag_type == SMB_ACL_USER || tag_type == SMB_ACL_GROUP)          if (tag_type == SMB_ACL_USER || tag_type == SMB_ACL_GROUP)
                 memcpy(entry->ace_id->id_data, &u_g_id, sizeof (id_t));                  memcpy(entry->ace_id->id_data, &u_g_id, sizeof (id_t));
   
         entry->ace_access = bits;          entry->ace_access = bits;
        DEBUG(10,("entry->ace_access = %d\n",entry->ace_access));        DEBUG(10, ("entry->ace_access = %d\n", entry->ace_access));
   
         return 0;          return 0;
 }  }
   
 int sys_acl_set_access_bits(SMB_ACL_ENTRY_T entry, uint32 bits)  int sys_acl_set_access_bits(SMB_ACL_ENTRY_T entry, uint32 bits)
 {  {
        DEBUG(10,("Starting AIX sys_acl_set_permset\n"));        DEBUG(10, ("Starting AIX sys_acl_set_permset\n"));
         entry->ace_access = bits;          entry->ace_access = bits;
        DEBUG(10,("entry->ace_access = %d\n",entry->ace_access));        DEBUG(10, ("entry->ace_access = %d\n", entry->ace_access));
        DEBUG(10,("Ending AIX sys_acl_set_permset\n"));        DEBUG(10, ("Ending AIX sys_acl_set_permset\n"));
        return(0);        return 0;
 }  }
   
int sys_acl_valid( SMB_ACL_T theacl )int sys_acl_valid(SMB_ACL_T theacl)
 {  {
         int user_obj = 0;          int user_obj = 0;
         int group_obj = 0;          int group_obj = 0;
         int other_obj = 0;          int other_obj = 0;
         struct acl_entry_link *acl_entry;          struct acl_entry_link *acl_entry;
   
        for(acl_entry=theacl; acl_entry != NULL; acl_entry = acl_entry->nextp) {        for (acl_entry=theacl; acl_entry != NULL; acl_entry = acl_entry->nextp) {
                 user_obj += (acl_entry->entryp->ace_id->id_type == SMB_ACL_USER_OBJ);                  user_obj += (acl_entry->entryp->ace_id->id_type == SMB_ACL_USER_OBJ);
                 group_obj += (acl_entry->entryp->ace_id->id_type == SMB_ACL_GROUP_OBJ);                  group_obj += (acl_entry->entryp->ace_id->id_type == SMB_ACL_GROUP_OBJ);
                 other_obj += (acl_entry->entryp->ace_id->id_type == SMB_ACL_OTHER);                  other_obj += (acl_entry->entryp->ace_id->id_type == SMB_ACL_OTHER);
         }          }
   
        DEBUG(10,("user_obj=%d, group_obj=%d, other_obj=%d\n",user_obj,group_obj,other_obj));        DEBUG(10, ("user_obj=%d, group_obj=%d, other_obj=%d\n", user_obj, group_obj, other_obj));
     
        if(user_obj != 1 || group_obj != 1 || other_obj != 1)        if (user_obj != 1 || group_obj != 1 || other_obj != 1)
                return(-1);                 return -1; 
   
        return(0);        return 0;
 }  }
   
int sys_acl_set_file( const char *name, SMB_ACL_TYPE_T acltype, SMB_ACL_T theacl)int sys_acl_set_file(const char *name, SMB_ACL_TYPE_T acltype, SMB_ACL_T theacl)
 {  {
         struct acl_entry_link *acl_entry_link = NULL;          struct acl_entry_link *acl_entry_link = NULL;
         struct acl *file_acl = NULL;          struct acl *file_acl = NULL;
Line 2420  int sys_acl_set_file( const char *name, SMB_ACL_TYPE_T Line 2398  int sys_acl_set_file( const char *name, SMB_ACL_TYPE_T
         uint acl_length;          uint acl_length;
         uint rc;          uint rc;
   
        DEBUG(10,("Entering sys_acl_set_file\n"));        DEBUG(10, ("Entering sys_acl_set_file\n"));
        DEBUG(10,("File name is %s\n",name));        DEBUG(10, ("File name is %s\n", name));
     
         /* AIX has no default ACL */          /* AIX has no default ACL */
        if(acltype == SMB_ACL_TYPE_DEFAULT)        if (acltype == SMB_ACL_TYPE_DEFAULT)
                return(0);                return 0;
   
         acl_length = BUFSIZ;          acl_length = BUFSIZ;
         file_acl = (struct acl *)SMB_MALLOC(BUFSIZ);          file_acl = (struct acl *)SMB_MALLOC(BUFSIZ);
   
        if(file_acl == NULL) {        if (file_acl == NULL) {
                 errno = ENOMEM;                  errno = ENOMEM;
                DEBUG(0,("Error in sys_acl_set_file is %d\n",errno));                DEBUG(0, ("Error in sys_acl_set_file is %d\n", errno));
                return(-1);                return -1;
         }          }
   
        memset(file_acl,0,BUFSIZ);        memset(file_acl, 0, BUFSIZ);
   
         file_acl->acl_len = ACL_SIZ;          file_acl->acl_len = ACL_SIZ;
         file_acl->acl_mode = S_IXACL;          file_acl->acl_mode = S_IXACL;
   
        for(acl_entry_link=theacl; acl_entry_link != NULL; acl_entry_link = acl_entry_link->nextp) {        for (acl_entry_link=theacl; acl_entry_link != NULL; acl_entry_link = acl_entry_link->nextp) {
                 acl_entry_link->entryp->ace_access >>= 6;                  acl_entry_link->entryp->ace_access >>= 6;
                 id_type = acl_entry_link->entryp->ace_id->id_type;                  id_type = acl_entry_link->entryp->ace_id->id_type;
   
                switch(id_type) {                switch (id_type) {
                 case SMB_ACL_USER_OBJ:                  case SMB_ACL_USER_OBJ:
                         file_acl->u_access = acl_entry_link->entryp->ace_access;                          file_acl->u_access = acl_entry_link->entryp->ace_access;
                         continue;                          continue;
Line 2459  int sys_acl_set_file( const char *name, SMB_ACL_TYPE_T Line 2437  int sys_acl_set_file( const char *name, SMB_ACL_TYPE_T
                         continue;                          continue;
                 }                  }
   
                if((file_acl->acl_len + sizeof(struct acl_entry)) > acl_length) {                if ((file_acl->acl_len + sizeof (struct acl_entry)) > acl_length) {
                        acl_length += sizeof(struct acl_entry);                        acl_length += sizeof (struct acl_entry);
                         file_acl_temp = (struct acl *)SMB_MALLOC(acl_length);                          file_acl_temp = (struct acl *)SMB_MALLOC(acl_length);
                        if(file_acl_temp == NULL) {                        if (file_acl_temp == NULL) {
                                 SAFE_FREE(file_acl);                                  SAFE_FREE(file_acl);
                                 errno = ENOMEM;                                  errno = ENOMEM;
                                DEBUG(0,("Error in sys_acl_set_file is %d\n",errno));                                DEBUG(0, ("Error in sys_acl_set_file is %d\n", errno));
                                return(-1);                                return -1;
                         }                            }  
   
                        memcpy(file_acl_temp,file_acl,file_acl->acl_len);                        memcpy(file_acl_temp, file_acl, file_acl->acl_len);
                         SAFE_FREE(file_acl);                          SAFE_FREE(file_acl);
                         file_acl = file_acl_temp;                          file_acl = file_acl_temp;
                 }                  }
   
                 acl_entry = (struct acl_entry *)((char *)file_acl + file_acl->acl_len);                  acl_entry = (struct acl_entry *)((char *)file_acl + file_acl->acl_len);
                file_acl->acl_len += sizeof(struct acl_entry);                file_acl->acl_len += sizeof (struct acl_entry);
                 acl_entry->ace_len = acl_entry_link->entryp->ace_len;                  acl_entry->ace_len = acl_entry_link->entryp->ace_len;
                 acl_entry->ace_access = acl_entry_link->entryp->ace_access;                  acl_entry->ace_access = acl_entry_link->entryp->ace_access;
     
                 /* In order to use this, we'll need to wait until we can get denies */                  /* In order to use this, we'll need to wait until we can get denies */
                /* if(!acl_entry->ace_access && acl_entry->ace_type == ACC_PERMIT)                /* if (!acl_entry->ace_access && acl_entry->ace_type == ACC_PERMIT)
                acl_entry->ace_type = ACC_SPECIFY; */                        acl_entry->ace_type = ACC_SPECIFY; */
   
                 acl_entry->ace_type = ACC_SPECIFY;                  acl_entry->ace_type = ACC_SPECIFY;
     
                 ace_id = acl_entry->ace_id;                  ace_id = acl_entry->ace_id;
     
                 ace_id->id_type = acl_entry_link->entryp->ace_id->id_type;                  ace_id->id_type = acl_entry_link->entryp->ace_id->id_type;
                DEBUG(10,("The id type is %d\n",ace_id->id_type));                DEBUG(10, ("The id type is %d\n", ace_id->id_type));
                 ace_id->id_len = acl_entry_link->entryp->ace_id->id_len;                  ace_id->id_len = acl_entry_link->entryp->ace_id->id_len;
                memcpy(&user_id, acl_entry_link->entryp->ace_id->id_data, sizeof(uid_t));                memcpy(&user_id, acl_entry_link->entryp->ace_id->id_data, sizeof (uid_t));
                memcpy(acl_entry->ace_id->id_data, &user_id, sizeof(uid_t));                memcpy(acl_entry->ace_id->id_data, &user_id, sizeof (uid_t));
         }          }
   
        rc = chacl((char*)name,file_acl,file_acl->acl_len);        rc = chacl((char*)name, file_acl, file_acl->acl_len);
        DEBUG(10,("errno is %d\n",errno));        DEBUG(10, ("errno is %d\n", errno));
        DEBUG(10,("return code is %d\n",rc));        DEBUG(10, ("return code is %d\n", rc));
         SAFE_FREE(file_acl);          SAFE_FREE(file_acl);
        DEBUG(10,("Exiting the sys_acl_set_file\n"));        DEBUG(10, ("Exiting the sys_acl_set_file\n"));
        return(rc);        return rc;
 }  }
   
 #if 0  #if 0
int sys_acl_set_fd( int fd, SMB_ACL_T theacl)int sys_acl_set_fd(int fd, SMB_ACL_T theacl)
 {  {
         struct acl_entry_link *acl_entry_link = NULL;          struct acl_entry_link *acl_entry_link = NULL;
         struct acl *file_acl = NULL;          struct acl *file_acl = NULL;
Line 2515  int sys_acl_set_fd( int fd, SMB_ACL_T theacl) Line 2493  int sys_acl_set_fd( int fd, SMB_ACL_T theacl)
         uint acl_length;          uint acl_length;
         uint rc;          uint rc;
     
        DEBUG(10,("Entering sys_acl_set_fd\n"));        DEBUG(10, ("Entering sys_acl_set_fd\n"));
         acl_length = BUFSIZ;          acl_length = BUFSIZ;
         file_acl = (struct acl *)SMB_MALLOC(BUFSIZ);          file_acl = (struct acl *)SMB_MALLOC(BUFSIZ);
   
        if(file_acl == NULL) {        if (file_acl == NULL) {
                 errno = ENOMEM;                  errno = ENOMEM;
                DEBUG(0,("Error in sys_acl_set_fd is %d\n",errno));                DEBUG(0, ("Error in sys_acl_set_fd is %d\n", errno));
                return(-1);                return -1;
         }          }
   
        memset(file_acl,0,BUFSIZ);        memset(file_acl, 0, BUFSIZ);
     
         file_acl->acl_len = ACL_SIZ;          file_acl->acl_len = ACL_SIZ;
         file_acl->acl_mode = S_IXACL;          file_acl->acl_mode = S_IXACL;
   
        for(acl_entry_link=theacl; acl_entry_link != NULL; acl_entry_link = acl_entry_link->nextp) {        for (acl_entry_link=theacl; acl_entry_link != NULL; acl_entry_link = acl_entry_link->nextp) {
                 acl_entry_link->entryp->ace_access >>= 6;                  acl_entry_link->entryp->ace_access >>= 6;
                 id_type = acl_entry_link->entryp->ace_id->id_type;                  id_type = acl_entry_link->entryp->ace_id->id_type;
                DEBUG(10,("The id_type is %d\n",id_type));                DEBUG(10, ("The id_type is %d\n", id_type));
   
                switch(id_type) {                switch (id_type) {
                 case SMB_ACL_USER_OBJ:                  case SMB_ACL_USER_OBJ:
                         file_acl->u_access = acl_entry_link->entryp->ace_access;                          file_acl->u_access = acl_entry_link->entryp->ace_access;
                         continue;                          continue;
Line 2549  int sys_acl_set_fd( int fd, SMB_ACL_T theacl) Line 2527  int sys_acl_set_fd( int fd, SMB_ACL_T theacl)
                         continue;                          continue;
                 }                  }
   
                if((file_acl->acl_len + sizeof(struct acl_entry)) > acl_length) {                if ((file_acl->acl_len + sizeof (struct acl_entry)) > acl_length) {
                        acl_length += sizeof(struct acl_entry);                        acl_length += sizeof (struct acl_entry);
                         file_acl_temp = (struct acl *)SMB_MALLOC(acl_length);                          file_acl_temp = (struct acl *)SMB_MALLOC(acl_length);
                        if(file_acl_temp == NULL) {                        if (file_acl_temp == NULL) {
                                 SAFE_FREE(file_acl);                                  SAFE_FREE(file_acl);
                                 errno = ENOMEM;                                  errno = ENOMEM;
                                DEBUG(0,("Error in sys_acl_set_fd is %d\n",errno));                                DEBUG(0, ("Error in sys_acl_set_fd is %d\n", errno));
                                return(-1);                                return -1;
                         }                          }
   
                        memcpy(file_acl_temp,file_acl,file_acl->acl_len);                        memcpy(file_acl_temp, file_acl, file_acl->acl_len);
                         SAFE_FREE(file_acl);                          SAFE_FREE(file_acl);
                         file_acl = file_acl_temp;                          file_acl = file_acl_temp;
                 }                  }
   
                 acl_entry = (struct acl_entry *)((char *)file_acl + file_acl->acl_len);                  acl_entry = (struct acl_entry *)((char *)file_acl + file_acl->acl_len);
                file_acl->acl_len += sizeof(struct acl_entry);                file_acl->acl_len += sizeof (struct acl_entry);
                 acl_entry->ace_len = acl_entry_link->entryp->ace_len;                  acl_entry->ace_len = acl_entry_link->entryp->ace_len;
                 acl_entry->ace_access = acl_entry_link->entryp->ace_access;                  acl_entry->ace_access = acl_entry_link->entryp->ace_access;
     
                 /* In order to use this, we'll need to wait until we can get denies */                  /* In order to use this, we'll need to wait until we can get denies */
                /* if(!acl_entry->ace_access && acl_entry->ace_type == ACC_PERMIT)                /* if (!acl_entry->ace_access && acl_entry->ace_type == ACC_PERMIT)
                         acl_entry->ace_type = ACC_SPECIFY; */                          acl_entry->ace_type = ACC_SPECIFY; */
     
                 acl_entry->ace_type = ACC_SPECIFY;                  acl_entry->ace_type = ACC_SPECIFY;
Line 2578  int sys_acl_set_fd( int fd, SMB_ACL_T theacl) Line 2556  int sys_acl_set_fd( int fd, SMB_ACL_T theacl)
                 ace_id = acl_entry->ace_id;                  ace_id = acl_entry->ace_id;
     
                 ace_id->id_type = acl_entry_link->entryp->ace_id->id_type;                  ace_id->id_type = acl_entry_link->entryp->ace_id->id_type;
                DEBUG(10,("The id type is %d\n",ace_id->id_type));                DEBUG(10, ("The id type is %d\n", ace_id->id_type));
                 ace_id->id_len = acl_entry_link->entryp->ace_id->id_len;                  ace_id->id_len = acl_entry_link->entryp->ace_id->id_len;
                memcpy(&user_id, acl_entry_link->entryp->ace_id->id_data, sizeof(uid_t));                memcpy(&user_id, acl_entry_link->entryp->ace_id->id_data, sizeof (uid_t));
                memcpy(ace_id->id_data, &user_id, sizeof(uid_t));                memcpy(ace_id->id_data, &user_id, sizeof (uid_t));
         }          }
     
        rc = fchacl(fd,file_acl,file_acl->acl_len);        rc = fchacl(fd, file_acl, file_acl->acl_len);
        DEBUG(10,("errno is %d\n",errno));        DEBUG(10, ("errno is %d\n", errno));
        DEBUG(10,("return code is %d\n",rc));        DEBUG(10, ("return code is %d\n", rc));
         SAFE_FREE(file_acl);          SAFE_FREE(file_acl);
        DEBUG(10,("Exiting sys_acl_set_fd\n"));        DEBUG(10, ("Exiting sys_acl_set_fd\n"));
        return(rc);        return rc;
 }  }
 #endif  #endif
   
Line 2603  int sys_acl_free_acl(SMB_ACL_T posix_acl) Line 2581  int sys_acl_free_acl(SMB_ACL_T posix_acl)
 {  {
         struct acl_entry_link *acl_entry_link;          struct acl_entry_link *acl_entry_link;
   
        for(acl_entry_link = posix_acl->nextp; acl_entry_link->nextp != NULL; acl_entry_link = acl_entry_link->nextp) {        for (acl_entry_link = posix_acl->nextp; acl_entry_link->nextp != NULL; acl_entry_link = acl_entry_link->nextp) {
                 SAFE_FREE(acl_entry_link->prevp->entryp);                  SAFE_FREE(acl_entry_link->prevp->entryp);
                 SAFE_FREE(acl_entry_link->prevp);                  SAFE_FREE(acl_entry_link->prevp);
         }          }
Line 2613  int sys_acl_free_acl(SMB_ACL_T posix_acl) Line 2591  int sys_acl_free_acl(SMB_ACL_T posix_acl)
         SAFE_FREE(acl_entry_link->entryp);          SAFE_FREE(acl_entry_link->entryp);
         SAFE_FREE(acl_entry_link);          SAFE_FREE(acl_entry_link);
     
        return(0);        return 0;
 }  }
   
 #elif defined(HAVE_OSX_ACLS) /*----------------------------------------------*/  #elif defined(HAVE_OSX_ACLS) /*----------------------------------------------*/

Removed from v.1.1.1.2  
changed lines
  Added in v.1.1.1.3


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>