文件权限与粘滞位不工作
我想获得文件权限,包括文件属性上的粘性位和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' : '-'));
我尝试了一些正常的文件,但它的工作原理,但有它给出错误的输出一个特定的文件
可能是因为您正在使用&&
,而不是在这个&
:sb->st_mode && S_IRGRP
在开始sb-> st_mode&S_ISGID)的行的开头还有一个开括号。 –
一种格式化的建议,请考虑:
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
自己在一行上),但是使结构之间的对称更清晰的总体思路有助于可读性。
我会观察到,这两种修复方法很容易在这种格式下发现。
请不要接受这个为“”的答案;只是将其视为无法在评论中展示的布局建议。这是一个格式化的评论,尽管它是一个答案。
谢谢你,那是干净的。在热门编码时,我必须学习如何保持良好的格式 –
无关你的问题,但你为什么要使用两个不同的符号常量字符串的长度? 'LEN'和'STR_SIZE'有区别吗?为什么你需要显式添加字符串终止符,'snprintf'应该为你做(如果有空格)。如果使用符号常量,为什么不动态地分配开始,为什么不创建一个普通的数组? –
@Someprogrammerdude谢谢,我不知道。 yea'sizeof(LEN),''snprintf'给了我错误,当我在那里使用'sizeo'f时,所以我决定使用宏。基本上是'sizeof(LEN)' –
如果你的代码适用于某些文件,但不适用于其他文件,那么说些什么可以区分这些类型的文件似乎是适当的。 –