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_modelstat(path...)

つまり、システムがサポートしている場合、上記の関数はファイルまたはシンボリックリンクのモードを設定しようとするはずです。そうでない場合は、正常に戻る必要があります。

そのため、EOPNOTSUPPPOSIX で指定されているエラーをチェックしています。

[EOPNOTSUPP]

フラグ引数で AT_SYMLINK_NOFOLLOW ビットが設定され、パス名がシンボリック リンクであり、システムがシンボリック リンクのモードの変更をサポートしていません。

EINVALただし、どちらが次のように指定されているかは少し心配です。

[EINVAL]

フラグ引数の値が無効です。

AT_SYMLINK_NOFOLLOW理論的には、特定のファイル システムがシンボリック リンクのモード ビットの設定をサポートしていない場合、実際には無効なフラグとして扱われる可能性があると思います。

一方、EOPNOTSUPPエラーの説明とフラグの記述方法は次のとおりです。

flag の値は、 で定義されている次のリストのフラグのビットごとの包括的 OR によって構築されます。

AT_SYMLINK_NOFOLLOW

path がシンボリック リンクを指定する場合、シンボリック リンクのモードが変更されます。

このフラグは、準拠した実装によって常に有効に扱われるべきだと思います。

私は正しいですか、またはchmod()の場合にフォールバックを実装する必要がありEINVALますか?


編集:注意として、パスがシンボリックリンクを指定していなくても、Linuxが使用されるたびENOTSUPに(と同じ値を持つ)を返すことがわかりました。EOPNOTSUPPAT_SYMLINK_NOFOLLOW

4

1 に答える 1

0

関連するテキストは、XSH 2.3 エラー番号です。

実装は、このリストに含まれていない追加のエラーをサポートしたり、ここで説明した以外の状況でこのリストに含まれるエラーを生成したり、一部のエラーの発生を防ぐ拡張機能や制限を含んでいる場合があります。

最初は、これにより説明されている動作が可能になるようです。ただし、すぐ下に続くテキストを信じています。

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 に答える