EXT FIleSystem (ext2,ext3,ext4) には,ファイルに対して通常の属性以外にも,拡張属性が設定できることが知られています.
これらは,lsattr コマンドや chattr コマンドを操作して使いますが,C言語で直接操作する方法が意外と見つからなかったので書いておきます.
拡張属性の情報を得る
ファイルを open() で開き,ファイルディスクリプタに対して ioctl() でFS_IOC_GETFLAGS
を使うことで拡張情報が得られます.
#include <linux/fs.h>
#include <sys/ioctl.h>
...
...
unsigned long FSflags;
sts = ioctl(fd, FS_IOC_GETFLAGS, &FSflags);
上記の場合,FSflags にそのファイルディスクリプタで開いているファイルの拡張属性が得られます.
拡張属性はビット集合で,linux/fs.h に定義されています.以下にその定義を一部引用します.
/*
* Inode flags (FS_IOC_GETFLAGS / FS_IOC_SETFLAGS)
*/
#define FS_SECRM_FL 0x00000001 /* Secure deletion */
#define FS_UNRM_FL 0x00000002 /* Undelete */
#define FS_COMPR_FL 0x00000004 /* Compress file */
#define FS_SYNC_FL 0x00000008 /* Synchronous updates */
#define FS_IMMUTABLE_FL 0x00000010 /* Immutable file */
#define FS_APPEND_FL 0x00000020 /* writes to file may only append */
#define FS_NODUMP_FL 0x00000040 /* do not dump file */
#define FS_NOATIME_FL 0x00000080 /* do not update atime */
...
例えば (FLflags & FS_NODUMP_FL) != 0
であれば,NO DUMP フラグが設定されているので dump コマンドではバックアップしません.
拡張属性を設定する
ioctl() で FS_IOC_SETFLAGS
を指定します.
#include <linux/fs.h>
#include <sys/ioctl.h>
...
...
unsigned long FSflags = FS_NODUMP_FL
sts = ioctl(fd, FS_IOC_SETFLAGS , &FSflags);
上記の例では,他のビットをクリアして,NO DUMP フラグだけを設定します.OR でフラグをセットしたい場合は,FS_IOC_GETFLAGS
で読みだしたフラグに対してORでセットして,FS_IOC_SETFLAGS
を指定すれば良いです.
なお,これは試していませんが,FS_IMMUTABLE_FL
はそのファイルの変更を禁止するビットですが,このビットの操作には スーパーユーザまたは CAP_LINUX_IMMUTABLE ケーパビリティを持つプロセスが可能だと思います.