Is there a C function to get file permissions?

I am writing a c program to run on UNIX and am trying to use the chmod command. After consulting the man pages, I know that chmod needs two parameters. first the permission bit, the second is the file that needs to be changed. I want to take the bitwise OR of the current file permission bits and those entered by the user, and pass this to chmod () to change the file permissions.

I found a function access(), but it's hard for me to figure out how to use it to get the permission bit of the specified file.

What do I mean now:

octalPermissionString = strtol(argv[1], (char**)NULL, 8);
if(chmod(argv[2], octalPermissionString | (access(argv[2], octalPermissionString)) < 0) {
                    fprintf(stderr, "Permissions of file %s were not changed.\n");
                }

Where:

argv [1] contains a three-digit decimal number string entered by the user to convert to octal, and then used as permission bits for bitwise OR'ed,

argv [2] is the file that changed its resolution, also specified by the user.

octalPermissionString holds the octal conversion of user input for a long time.

Are there / Are there any other functions that can return a permission bit for a given file?

EDIT: missing closing bracket

+4
source share
2 answers

Permission bits can be set using the st_mode field of the structure returned by the stat function. Individual bits can be extracted using the constants S_IRUSR (User Read), S_IWUSR (User Write), S_IRGRP (Group Read), etc.

Example:

struct stat statRes;
if(stat(file, &statRes) < 0)return 1;
mode_t bits = statRes.st_mode;
if((bits & S_IRUSR) == 0){
    //User doesn't have read privilages
}

In terms of passing this to chmod mode_t is just a typedef of uint_32, so this should be fairly simple.

+5

, stat (2), S_ *. stat (2):

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>


int getChmod(const char *path){
    struct stat ret;

    if (stat(path, &ret) == -1) {
        return -1;
    }

    return (ret.st_mode & S_IRUSR)|(ret.st_mode & S_IWUSR)|(ret.st_mode & S_IXUSR)|/*owner*/
        (ret.st_mode & S_IRGRP)|(ret.st_mode & S_IWGRP)|(ret.st_mode & S_IXGRP)|/*group*/
        (ret.st_mode & S_IROTH)|(ret.st_mode & S_IWOTH)|(ret.st_mode & S_IXOTH);/*other*/
}

int main(){

    printf("%0X\n",getChmod("/etc/passwd"));

    return 0;
}
+1

All Articles