~csurbhi/ubuntu/maverick/e2fsprogs/e2fsprogs.fix-505719

« back to all changes in this revision

Viewing changes to misc/chattr.c

  • Committer: Bazaar Package Importer
  • Author(s): Steve Langasek
  • Date: 2008-08-08 20:32:11 UTC
  • mfrom: (1.1.11 upstream)
  • Revision ID: james.westby@ubuntu.com-20080808203211-w72lpsd9q7o3bw6x
Tags: 1.41.0-3ubuntu1
* Merge from Debian unstable (LP: #254152, #246461), remaining changes:
  - Do not build-depend on dietlibc-dev, which is in universe.

Show diffs side-by-side

added added

removed removed

Lines of Context:
65
65
 
66
66
static int recursive;
67
67
static int verbose;
 
68
static int silent;
68
69
 
69
70
static unsigned long af;
70
71
static unsigned long rf;
80
81
 
81
82
static void usage(void)
82
83
{
83
 
        fprintf(stderr, 
84
 
                _("Usage: %s [-RV] [-+=AacDdijsSu] [-v version] files...\n"),
 
84
        fprintf(stderr,
 
85
                _("Usage: %s [-RVf] [-+=AacDdijsSu] [-v version] files...\n"),
85
86
                program_name);
86
87
        exit(1);
87
88
}
137
138
                                verbose = 1;
138
139
                                continue;
139
140
                        }
 
141
                        if (*p == 'f') {
 
142
                                silent = 1;
 
143
                                continue;
 
144
                        }
140
145
                        if (*p == 'v') {
141
146
                                (*i)++;
142
147
                                if (*i >= argc)
144
149
                                version = strtol (argv[*i], &tmp, 0);
145
150
                                if (*tmp) {
146
151
                                        com_err (program_name, 0,
147
 
                                                 _("bad version - %s\n"), 
 
152
                                                 _("bad version - %s\n"),
148
153
                                                 argv[*i]);
149
154
                                        usage ();
150
155
                                }
180
185
        return 1;
181
186
}
182
187
 
183
 
static int chattr_dir_proc (const char *, struct dirent *, void *);
 
188
static int chattr_dir_proc(const char *, struct dirent *, void *);
184
189
 
185
 
static void change_attributes (const char * name)
 
190
static int change_attributes(const char * name)
186
191
{
187
192
        unsigned long flags;
188
193
        STRUCT_STAT     st;
189
194
 
190
195
        if (LSTAT (name, &st) == -1) {
191
 
                com_err (program_name, errno, _("while trying to stat %s"), 
192
 
                         name);
193
 
                return;
 
196
                if (!silent)
 
197
                        com_err (program_name, errno,
 
198
                                 _("while trying to stat %s"), name);
 
199
                return -1;
194
200
        }
195
 
        if (S_ISLNK(st.st_mode) && recursive)
196
 
                return;
197
 
 
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
201
 
           requested).  */
202
 
        if (!S_ISREG(st.st_mode) && !S_ISLNK(st.st_mode) &&
203
 
            !S_ISDIR(st.st_mode))
204
 
                return;
205
201
 
206
202
        if (set) {
207
203
                if (verbose) {
212
208
                if (fsetflags (name, sf) == -1)
213
209
                        perror (name);
214
210
        } else {
215
 
                if (fgetflags (name, &flags) == -1)
216
 
                        com_err (program_name, errno,
217
 
                                 _("while reading flags on %s"), name);
218
 
                else {
 
211
                if (fgetflags (name, &flags) == -1) {
 
212
                        if (!silent)
 
213
                                com_err (program_name, errno,
 
214
                                         _("while reading flags on %s"), name);
 
215
                        return -1;
 
216
                } else {
219
217
                        if (rem)
220
218
                                flags &= ~rf;
221
219
                        if (add)
227
225
                        }
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) {
 
229
                                if (!silent)
 
230
                                        com_err(program_name, errno,
 
231
                                                _("while setting flags on %s"),
 
232
                                                name);
 
233
                                return -1;
 
234
                        }
233
235
                }
234
236
        }
235
237
        if (set_version) {
236
238
                if (verbose)
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) {
 
241
                        if (!silent)
 
242
                                com_err (program_name, errno,
 
243
                                         _("while setting version on %s"),
 
244
                                         name);
 
245
                        return -1;
 
246
                }
241
247
        }
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);
 
250
        return 0;
244
251
}
245
252
 
246
253
static int chattr_dir_proc (const char * dir_name, struct dirent * de,
247
254
                            void * private EXT2FS_ATTR((unused)))
248
255
{
 
256
        int ret = 0;
 
257
 
249
258
        if (strcmp (de->d_name, ".") && strcmp (de->d_name, "..")) {
250
259
                char *path;
251
260
 
253
262
                if (!path) {
254
263
                        fprintf(stderr, _("Couldn't allocate path variable "
255
264
                                          "in chattr_dir_proc"));
256
 
                        exit(1);
 
265
                        return -1;
257
266
                }
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);
260
269
                free(path);
261
270
        }
262
 
        return 0;
 
271
        return ret;
263
272
}
264
273
 
265
274
int main (int argc, char ** argv)
266
275
{
267
276
        int i, j;
268
277
        int end_arg = 0;
 
278
        int err, retval = 0;
269
279
 
270
280
#ifdef ENABLE_NLS
271
281
        setlocale(LC_MESSAGES, "");
303
313
        if (verbose)
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]);
308
 
        exit(0);
 
316
        for (j = i; j < argc; j++) {
 
317
                err = change_attributes (argv[j]);
 
318
                if (err)
 
319
                        retval = 1;
 
320
        }
 
321
        exit(retval);
309
322
}