粘性位不起作用的文件权限

时间:2017-03-07 20:42:11

标签: c

我正在尝试获取文件权限,包括文件属性上的粘滞位和GUID。它似乎不适用于所有文件。

char *permstr = malloc(sizeof(char) * LEN);

    snprintf(permstr, LEN, "%c%c%c%c%c%c%c%c%c%c", ftpe, (sb->st_mode & S_IRUSR) ? 'r' : '-', 
    (sb->st_mode & S_IWUSR) ? 'w' : '-', (sb->st_mode & S_ISUID) ? (sb->st_mode & S_IXUSR ? 's' : 'S') :
                                                  (sb->st_mode & S_IXUSR ? 'x' : '-'),

     (sb->st_mode && S_IRGRP) ? 'r' : '-', (sb->st_mode & S_IWGRP) ? 'w' : '-',
     (sb->st_mode & S_ISGID) ? (sb->st_mode & S_IXGRP ? 's' : 'S') : (sb->st_mode & S_IXGRP ? 'x' : '-'),

     (sb->st_mode & S_IROTH) ? 'r' : '-', (sb->st_mode & S_IWOTH) ? 'w' : '-',
     (sb->st_mode & S_ISVTX) ? (sb->st_mode & S_IXOTH ? 't' : 'T') : (sb->st_mode & S_IXOTH ? 'x' : '-'));

我尝试了一些普通的文件,但它有效,但有一个特定的文件,它提供了错误的输出

但是当我使用normale GNU Find命令测试时,它运行良好。 testcase-screenshot

2 个答案:

答案 0 :(得分:1)

可能因为你在&&使用&而不是sb->st_mode && S_IRGRP:{{1}}

答案 1 :(得分:1)

作为格式化建议,请考虑:

snprintf(permstr, STR_SIZE, "%c%c%c%c%c%c%c%c%c%c", ftpe,
            (sb->st_mode & S_IRUSR) ? 'r' : '-',
            (sb->st_mode & S_IWUSR) ? 'w' : '-',
            (sb->st_mode & S_ISUID) ? (sb->st_mode & S_IXUSR ? 's' : 'S') :
                                      (sb->st_mode & S_IXUSR ? 'x' : '-'),

            (sb->st_mode & S_IRGRP) ? 'r' : '-',    // Fix 1 (&& --> &)
            (sb->st_mode & S_IWGRP) ? 'w' : '-',    // Fix 2 (prefix '(')
            (sb->st_mode & S_ISGID) ? (sb->st_mode & S_IXGRP ? 's' : 'S') :
                                      (sb->st_mode & S_IXGRP ? 'x' : '-'),

            (sb->st_mode & S_IROTH) ? 'r' : '-',
            (sb->st_mode & S_IWOTH) ? 'w' : '-',
            (sb->st_mode & S_ISVTX) ? (sb->st_mode & S_IXOTH ? 't' : 'T') :
                                      (sb->st_mode & S_IXOTH ? 'x' : '-')
        );

这至少可以让你更容易看到发生了什么。我确定在缩进的最佳点上会有一些不同意见(如果每个位的行还有3个空格缩进 - 那也没关系;应该是文件吗?类型ftpe本身也在一条线上,但是使结构之间的对称性更清晰的总体思路有助于提高可读性。

我发现这两种修复方法都很容易被发现。

请不要接受这个''回答;只是将其视为无法在评论中展示的布局建议。它是一个格式化的评论,只要它是一个答案。