我正在阅读fchmodat() POSIX 函数规范,但不确定以下内容是否正确:
#include <fcntl.h>
#include <sys/stat.h>
int chown_test(const char* path, mode_t mode, mode_t new_mode)
{
#ifdef HAVE_FCHMODAT
if (fchmodat(AT_FDCWD, path, new_mode,
AT_SYMLINK_NOFOLLOW) && errno != EOPNOTSUPP)
return 1;
#else
if (!S_ISLNK(mode) && chmod(path, new_mode))
return 1;
#endif
return 0;
}
随着. mode
_ st_mode
_lstat(path...)
换句话说,如果系统支持,上述函数应该尝试设置文件或符号链接的模式。如果没有,它应该优雅地返回。
出于这个原因,我正在检查EOPNOTSUPP
POSIX 指定的错误:
[EOPNOTSUPP]
在 flag 参数中设置 AT_SYMLINK_NOFOLLOW 位,路径命名符号链接,系统不支持更改符号链接的模式。
但是,我有点担心EINVAL
哪个被指定为:
[EINVAL]
flag 参数的值无效。
从理论上讲,如果特定文件系统不支持设置符号链接的模式位,我认为它实际上可以AT_SYMLINK_NOFOLLOW
视为无效标志。
另一方面,EOPNOTSUPP
错误描述和描述标志的方式:
标志的值由以下列表中标志的按位或构成,定义在:
AT_SYMLINK_NOFOLLOW
如果 path 命名符号链接,则符号链接的模式将更改。
让我认为这个标志应该始终被兼容的实现视为有效。
我是正确的还是应该实施后备chmod()
以防万一EINVAL
?
编辑:作为说明,我刚刚发现 Linux 在使用时返回ENOTSUP
(与 具有相同的值EOPNOTSUPP
)AT_SYMLINK_NOFOLLOW
,即使路径没有命名符号链接。