我正在尝试获取文件权限,包括文件属性上的粘滞位和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' : '-'));
我尝试了一些普通的文件,但它有效,但有一个特定的文件,它提供了错误的输出
答案 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
本身也在一条线上,但是使结构之间的对称性更清晰的总体思路有助于提高可读性。
我发现这两种修复方法都很容易被发现。
请不要接受这个''回答;只是将其视为无法在评论中展示的布局建议。它是一个格式化的评论,只要它是一个答案。