4

我正在编写要在 UNIX 上运行的 ac 程序,并尝试使用 chmod 命令。查阅手册页后,我知道 chmod 需要两个参数。第一个是权限位,第二个是要更改的文件。我想对文件的当前权限位和用户输入的位进行按位或运算,并将其提供给 chmod() 以更改文件的权限。

我找到了该access()功能,但无法弄清楚如何使用它来获取指定文件的权限位。

我现在拥有的是:

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");
                }

在哪里:

argv[1] 包含一个由用户输入的三位十进制数的字符串,该字符串将转换为八进制,然后用作进行按位或运算的权限位,

argv[2] 是要更改其权限的文​​件,也由用户指定。

octalPermissionString 是一个 long 用于保存用户输入的八进制转换。

是否/是否有任何其他函数可以返回给定文件的权限位?

编辑:缺少右括号

4

2 回答 2

6

可以使用 stat 函数返回的结构的 st_mode 字段来确定权限位。可以使用常量 S_IRUSR(用户读取)、S_IWUSR(用户写入)、S_IRGRP(组读取)等来提取各个位。

例子:

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
}

就将其传递给 chmod 而言,mode_t 只是 uint_32 的 typedef,因此应该足够简单。

于 2013-11-27T09:31:28.777 回答
1

可以使用 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;
}
于 2013-11-27T09:55:35.157 回答