How to read linux file permission programmatically in C/C++

前端 未结 2 567
慢半拍i
慢半拍i 2021-01-01 18:32

How can I read linux file permission programmatically instead using \"ls\" then parse the result.

相关标签:
2条回答
  • 2021-01-01 18:37

    This is a function in C, that returns file permissions in the string format "rwxr-r--"

    char* permissions(char *file){
        struct stat st;
        char *modeval = malloc(sizeof(char) * 9 + 1);
        if(stat(file, &st) == 0){
            mode_t perm = st.st_mode;
            modeval[0] = (perm & S_IRUSR) ? 'r' : '-';
            modeval[1] = (perm & S_IWUSR) ? 'w' : '-';
            modeval[2] = (perm & S_IXUSR) ? 'x' : '-';
            modeval[3] = (perm & S_IRGRP) ? 'r' : '-';
            modeval[4] = (perm & S_IWGRP) ? 'w' : '-';
            modeval[5] = (perm & S_IXGRP) ? 'x' : '-';
            modeval[6] = (perm & S_IROTH) ? 'r' : '-';
            modeval[7] = (perm & S_IWOTH) ? 'w' : '-';
            modeval[8] = (perm & S_IXOTH) ? 'x' : '-';
            modeval[9] = '\0';
            return modeval;     
        }
        else{
            return strerror(errno);
        }   
    }
    
    0 讨论(0)
  • 2021-01-01 18:39

    The stat(2) system call returns a struct stat that contains a st_mode member. This is the mode bits that ls -l displays.

    On my system, the man 2 stat page says:

       The following flags are defined for the st_mode field:
    
       S_IFMT     0170000   bitmask for the file type bitfields
       S_IFSOCK   0140000   socket
       S_IFLNK    0120000   symbolic link
       S_IFREG    0100000   regular file
       S_IFBLK    0060000   block device
       S_IFDIR    0040000   directory
       S_IFCHR    0020000   character device
       S_IFIFO    0010000   FIFO
       S_ISUID    0004000   set UID bit
       S_ISGID    0002000   set-group-ID bit (see below)
       S_ISVTX    0001000   sticky bit (see below)
       S_IRWXU    00700     mask for file owner permissions
       S_IRUSR    00400     owner has read permission
       S_IWUSR    00200     owner has write permission
       S_IXUSR    00100     owner has execute permission
       S_IRWXG    00070     mask for group permissions
       S_IRGRP    00040     group has read permission
       S_IWGRP    00020     group has write permission
       S_IXGRP    00010     group has execute permission
       S_IRWXO    00007     mask for permissions for others (not in group)
       S_IROTH    00004     others have read permission
       S_IWOTH    00002     others have write permission
       S_IXOTH    00001     others have execute permission
    
    0 讨论(0)
提交回复
热议问题