I am writing a c program to be run on UNIX, and attempting to utilize the chmod command. After consulting the man pages, i know that chmod needs two parameters. first is the permission bits, second is the file to be changed. I want to take the bitwise OR of the file's current permission bits and those entered by the user, and feed that to chmod() to change the file's permissions.
I found the access()
function, but am having trouble figuring out how to use it to get the permission bits of the specified file.
What i have right now is:
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 string of a three digit decimal number entered by the user to be converted to octal and then be used as the permission bits to be bitwise OR'ed,
argv[2] is the the file to have it's permission changed, also specified by the user.
octalPermissionString is a long to hold the octal conversion of user input.
Is/Are there any other functions that can return the permission bits of a given file?
EDIT: missing close parenthesis
The permission bits can be ascertained using the st_mode field of the struct returned by the stat function. The 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 a uint_32, so that should be simple enough.