【无标题】gpfs 文件系统上使用gpfs获取用户的acl

本文介绍了如何使用C语言在GPFS文件系统上获取文件的访问控制列表(AccessControlList,ACL),包括对NFS4和旧版本ACL类型的处理,通过遍历并解析ACEs来显示用户权限信息。
摘要由CSDN通过智能技术生成

gpfs 文件系统上使用gpfs获取用户的acl

code
#include <stdio.h>
#include <gpfs.h>
#include <stdlib.h>
#include <limits.h>
#include <errno.h>
#include <pwd.h>
int main(int argc, char **argv) {
    if(argc<2){
        return 0;
    }	 
    const char* file_path = argv[1];
    int aclflags = GPFS_GETACL_STRUCT;
    unsigned char acltype = GPFS_ACL_TYPE_ACCESS;
    unsigned int *len;
    char permission[4] = {"---"};
    size_t bufsize = 1024;
    void *acl_mem = malloc(bufsize);
    memset(acl_mem, 0, bufsize);
    gpfs_acl_t *acl_buffer = (gpfs_acl_t *) acl_mem;
    len = (unsigned int *) &(acl_buffer->acl_len);
    acl_buffer->acl_len = bufsize - sizeof(gpfs_acl_t);
    int rc = gpfs_getacl(file_path, aclflags, acl_mem);
    while( rc!=0 && (errno == ENOSPC)){
      /* free the old buffer, then malloc the new size */
      bufsize = *len + sizeof(gpfs_acl_t);
      free(acl_mem);
      acl_mem = malloc(bufsize);
      memset(acl_mem, 0, bufsize);
      acl_buffer = (gpfs_acl_t *) acl_mem;
      acl_buffer->acl_len = (int) bufsize;
      rc = gpfs_getacl(file_path, aclflags, acl_mem);
    }
    if (rc != 0) {
        fprintf(stderr, "Failed to get ACL for file: %d\n", rc);
        perror("failed get ACL data");
        free(acl_mem);
        return 1;
    }
    fprintf(stderr,"gpfs_aclVersion_t is %d\n",acl_buffer->acl_version);
    if(acl_buffer->acl_version==GPFS_ACL_VERSION_NFS4){
        int i = 0;	
        for (i = 0; i < acl_buffer->acl_nace; ++i) {
            gpfs_ace_v4_t* ace = &(acl_buffer->ace_v4[i]);
            struct passwd *user = getpwuid(ace->aceWho);
            if(NULL == user)
                  continue;
                if ((ace->aceMask & ACE4_MASK_READ) && (ace->aceMask & ACE4_MASK_READ_NAMED)) 
                {
                    permission[0]='r';
                }
                else 
                {
                    permission[0]='-';
                }
                if((ace->aceMask & ACE4_MASK_WRITE) && (ace->aceMask & ACE4_MASK_APPEND) && (ace->aceMask & ACE4_MASK_READ_NAMED))
                {
                    permission[1]='w';
                }
                else
                {
                    permission[1]='-';
                }
                if((ace->aceMask & ACE4_MASK_EXECUTE) && (ace->aceMask & ACE4_MASK_READ_NAMED))
                {
                    permission[2]='x';
                }
                else 
                {
                    permission[2]='-';
                }  
                printf("Entry %d:User=%s , Perm=%s \n", i, user->pw_name, permission);
            }
    }
    else {
        int i = 0;	
        for (i = 0; i < acl_buffer->acl_nace; ++i) {
            gpfs_ace_v1_t* ace = &(acl_buffer->ace_v1[i]);
            struct passwd *user = getpwuid(ace->ace_who);
            if(NULL == user)
                  continue;
            if (ace->ace_perm & ACL_PERM_READ) {
                    permission[0]='r';
                }else {
                    permission[0]='-';
                }
                if(ace->ace_perm & ACL_PERM_WRITE){
                    permission[1]='w';
                }else {
                    permission[1]='-';
                }
                if(ace->ace_perm & ACL_PERM_EXECUTE){
                    permission[2]='x';
                }else {
                    permission[2]='-';
                }
                printf("Entry %d:User=%s , Perm=%s \n", i, user->pw_name, permission);
            }
    }
    free(acl_mem);
    return 0;
}
编译
gcc -g2 -o testGpfs testGpfs.c -I/usr/lpp/mmfs/include  -lgpfs
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值