文件权限与粘滞位不工作

问题描述:

我想获得文件权限,包括文件属性上的粘性位和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' : '-')); 

我尝试了一些正常的文件,但它的工作原理,但有它给出错误的输出一个特定的文件

但是当我与师范GNU测试查找命令,效果很好。 testcase-screenshot

+0

无关你的问题,但你为什么要使用两个不同的符号常量字符串的长度? 'LEN'和'STR_SIZE'有区别吗?为什么你需要显式添加字符串终止符,'snprintf'应该为你做(如果有空格)。如果使用符号常量,为什么不动态地分配开始,为什么不创建一个普通的数组? –

+0

@Someprogrammerdude谢谢,我不知道。 yea'sizeof(LEN),''snprintf'给了我错误,当我在那里使用'sizeo'f时,所以我决定使用宏。基本上是'sizeof(LEN)' –

+0

如果你的代码适用于某些文件,但不适用于其他文件,那么说些什么可以区分这些类型的文件似乎是适当的。 –

可能是因为您正在使用&&,而不是在这个&sb->st_mode && S_IRGRP

+3

在开始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自己在一行上),但是使结构之间的对称更清晰的总体思路有助于可读性。

我会观察到,这两种修复方法很容易在这种格式下发现。

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

+0

谢谢你,那是干净的。在热门编码时,我必须学习如何保持良好的格式 –