00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include "includes.h"
00022
00023 SMB_ACL_T aixacl_to_smbacl(struct acl *file_acl)
00024 {
00025 struct acl_entry *acl_entry;
00026 struct ace_id *idp;
00027
00028 struct smb_acl_t *result = SMB_MALLOC_P(struct smb_acl_t);
00029 struct smb_acl_entry *ace;
00030 int i;
00031
00032 if (result == NULL) {
00033 return NULL;
00034 }
00035 ZERO_STRUCTP(result);
00036
00037
00038 acl_entry = file_acl->acl_ext;
00039
00040
00041
00042 DEBUG(10,("acl_entry is %d\n",acl_entry));
00043 DEBUG(10,("acl_last(file_acl) id %d\n",acl_last(file_acl)));
00044
00045
00046
00047
00048
00049
00050 if(file_acl->acl_mode & S_IXACL){
00051
00052 while(acl_entry < acl_last(file_acl)) {
00053
00054
00055 idp = id_nxt(acl_entry->ace_id);
00056 if((acl_entry->ace_type == ACC_SPECIFY ||
00057 (acl_entry->ace_type == ACC_PERMIT)) && (idp != id_last(acl_entry))) {
00058 acl_entry = acl_nxt(acl_entry);
00059 continue;
00060 }
00061
00062 idp = acl_entry->ace_id;
00063 DEBUG(10,("idp->id_data is %d\n",idp->id_data[0]));
00064
00065 result = SMB_REALLOC(result, sizeof(struct smb_acl_t) +
00066 (sizeof(struct smb_acl_entry) *
00067 (result->count+1)));
00068 if (result == NULL) {
00069 DEBUG(0, ("SMB_REALLOC failed\n"));
00070 errno = ENOMEM;
00071 return NULL;
00072 }
00073
00074
00075 DEBUG(10,("idp->id_type is %d\n",idp->id_type));
00076 ace = &result->acl[result->count];
00077
00078 ace->a_type = idp->id_type;
00079
00080 switch(ace->a_type) {
00081 case ACEID_USER: {
00082 ace->uid = idp->id_data[0];
00083 DEBUG(10,("case ACEID_USER ace->uid is %d\n",ace->uid));
00084 ace->a_type = SMB_ACL_USER;
00085 break;
00086 }
00087
00088 case ACEID_GROUP: {
00089 ace->gid = idp->id_data[0];
00090 DEBUG(10,("case ACEID_GROUP ace->gid is %d\n",ace->gid));
00091 ace->a_type = SMB_ACL_GROUP;
00092 break;
00093 }
00094 default:
00095 break;
00096 }
00097
00098
00099
00100
00101 switch(acl_entry->ace_type){
00102 case ACC_PERMIT:
00103 case ACC_SPECIFY:
00104 ace->a_perm = acl_entry->ace_access;
00105 ace->a_perm <<= 6;
00106 DEBUG(10,("ace->a_perm is %d\n",ace->a_perm));
00107 break;
00108 case ACC_DENY:
00109
00110
00111 DEBUG(10,("acl_entry->ace_access is %d\n",acl_entry->ace_access));
00112 ace->a_perm = ~acl_entry->ace_access & 7;
00113 DEBUG(10,("ace->a_perm is %d\n",ace->a_perm));
00114 ace->a_perm <<= 6;
00115 break;
00116 default:
00117 DEBUG(0, ("unknown ace->type\n"));
00118 SAFE_FREE(result);
00119 return(0);
00120 }
00121
00122 result->count++;
00123 ace->a_perm |= (ace->a_perm & S_IRUSR) ? SMB_ACL_READ : 0;
00124 ace->a_perm |= (ace->a_perm & S_IWUSR) ? SMB_ACL_WRITE : 0;
00125 ace->a_perm |= (ace->a_perm & S_IXUSR) ? SMB_ACL_EXECUTE : 0;
00126 DEBUG(10,("ace->a_perm is %d\n",ace->a_perm));
00127
00128 DEBUG(10,("acl_entry = %d\n",acl_entry));
00129 DEBUG(10,("The ace_type is %d\n",acl_entry->ace_type));
00130
00131 acl_entry = acl_nxt(acl_entry);
00132 }
00133 }
00134
00135
00136
00137
00138
00139 for( i = 1; i < 4; i++) {
00140 DEBUG(10,("i is %d\n",i));
00141
00142 result = SMB_REALLOC(result, sizeof(struct smb_acl_t) +
00143 (sizeof(struct smb_acl_entry) *
00144 (result->count+1)));
00145 if (result == NULL) {
00146 DEBUG(0, ("SMB_REALLOC failed\n"));
00147 errno = ENOMEM;
00148 DEBUG(0,("Error in AIX sys_acl_get_file is %d\n",errno));
00149 return NULL;
00150 }
00151
00152 ace = &result->acl[result->count];
00153
00154 ace->uid = 0;
00155 ace->gid = 0;
00156 DEBUG(10,("ace->uid = %d\n",ace->uid));
00157
00158 switch(i) {
00159 case 2:
00160 ace->a_perm = file_acl->g_access << 6;
00161 ace->a_type = SMB_ACL_GROUP_OBJ;
00162 break;
00163
00164 case 3:
00165 ace->a_perm = file_acl->o_access << 6;
00166 ace->a_type = SMB_ACL_OTHER;
00167 break;
00168
00169 case 1:
00170 ace->a_perm = file_acl->u_access << 6;
00171 ace->a_type = SMB_ACL_USER_OBJ;
00172 break;
00173
00174 default:
00175 return(NULL);
00176
00177 }
00178 ace->a_perm |= ((ace->a_perm & S_IRUSR) ? SMB_ACL_READ : 0);
00179 ace->a_perm |= ((ace->a_perm & S_IWUSR) ? SMB_ACL_WRITE : 0);
00180 ace->a_perm |= ((ace->a_perm & S_IXUSR) ? SMB_ACL_EXECUTE : 0);
00181
00182 memcpy(&result->acl[result->count],ace,sizeof(struct smb_acl_entry));
00183 result->count++;
00184 DEBUG(10,("ace->a_perm = %d\n",ace->a_perm));
00185 DEBUG(10,("ace->a_type = %d\n",ace->a_type));
00186 }
00187
00188
00189 return result;
00190
00191
00192 }
00193
00194 static ushort aixacl_smb_to_aixperm(SMB_ACL_PERM_T a_perm)
00195 {
00196 ushort ret = (ushort)0;
00197 if (a_perm & SMB_ACL_READ)
00198 ret |= R_ACC;
00199 if (a_perm & SMB_ACL_WRITE)
00200 ret |= W_ACC;
00201 if (a_perm & SMB_ACL_EXECUTE)
00202 ret |= X_ACC;
00203 return ret;
00204 }
00205
00206 struct acl *aixacl_smb_to_aixacl(SMB_ACL_TYPE_T acltype, SMB_ACL_T theacl)
00207 {
00208 struct smb_acl_entry *smb_entry = NULL;
00209 struct acl *file_acl = NULL;
00210 struct acl *file_acl_temp = NULL;
00211 struct acl_entry *acl_entry = NULL;
00212 struct ace_id *ace_id = NULL;
00213 uint id_type;
00214 uint user_id;
00215 uint acl_length;
00216 int i;
00217
00218 DEBUG(10,("Entering aixacl_smb_to_aixacl\n"));
00219
00220 if(acltype == SMB_ACL_TYPE_DEFAULT)
00221 return NULL;
00222
00223 acl_length = BUFSIZ;
00224 file_acl = (struct acl *)SMB_MALLOC(BUFSIZ);
00225 if(file_acl == NULL) {
00226 errno = ENOMEM;
00227 DEBUG(0,("Error in aixacl_smb_to_aixacl is %d\n",errno));
00228 return NULL;
00229 }
00230
00231 memset(file_acl,0,BUFSIZ);
00232
00233 file_acl->acl_len = ACL_SIZ;
00234 file_acl->acl_mode = S_IXACL;
00235
00236 for(i=0; i<theacl->count; i++ ) {
00237 smb_entry = &(theacl->acl[i]);
00238 id_type = smb_entry->a_type;
00239 DEBUG(10,("The id_type is %d\n",id_type));
00240
00241 switch(id_type) {
00242 case SMB_ACL_USER_OBJ:
00243 file_acl->u_access = aixacl_smb_to_aixperm(smb_entry->a_perm);
00244 continue;
00245 case SMB_ACL_GROUP_OBJ:
00246 file_acl->g_access = aixacl_smb_to_aixperm(smb_entry->a_perm);
00247 continue;
00248 case SMB_ACL_OTHER:
00249 file_acl->o_access = aixacl_smb_to_aixperm(smb_entry->a_perm);
00250 continue;
00251 case SMB_ACL_MASK:
00252 continue;
00253 case SMB_ACL_GROUP:
00254 break;
00255 case SMB_ACL_USER:
00256 break;
00257 default:
00258 DEBUG(10,("The id_type is unknown !\n"));
00259 continue;
00260 }
00261
00262 if((file_acl->acl_len + sizeof(struct acl_entry)) > acl_length) {
00263 acl_length += sizeof(struct acl_entry);
00264 file_acl_temp = (struct acl *)SMB_MALLOC(acl_length);
00265 if(file_acl_temp == NULL) {
00266 SAFE_FREE(file_acl);
00267 errno = ENOMEM;
00268 DEBUG(0,("Error in aixacl_smb_to_aixacl is %d\n",errno));
00269 return NULL;
00270 }
00271
00272 memcpy(file_acl_temp,file_acl,file_acl->acl_len);
00273 SAFE_FREE(file_acl);
00274 file_acl = file_acl_temp;
00275 }
00276
00277 acl_entry = (struct acl_entry *)((char *)file_acl + file_acl->acl_len);
00278 file_acl->acl_len += sizeof(struct acl_entry);
00279 acl_entry->ace_len = sizeof(struct acl_entry);
00280 acl_entry->ace_access = aixacl_smb_to_aixperm(smb_entry->a_perm);
00281
00282
00283
00284
00285
00286 acl_entry->ace_type = ACC_SPECIFY;
00287
00288 ace_id = acl_entry->ace_id;
00289
00290 ace_id->id_type = (smb_entry->a_type==SMB_ACL_GROUP) ? ACEID_GROUP : ACEID_USER;
00291 DEBUG(10,("The id type is %d\n",ace_id->id_type));
00292 ace_id->id_len = sizeof(struct ace_id);
00293 ace_id->id_data[0] = (smb_entry->a_type==SMB_ACL_GROUP) ? smb_entry->gid : smb_entry->uid;
00294 }
00295
00296 return file_acl;
00297 }