ファイルタイプインジケータ、sys / stat.h st_mode通常のファイルコード値
-
22-07-2019 - |
質問
ディレクトリエントリのファイルタイプを識別しようとしています(Windows Unixなど)。
sys / stat.hでは、st_modeワードの上位ニブルにはコード化された値があります:
#define S_IFDIR 0x4000 /* directory */
#define S_IFIFO 0x1000 /* FIFO special */
#define S_IFCHR 0x2000 /* character special */
#define S_IFBLK 0x3000 /* block special */
#define S_IFREG 0x8000 /* or just 0x0000, regular */
コメントから、ナイブルは0または8のいずれかである可能性があります 「通常のファイル」。
だから、これは疑問を投げかけます:どのような状況で8ではなく0ですか? これらのコードを定義していた場合、0を予約して初期化することになります。 unknown / undefined / invalid / not-a-fileなど。
実際には、S_ISREGマクロは次のとおりです。
#define S_ISREG(m) ((m) & S_IFREG)
これは、通常のファイルが 常にコード8を持っていると期待されます(そして0は攻撃ですか?)。
0を不明または無効なファイルとして解釈し、「または単に0x0000」コメントを無視し、常にすべての通常ファイルに8が使用されることを期待するのは有効な仮定でしょうか?
解決
ほとんどのソースは、S_ISREGのチェックで十分であることを示しています。 0x0000が「通常」として表示されるかどうかはわかりません。ファイル。
いくつかの古い実装では0x0000が使用されていたと思います(実際に古いDJGPPヘッダー検索でこれが判明します)が、それは私が見つけることができる唯一の実際の参照です。その他はすべて0x8000を指します。
基本的に、S_ISREGマクロを使用し、コンパイル対象のヘッダーが正しいことを行うことを期待します。
他のヒント
S_IFREGおよびS_ISREGの定義を信頼します。これらのマクロを壊したファイルシステムで作業したことはありません。
私の推測では、通常のファイルの0x0000定義は、ファイルタイプ情報の異なるエンコードを使用した可能性があるレガシーファイルシステムを処理することです。使用しているOSとファイルシステムは何ですか?