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