⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sysacls.c

📁 samba-3.0.22.tar.gz 编译smb服务器的源码
💻 C
📖 第 1 页 / 共 5 页
字号:
	uid_t user_id;	/* AIX has no DEFAULT */	if  ( type == SMB_ACL_TYPE_DEFAULT )		return NULL;	/* Get the acl using statacl */ 	DEBUG(10,("Entering sys_acl_get_file\n"));	DEBUG(10,("path_p is %s\n",path_p));	file_acl = (struct acl *)SMB_MALLOC(BUFSIZ); 	if(file_acl == NULL) {		errno=ENOMEM;		DEBUG(0,("Error in AIX sys_acl_get_file: %d\n",errno));		return(NULL);	}	memset(file_acl,0,BUFSIZ);	rc = statacl((char *)path_p,0,file_acl,BUFSIZ);	if(rc == -1) {		DEBUG(0,("statacl returned %d with errno %d\n",rc,errno));		SAFE_FREE(file_acl);		return(NULL);	}	DEBUG(10,("Got facl and returned it\n"));	/* Point to the first acl entry in the acl */	acl_entry =  file_acl->acl_ext;	/* Begin setting up the head of the linked list *	 * that will be used for the storing the acl    *	 * in a way that is useful for the posix_acls.c *	 * code.                                          */	acl_entry_link_head = acl_entry_link = sys_acl_init(0);	if(acl_entry_link_head == NULL)		return(NULL);	acl_entry_link->entryp = SMB_MALLOC_P(struct new_acl_entry);	if(acl_entry_link->entryp == NULL) {		SAFE_FREE(file_acl);		errno = ENOMEM;		DEBUG(0,("Error in AIX sys_acl_get_file is %d\n",errno));		return(NULL);	}	DEBUG(10,("acl_entry is %d\n",acl_entry));	DEBUG(10,("acl_last(file_acl) id %d\n",acl_last(file_acl)));	/* Check if the extended acl bit is on.   *	 * If it isn't, do not show the           *	 * contents of the acl since AIX intends *	 * the extended info to remain unused     */	if(file_acl->acl_mode & S_IXACL){		/* while we are not pointing to the very end */		while(acl_entry < acl_last(file_acl)) {			/* before we malloc anything, make sure this is  */			/* a valid acl entry and one that we want to map */			idp = id_nxt(acl_entry->ace_id);			if((acl_entry->ace_type == ACC_SPECIFY ||				(acl_entry->ace_type == ACC_PERMIT)) && (idp != id_last(acl_entry))) {					acl_entry = acl_nxt(acl_entry);					continue;			}			idp = acl_entry->ace_id;			/* Check if this is the first entry in the linked list. *			 * The first entry needs to keep prevp pointing to NULL *			 * and already has entryp allocated.                  */			if(acl_entry_link_head->count != 0) {				acl_entry_link->nextp = SMB_MALLOC_P(struct acl_entry_link);				if(acl_entry_link->nextp == NULL) {					SAFE_FREE(file_acl);					errno = ENOMEM;					DEBUG(0,("Error in AIX sys_acl_get_file is %d\n",errno));					return(NULL);				}				acl_entry_link->nextp->prevp = acl_entry_link;				acl_entry_link = acl_entry_link->nextp;				acl_entry_link->entryp = SMB_MALLOC_P(struct new_acl_entry);				if(acl_entry_link->entryp == NULL) {					SAFE_FREE(file_acl);					errno = ENOMEM;					DEBUG(0,("Error in AIX sys_acl_get_file is %d\n",errno));					return(NULL);				}				acl_entry_link->nextp = NULL;			}			acl_entry_link->entryp->ace_len = acl_entry->ace_len;			/* Don't really need this since all types are going *			 * to be specified but, it's better than leaving it 0 */			acl_entry_link->entryp->ace_type = acl_entry->ace_type; 			acl_entry_link->entryp->ace_access = acl_entry->ace_access; 			memcpy(acl_entry_link->entryp->ace_id,idp,sizeof(struct ace_id));			/* The access in the acl entries must be left shifted by *			 * three bites, because they will ultimately be compared *			 * to S_IRUSR, S_IWUSR, and S_IXUSR.                  */			switch(acl_entry->ace_type){			case ACC_PERMIT:			case ACC_SPECIFY:				acl_entry_link->entryp->ace_access = acl_entry->ace_access;				acl_entry_link->entryp->ace_access <<= 6;				acl_entry_link_head->count++;				break;			case ACC_DENY:				/* Since there is no way to return a DENY acl entry *				 * change to PERMIT and then shift.                 */				DEBUG(10,("acl_entry->ace_access is %d\n",acl_entry->ace_access));				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));				acl_entry_link->entryp->ace_access <<= 6;				acl_entry_link_head->count++;				break;			default:				return(0);			}			DEBUG(10,("acl_entry = %d\n",acl_entry));			DEBUG(10,("The ace_type is %d\n",acl_entry->ace_type)); 			acl_entry = acl_nxt(acl_entry);		}	} /* end of if enabled */	/* Since owner, group, other acl entries are not *	 * part of the acl entries in an acl, they must  *	 * be dummied up to become part of the list.     */	for( i = 1; i < 4; i++) {		DEBUG(10,("i is %d\n",i));		if(acl_entry_link_head->count != 0) {			acl_entry_link->nextp = SMB_MALLOC_P(struct acl_entry_link);			if(acl_entry_link->nextp == NULL) {				SAFE_FREE(file_acl);				errno = ENOMEM;				DEBUG(0,("Error in AIX sys_acl_get_file is %d\n",errno));				return(NULL);			}			acl_entry_link->nextp->prevp = acl_entry_link;			acl_entry_link = acl_entry_link->nextp;			acl_entry_link->entryp = SMB_MALLOC_P(struct new_acl_entry);			if(acl_entry_link->entryp == NULL) {				SAFE_FREE(file_acl);				errno = ENOMEM;				DEBUG(0,("Error in AIX sys_acl_get_file is %d\n",errno));				return(NULL);			}		}		acl_entry_link->nextp = NULL;		new_acl_entry = acl_entry_link->entryp;		idp = new_acl_entry->ace_id;		new_acl_entry->ace_len = sizeof(struct acl_entry);		new_acl_entry->ace_type = ACC_PERMIT;		idp->id_len = sizeof(struct ace_id);		DEBUG(10,("idp->id_len = %d\n",idp->id_len));		memset(idp->id_data,0,sizeof(uid_t));		switch(i) {		case 2:			new_acl_entry->ace_access = file_acl->g_access << 6;			idp->id_type = SMB_ACL_GROUP_OBJ;			break;		case 3:			new_acl_entry->ace_access = file_acl->o_access << 6;			idp->id_type = SMB_ACL_OTHER;			break; 		case 1:			new_acl_entry->ace_access = file_acl->u_access << 6;			idp->id_type = SMB_ACL_USER_OBJ;			break; 		default:			return(NULL);		}		acl_entry_link_head->count++;		DEBUG(10,("new_acl_entry->ace_access = %d\n",new_acl_entry->ace_access));	}	acl_entry_link_head->count = 0;	SAFE_FREE(file_acl);	return(acl_entry_link_head);}SMB_ACL_T sys_acl_get_fd(int fd){	struct acl *file_acl = (struct acl *)NULL;	struct acl_entry *acl_entry;	struct new_acl_entry *new_acl_entry;	struct ace_id *idp;	struct acl_entry_link *acl_entry_link;	struct acl_entry_link *acl_entry_link_head;	int i;	int rc = 0;	uid_t user_id;	/* Get the acl using fstatacl */   	DEBUG(10,("Entering sys_acl_get_fd\n"));	DEBUG(10,("fd is %d\n",fd));	file_acl = (struct acl *)SMB_MALLOC(BUFSIZ);	if(file_acl == NULL) {		errno=ENOMEM;		DEBUG(0,("Error in sys_acl_get_fd is %d\n",errno));		return(NULL);	}	memset(file_acl,0,BUFSIZ);	rc = fstatacl(fd,0,file_acl,BUFSIZ);	if(rc == -1) {		DEBUG(0,("The fstatacl call returned %d with errno %d\n",rc,errno));		SAFE_FREE(file_acl);		return(NULL);	}	DEBUG(10,("Got facl and returned it\n"));	/* Point to the first acl entry in the acl */	acl_entry =  file_acl->acl_ext;	/* Begin setting up the head of the linked list *	 * that will be used for the storing the acl    *	 * in a way that is useful for the posix_acls.c *	 * code.                                        */	acl_entry_link_head = acl_entry_link = sys_acl_init(0);	if(acl_entry_link_head == NULL){		SAFE_FREE(file_acl);		return(NULL);	}	acl_entry_link->entryp = SMB_MALLOC_P(struct new_acl_entry);	if(acl_entry_link->entryp == NULL) {		errno = ENOMEM;		DEBUG(0,("Error in sys_acl_get_fd is %d\n",errno));		SAFE_FREE(file_acl);		return(NULL);	}	DEBUG(10,("acl_entry is %d\n",acl_entry));	DEBUG(10,("acl_last(file_acl) id %d\n",acl_last(file_acl))); 	/* Check if the extended acl bit is on.   *	 * If it isn't, do not show the           *	 * contents of the acl since AIX intends  *	 * the extended info to remain unused     */ 	if(file_acl->acl_mode & S_IXACL){		/* while we are not pointing to the very end */		while(acl_entry < acl_last(file_acl)) {			/* before we malloc anything, make sure this is  */			/* a valid acl entry and one that we want to map */			idp = id_nxt(acl_entry->ace_id);			if((acl_entry->ace_type == ACC_SPECIFY ||				(acl_entry->ace_type == ACC_PERMIT)) && (idp != id_last(acl_entry))) {					acl_entry = acl_nxt(acl_entry);					continue;			}			idp = acl_entry->ace_id; 			/* Check if this is the first entry in the linked list. *			 * The first entry needs to keep prevp pointing to NULL *			 * and already has entryp allocated.                 */			if(acl_entry_link_head->count != 0) {				acl_entry_link->nextp = SMB_MALLOC_P(struct acl_entry_link);				if(acl_entry_link->nextp == NULL) {					errno = ENOMEM;					DEBUG(0,("Error in sys_acl_get_fd is %d\n",errno));					SAFE_FREE(file_acl);					return(NULL);				}				acl_entry_link->nextp->prevp = acl_entry_link;				acl_entry_link = acl_entry_link->nextp;				acl_entry_link->entryp = SMB_MALLOC_P(struct new_acl_entry);				if(acl_entry_link->entryp == NULL) {					errno = ENOMEM;					DEBUG(0,("Error in sys_acl_get_fd is %d\n",errno));					SAFE_FREE(file_acl);					return(NULL);				}				acl_entry_link->nextp = NULL;			}			acl_entry_link->entryp->ace_len = acl_entry->ace_len;			/* Don't really need this since all types are going *			 * to be specified but, it's better than leaving it 0 */			acl_entry_link->entryp->ace_type = acl_entry->ace_type;			acl_entry_link->entryp->ace_access = acl_entry->ace_access;			memcpy(acl_entry_link->entryp->ace_id, idp, sizeof(struct ace_id));			/* The access in the acl entries must be left shifted by *			 * three bites, because they will ultimately be compared *			 * to S_IRUSR, S_IWUSR, and S_IXUSR.                  */			switch(acl_entry->ace_type){			case ACC_PERMIT:			case ACC_SPECIFY:				acl_entry_link->entryp->ace_access = acl_entry->ace_access;				acl_entry_link->entryp->ace_access <<= 6;				acl_entry_link_head->count++;				break;			case ACC_DENY:				/* Since there is no way to return a DENY acl entry *				 * change to PERMIT and then shift.                 */				DEBUG(10,("acl_entry->ace_access is %d\n",acl_entry->ace_access));				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));				acl_entry_link->entryp->ace_access <<= 6;				acl_entry_link_head->count++;				break;			default:				return(0);			}			DEBUG(10,("acl_entry = %d\n",acl_entry));			DEBUG(10,("The ace_type is %d\n",acl_entry->ace_type)); 			acl_entry = acl_nxt(acl_entry);		}	} /* end of if enabled */	/* Since owner, group, other acl entries are not *	 * part of the acl entries in an acl, they must  *	 * be dummied up to become part of the list.     */	for( i = 1; i < 4; i++) {		DEBUG(10,("i is %d\n",i));		if(acl_entry_link_head->count != 0){			acl_entry_link->nextp = SMB_MALLOC_P(struct acl_entry_link);			if(acl_entry_link->nextp == NULL) {				errno = ENOMEM;				DEBUG(0,("Error in sys_acl_get_fd is %d\n",errno));				SAFE_FREE(file_acl);				return(NULL);			}			acl_entry_link->nextp->prevp = acl_entry_link;			acl_entry_link = acl_entry_link->nextp;			acl_entry_link->entryp = SMB_MALLOC_P(struct new_acl_entry);			if(acl_entry_link->entryp == NULL) {				SAFE_FREE(file_acl);				errno = ENOMEM;				DEBUG(0,("Error in sys_acl_get_fd is %d\n",errno));				return(NULL);			}		}		acl_entry_link->nextp = NULL; 		new_acl_entry = acl_entry_link->entryp;		idp = new_acl_entry->ace_id; 		new_acl_entry->ace_len = sizeof(struct acl_entry);		new_acl_entry->ace_type = ACC_PERMIT;		idp->id_len = sizeof(struct ace_id);		DEBUG(10,("idp->id_len = %d\n",idp->id_len));		memset(idp->id_data,0,sizeof(uid_t)); 		switch(i) {		case 2:			new_acl_entry->ace_access = file_acl->g_access << 6;			idp->id_type = SMB_ACL_GROUP_OBJ;			break; 		case 3:			new_acl_entry->ace_access = file_acl->o_access << 6;			idp->id_type = SMB_ACL_OTHER;			break; 		case 1:			new_acl_entry->ace_access = file_acl->u_access << 6;			idp->id_type = SMB_ACL_USER_OBJ;			break; 		default:			return(NULL);		} 		acl_entry_link_head->count++;		DEBUG(10,("new_acl_entry->ace_access = %d\n",new_acl_entry->ace_access));	}	acl_entry_link_head->count = 0;	SAFE_FREE(file_acl); 	return(acl_entry_link_head);}int sys_acl_clear_perms(SMB_ACL_PERMSET_T permset){	*permset = *permset & ~0777;	return(0);}int sys_acl_add_perm( SMB_ACL_PERMSET_T permset, SMB_ACL_PERM_T perm){	if((perm != 0) &&			(perm & (S_IXUSR | S_IWUSR | S_IRUSR)) == 0)		return(-1);	*permset |= perm;	DEBUG(10,("This is the permset now: %d\n",*permset));	return(0);}char *sys_acl_to_text( SMB_ACL_T theacl, ssize_t *plen){	return(NULL);}SMB_ACL_T sys_acl_init( int count){	struct acl_entry_link *theacl = NULL; 	DEBUG(10,("Entering sys_acl_init\n"));	theacl = SMB_MALLOC_P(struct acl_entry_link);	if(theacl == NULL) {		errno = ENOMEM;		DEBUG(0,("Error in sys_acl_init is %d\n",errno));		return(NULL);	}	theacl->count = 0;	theacl->nextp = NULL;	theacl->prevp = NULL;	theacl->entryp = NULL;	DEBUG(10,("Exiting sys_acl_init\n"));	return(theacl);}int sys_acl_create_entry( SMB_ACL_T *pacl, SMB_ACL_ENTRY_T *pentry){	struct acl_entry_link *theacl;	struct acl_entry_link *acl_entryp;	struct acl_entry_link *temp_entry;	int counting;	DEBUG(10,("Entering the sys_acl_create_entry\n"));	theacl = acl_entryp = *pacl;	/* Get to the end of the acl before adding entry */	for(counting=0; counting < theacl->count; counting++){		DEBUG(10,("The acl_entryp is %d\n",acl_entryp));		temp_entry = acl_entryp;		acl_entryp = acl_entryp->nextp;	}	if(theacl->count != 0){		temp_entry->nextp = acl_entryp = SMB_MALLOC_P(struct acl_entry_link);		if(acl_entryp == NULL) {			errno = ENOMEM;			DEBUG(0,("Error in sys_acl_create_entry is %d\n",errno));			return(-1);		}		DEBUG(10,("The acl_entryp is %d\n",acl_entryp));		acl_entryp->prevp = temp_entry;		DEBUG(10,("The acl_entryp->prevp is %d\n",acl_entryp->prevp));	}	*pentry = acl_entryp->entryp = SMB_MALLOC_P(struct new_acl_entry);	if(*pentry == NULL) {		errno = ENOMEM;		DEBUG(0,("Error in sys_acl_create_entry is %d\n",errno));		return(-1);	}	memset(*pentry,0,sizeof(struct new_acl_entry));	acl_entryp->entryp->ace_len = sizeof(struct acl_entry);	acl_entryp->entryp->ace_type = ACC_PERMIT;	acl_entryp->entryp->ace_id->id_len = sizeof(struct ace_id);	acl_entryp->nextp = NULL;	theacl->count++;	DEBUG(10,("Exiting sys_acl_create_entry\n"));	return(0);}int sys_acl_set_tag_type( SMB_ACL_ENTRY_T entry, SMB_ACL_TAG_T tagtype){	DEBUG(10,("Starting AIX sys_acl_set_tag_type\n"));	entry->ace_id->id_type = tagtype;	DEBUG(10,("The tag type is %d\n",entry->ace_id->id_type));	DEBUG(10,("Ending AIX sys_acl_set_tag_type\n"));}int sys_acl_set_qualifier( SMB_ACL_ENTRY_T entry, void *qual){	DEBUG(10,("Starting AIX sys_acl_set_qualifier\n"));	memcpy(entry->ace_id->id_data,qual,sizeof(uid_t));	DEBUG(10,("Ending AIX sys_acl_set_qualifier\n"));	return(0);}int sys_acl_set_permset( SMB_ACL_ENTRY_T entry, SMB_ACL_PERMSET_T permset){	DEBUG(10,("Starting AIX sys_acl_set_permset\n"));	if(!(*permset & S_IXUSR) &&		!(*permset & S_IWUSR) &&		!(*permset & S_IRUSR) &&		(*permset != 0))			return(-1);	entry->ace_access = *permset;	DEBUG(10,("entry->ace_access = %d\n",entry->ace_access));	DEBUG(10,("Ending AIX sys_acl_set_permset\n"));	return(0);}int sys_acl_valid( SMB_ACL_T theacl ){	int user_obj = 0;	int group_obj = 0;	int other_obj = 0;	struct acl_entry_link *acl_entry;	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);		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);	}	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)		return(-1); 	return(0);}int sys_acl_set_file( const char *name, SMB_ACL_TYPE_T a

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -