]>
git.ipfire.org Git - thirdparty/e2fsprogs.git/blob - misc/chattr.c
2 * chattr.c - Change file attributes on an ext2 file system
4 * Copyright (C) 1993, 1994 Remy Card <card@masi.ibp.fr>
5 * Laboratoire MASI, Institut Blaise Pascal
6 * Universite Pierre et Marie Curie (Paris VI)
8 * This file can be redistributed under the terms of the GNU General
15 * 93/11/13 - Replace stat() calls by lstat() to avoid loops
16 * 94/02/27 - Integrated in Ted's distribution
25 #include <sys/param.h>
27 #include <linux/ext2_fs.h>
29 #include "et/com_err.h"
32 #include "../version.h"
34 const char * program_name
= "chattr";
41 unsigned long version
;
50 static void volatile fatal_error (const char * fmt_string
, int errcode
)
52 fprintf (stderr
, fmt_string
, program_name
);
56 #define usage() fatal_error ("usage: %s [-RV] [-+=acdisSu] [-v version] files...\n", \
59 static int decode_arg (int * i
, int argc
, char ** argv
)
67 for (p
= &argv
[*i
][1]; *p
; p
++)
96 #ifdef EXT2_IMMUTABLE_FL
98 rf
|= EXT2_IMMUTABLE_FL
;
114 version
= strtol (argv
[*i
], &tmp
, 0);
117 com_err (program_name
, 0,
118 "bad version - %s\n", argv
[*i
]);
124 fprintf (stderr
, "%s: Unrecognized argument: %c\n",
131 for (p
= &argv
[*i
][1]; *p
; p
++)
137 #ifdef EXT2_APPEND_FL
139 af
|= EXT2_APPEND_FL
;
145 #ifdef EXT2_NODUMP_FL
147 af
|= EXT2_NODUMP_FL
;
150 #ifdef EXT2_IMMUTABLE_FL
152 af
|= EXT2_IMMUTABLE_FL
;
167 for (p
= &argv
[*i
][1]; *p
; p
++)
173 #ifdef EXT2_APPEND_FL
175 sf
|= EXT2_APPEND_FL
;
181 #ifdef EXT2_NODUMP_FL
183 sf
|= EXT2_NODUMP_FL
;
186 #ifdef EXT2_IMMUTABLE_FL
188 sf
|= EXT2_IMMUTABLE_FL
;
208 static int chattr_dir_proc (const char *, struct dirent
*, void *);
210 static void change_attributes (const char * name
)
215 if (lstat (name
, &st
) == -1)
217 com_err (program_name
, errno
, "while stating %s", name
);
224 printf ("Flags of %s set as ", name
);
225 print_flags (stdout
, sf
, 0);
228 if (fsetflags (name
, sf
) == -1)
233 if (fgetflags (name
, &flags
) == -1)
234 com_err (program_name
, errno
,
235 "while reading flags on %s", name
);
244 printf ("Flags of %s set as ", name
);
245 print_flags (stdout
, flags
, 0);
248 if (fsetflags (name
, flags
) == -1)
249 com_err (program_name
, errno
,
250 "while setting flags on %s", name
);
256 printf ("Version of %s set as %lu\n", name
, version
);
257 if (fsetversion (name
, version
) == -1)
258 com_err (program_name
, errno
,
259 "while setting version on %s", name
);
261 if (S_ISDIR(st
.st_mode
) && recursive
)
262 iterate_on_dir (name
, chattr_dir_proc
, (void *) NULL
);
265 static int chattr_dir_proc (const char * dir_name
, struct dirent
* de
, void * private)
267 char path
[MAXPATHLEN
];
269 if (strcmp (de
->d_name
, ".") && strcmp (de
->d_name
, ".."))
271 sprintf (path
, "%s/%s", dir_name
, de
->d_name
);
272 change_attributes (path
);
277 void main (int argc
, char ** argv
)
282 fprintf (stderr
, "chattr %s, %s for EXT2 FS %s, %s\n",
283 E2FSPROGS_VERSION
, E2FSPROGS_DATE
,
284 EXT2FS_VERSION
, EXT2FS_DATE
);
286 program_name
= *argv
;
288 while (i
< argc
&& !end_arg
)
290 if (decode_arg (&i
, argc
, argv
) == EOF
)
297 if (set
&& (add
|| rem
))
299 fprintf (stderr
, "= is incompatible with - and +\n");
302 if (!(add
|| rem
|| set
))
304 fprintf (stderr
, "Must use =, - or +\n");
307 for (j
= i
; j
< argc
; j
++)
308 change_attributes (argv
[j
]);