How do I print file permissions as a string?

跟風遠走 提交于 2020-01-05 08:03:22

问题


I have a mode_t perms variable which stores the permission for a file returned from another function. I need to print the file permissions as a tring, of the form

rw-r--r-- (0644)

but what I get is

r--r--r-- (100644)

How can I get the right permissions? I've tried googling and don't understand what I'm doing wrong. Here's my code:

    void print_perms(mode_t perms)
    {
        printf( (perms & S_IRUSR) ? "r" : "-");
        printf( (perms & S_IWUSR) ? "w" : "-");
        printf( (perms & S_IXUSR) ? "x" : "-");
        printf( (perms & S_IRGRP) ? "r" : "-");
        printf( (perms & S_IWGRP) ? "w" : "-");
        printf( (perms & S_IXGRP) ? "x" : "-");
        printf( (perms & S_IROTH) ? "r" : "-");
        printf( (perms & S_IWOTH) ? "w" : "-");
        printf( (perms & S_IXOTH) ? "x" : "-");
    }
//later
print_perms(permissions);
printf(" (%d)\n", permissions);

回答1:


First, UNIX file permissions are conventionally expressed in octal, corresponding format string is "%o", not "%d". rw-r--r-- is really 0644, but in C language 0644 == 420, for example (the latter is in decimal).

Second, there are more bits used than 9 specified in the code. You actually should say something like

printf(" (%3o)", perms&0777);



回答2:


Please note that in the bitwise checks (those where you print the r, w and x) you only print the permissions you are interested in. When you print the permissions using %d, you print all permissions. Try to check for S_IFREG also. You will see it causes the 'unexpected' 100 in the beginning. In the permissions field, this bit is set to store that this is a 'regular' file.



来源:https://stackoverflow.com/questions/26616038/how-do-i-print-file-permissions-as-a-string

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!