调用stat后的权限覆盖

时间:2018-07-18 21:44:07

标签: c permissions system-calls fuse stat

嗨,我正在用FUSE编写“ net raid fs”。

因此,当调用syscall getattr时,我将其发送到服务器,服务器正在调用stat(path, stbuf) syscall并按需设置stbuf。之后,我将此stbuf返回给客户端(具有套接字连接),并由客户端处理,一切正常。

但这是问题所在:我希望stbuf->st_mode(又称“权限”)始终为0777,所以我正在做stbuf->st_mode = 0777;,然后将此struct发送给客户端(因为我上面做了)。并且程序冻结(服务器[或客户端]停止正确接收系统调用)。

该怎么办?

1 个答案:

答案 0 :(得分:2)

st_mode成员不仅包含权限,还包含文件类型(目录,fifo,设备专用文件等)。如果您仅为其分配0777,则将删除类型信息。您应该只覆盖权限位。

stbuf->mode |= 0777;

从文档中:

 The status information word st_mode has the following bits:

 #define S_IFMT 0170000           /* type of file */
 #define        S_IFIFO  0010000  /* named pipe (fifo) */
 #define        S_IFCHR  0020000  /* character special */
 #define        S_IFDIR  0040000  /* directory */
 #define        S_IFBLK  0060000  /* block special */
 #define        S_IFREG  0100000  /* regular */
 #define        S_IFLNK  0120000  /* symbolic link */
 #define        S_IFSOCK 0140000  /* socket */
 #define        S_IFWHT  0160000  /* whiteout */
 #define S_ISUID 0004000  /* set user id on execution */
 #define S_ISGID 0002000  /* set group id on execution */
 #define S_ISVTX 0001000  /* save swapped text even after use */
 #define S_IRUSR 0000400  /* read permission, owner */
 #define S_IWUSR 0000200  /* write permission, owner */
 #define S_IXUSR 0000100  /* execute/search permission, owner */