LoginSignup
0
0

More than 5 years have passed since last update.

Linux で EXT2 FileSystem の拡張属性を操作する(C言語で)

Last updated at Posted at 2013-05-05

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 ケーパビリティを持つプロセスが可能だと思います.

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0