我正在阅读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;
}
使用lstat(path ...)
的mode
来表示模式。
换句话说,如果系统支持,则上述函数应该尝试设置文件或符号链接的模式。如果不支持,则应该优雅地返回。
因此,我正在检查POSIX指定的EOPNOTSUPP
错误:
[EOPNOTSUPP]
在flag参数中设置了AT_SYMLINK_NOFOLLOW位,路径名是符号链接,并且系统不支持更改符号链接的模式。
但是,我有点担心指定为EINVAL
的情况:
[EINVAL]
标志参数的值无效。
理论上,如果特定的文件系统不支持设置符号链接的模式位,我认为它实际上可以将AT_SYMLINK_NOFOLLOW
视为无效标志。
另一方面,EOPNOTSUPP
错误描述和标志的描述方式:
标记的值通过以下列表中定义的标记的按位包含OR构造:
AT_SYMLINK_NOFOLLOW
如果路径名是符号链接,则更改符号链接的模式。
让我认为,遵守规范的实现应始终将此标志视为有效。
我是正确的,还是应该在EINVAL
的情况下实施chmod()
回退?
编辑:注意,我刚刚发现,即使路径不是符号链接,Linux也会在使用AT_SYMLINK_NOFOLLOW
时返回ENOTSUP
(具有与EOPNOTSUPP
相同的值)。