183
static int chattr_dir_proc (const char *, struct dirent *, void *);
188
static int chattr_dir_proc(const char *, struct dirent *, void *);
185
static void change_attributes (const char * name)
190
static int change_attributes(const char * name)
187
192
unsigned long flags;
190
195
if (LSTAT (name, &st) == -1) {
191
com_err (program_name, errno, _("while trying to stat %s"),
197
com_err (program_name, errno,
198
_("while trying to stat %s"), name);
195
if (S_ISLNK(st.st_mode) && recursive)
198
/* Don't try to open device files, fifos etc. We probably
199
ought to display an error if the file was explicitly given
200
on the command line (whether or not recursive was
202
if (!S_ISREG(st.st_mode) && !S_ISLNK(st.st_mode) &&
203
!S_ISDIR(st.st_mode))
212
208
if (fsetflags (name, sf) == -1)
215
if (fgetflags (name, &flags) == -1)
216
com_err (program_name, errno,
217
_("while reading flags on %s"), name);
211
if (fgetflags (name, &flags) == -1) {
213
com_err (program_name, errno,
214
_("while reading flags on %s"), name);
228
226
if (!S_ISDIR(st.st_mode))
229
227
flags &= ~EXT2_DIRSYNC_FL;
230
if (fsetflags (name, flags) == -1)
231
com_err (program_name, errno,
232
_("while setting flags on %s"), name);
228
if (fsetflags (name, flags) == -1) {
230
com_err(program_name, errno,
231
_("while setting flags on %s"),
235
237
if (set_version) {
237
239
printf (_("Version of %s set as %lu\n"), name, version);
238
if (fsetversion (name, version) == -1)
239
com_err (program_name, errno,
240
_("while setting version on %s"), name);
240
if (fsetversion (name, version) == -1) {
242
com_err (program_name, errno,
243
_("while setting version on %s"),
242
248
if (S_ISDIR(st.st_mode) && recursive)
243
iterate_on_dir (name, chattr_dir_proc, NULL);
249
return iterate_on_dir (name, chattr_dir_proc, NULL);
246
253
static int chattr_dir_proc (const char * dir_name, struct dirent * de,
247
254
void * private EXT2FS_ATTR((unused)))
249
258
if (strcmp (de->d_name, ".") && strcmp (de->d_name, "..")) {
254
263
fprintf(stderr, _("Couldn't allocate path variable "
255
264
"in chattr_dir_proc"));
258
sprintf (path, "%s/%s", dir_name, de->d_name);
259
change_attributes (path);
267
sprintf(path, "%s/%s", dir_name, de->d_name);
268
ret = change_attributes(path);
265
274
int main (int argc, char ** argv)
270
280
#ifdef ENABLE_NLS
271
281
setlocale(LC_MESSAGES, "");
304
314
fprintf (stderr, "chattr %s (%s)\n",
305
315
E2FSPROGS_VERSION, E2FSPROGS_DATE);
306
for (j = i; j < argc; j++)
307
change_attributes (argv[j]);
316
for (j = i; j < argc; j++) {
317
err = change_attributes (argv[j]);