3

我正在阅读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...)

换句话说,如果系统支持,上述函数应该尝试设置文件或符号链接的模式。如果没有,它应该优雅地返回。

出于这个原因,我正在检查EOPNOTSUPPPOSIX 指定的错误:

[EOPNOTSUPP]

在 flag 参数中设置 AT_SYMLINK_NOFOLLOW 位,路径命名符号链接,系统不支持更改符号链接的模式。

但是,我有点担心EINVAL哪个被指定为:

[EINVAL]

flag 参数的值无效。

从理论上讲,如果特定文件系统不支持设置符号链接的模式位,我认为它实际上可以AT_SYMLINK_NOFOLLOW视为无效标志。

另一方面,EOPNOTSUPP错误描述和描述标志的方式:

标志的值由以下列表中标志的按位或构成,定义在:

AT_SYMLINK_NOFOLLOW

如果 path 命名符号链接,则符号链接的模式将更改。

让我认为这个标志应该始终被兼容的实现视为有效。

我是正确的还是应该实施后备chmod()以防万一EINVAL


编辑:作为说明,我刚刚发现 Linux 在使用时返回ENOTSUP(与 具有相同的值EOPNOTSUPPAT_SYMLINK_NOFOLLOW,即使路径没有命名符号链接。

4

1 回答 1

0

相关文本是 XSH 2.3 Error Numbers:

实现可能支持未包含在此列表中的其他错误,可能会在此处描述的情况以外的情况下生成此列表中包含的错误,或者可能包含防止某些错误发生的扩展或限制。

起初,这似乎允许所描述的行为。但是我相信下面的文字:

当且仅当所有这些错误条件始终与本卷 POSIX.1-2008 中描述的错误条件相同时,实现可能会在上述情况下生成此处列出的错误编号。对于本卷 POSIX.1-2008 中描述的错误情况,实现不应生成与本卷 POSIX.1-2008 所要求的错误编号不同的错误编号,但可能会产生额外的错误,除非明确禁止特定功能。

呈现一个EINVAL不符合此条件的实现。POSIX 指定EOPNOTSUPP此条件的错误代码,因此实现“不应”(这是规范要求)为其生成不同的错误代码。

来源: http: //pubs.opengroup.org/onlinepubs/9699919799/functions/V2_chap02.html#tag_15_03

于 2012-09-12T22:31:41.823 回答