调用 stat 后权限覆盖
Permission override after stat is called
嗨,我正在用 FUSE 写 "net raid fs"。
因此,当系统调用 getattr
被调用时,我将它发送到服务器,服务器正在调用 stat(path, stbuf)
系统调用,它会设置 stbuf
它应该做的。之后我将这个 stbuf
返回给客户端(使用套接字连接)并且客户端处理它并且一切正常。
但问题是:我希望 stbuf->st_mode
(AKA 权限)始终为 0777,所以我正在执行 stbuf->st_mode = 0777;
,然后将此 struct
发送给客户端(正如我上面所做的那样)。并且程序有点冻结(服务器 [或客户端] 停止正确接收系统调用)。
怎么办?
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 */
嗨,我正在用 FUSE 写 "net raid fs"。
因此,当系统调用 getattr
被调用时,我将它发送到服务器,服务器正在调用 stat(path, stbuf)
系统调用,它会设置 stbuf
它应该做的。之后我将这个 stbuf
返回给客户端(使用套接字连接)并且客户端处理它并且一切正常。
但问题是:我希望 stbuf->st_mode
(AKA 权限)始终为 0777,所以我正在执行 stbuf->st_mode = 0777;
,然后将此 struct
发送给客户端(正如我上面所做的那样)。并且程序有点冻结(服务器 [或客户端] 停止正确接收系统调用)。
怎么办?
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 */