1*6a54128fSAndroid Build Coastguard Worker /*
2*6a54128fSAndroid Build Coastguard Worker * chattr.c - Change file attributes on an ext2 file system
3*6a54128fSAndroid Build Coastguard Worker *
4*6a54128fSAndroid Build Coastguard Worker * Copyright (C) 1993, 1994 Remy Card <[email protected]>
5*6a54128fSAndroid Build Coastguard Worker * Laboratoire MASI, Institut Blaise Pascal
6*6a54128fSAndroid Build Coastguard Worker * Universite Pierre et Marie Curie (Paris VI)
7*6a54128fSAndroid Build Coastguard Worker *
8*6a54128fSAndroid Build Coastguard Worker * This file can be redistributed under the terms of the GNU General
9*6a54128fSAndroid Build Coastguard Worker * Public License
10*6a54128fSAndroid Build Coastguard Worker */
11*6a54128fSAndroid Build Coastguard Worker
12*6a54128fSAndroid Build Coastguard Worker /*
13*6a54128fSAndroid Build Coastguard Worker * History:
14*6a54128fSAndroid Build Coastguard Worker * 93/10/30 - Creation
15*6a54128fSAndroid Build Coastguard Worker * 93/11/13 - Replace stat() calls by lstat() to avoid loops
16*6a54128fSAndroid Build Coastguard Worker * 94/02/27 - Integrated in Ted's distribution
17*6a54128fSAndroid Build Coastguard Worker * 98/12/29 - Ignore symlinks when working recursively (G M Sipe)
18*6a54128fSAndroid Build Coastguard Worker * 98/12/29 - Display version info only when -V specified (G M Sipe)
19*6a54128fSAndroid Build Coastguard Worker */
20*6a54128fSAndroid Build Coastguard Worker
21*6a54128fSAndroid Build Coastguard Worker #define _LARGEFILE64_SOURCE
22*6a54128fSAndroid Build Coastguard Worker
23*6a54128fSAndroid Build Coastguard Worker #include "config.h"
24*6a54128fSAndroid Build Coastguard Worker #include <sys/types.h>
25*6a54128fSAndroid Build Coastguard Worker #include <dirent.h>
26*6a54128fSAndroid Build Coastguard Worker #include <fcntl.h>
27*6a54128fSAndroid Build Coastguard Worker #include <stdio.h>
28*6a54128fSAndroid Build Coastguard Worker #include <stdlib.h>
29*6a54128fSAndroid Build Coastguard Worker #include <unistd.h>
30*6a54128fSAndroid Build Coastguard Worker #include <string.h>
31*6a54128fSAndroid Build Coastguard Worker #ifdef HAVE_ERRNO_H
32*6a54128fSAndroid Build Coastguard Worker #include <errno.h>
33*6a54128fSAndroid Build Coastguard Worker #endif
34*6a54128fSAndroid Build Coastguard Worker #include <sys/param.h>
35*6a54128fSAndroid Build Coastguard Worker #include <sys/stat.h>
36*6a54128fSAndroid Build Coastguard Worker #include "ext2fs/ext2_fs.h"
37*6a54128fSAndroid Build Coastguard Worker
38*6a54128fSAndroid Build Coastguard Worker #ifdef __GNUC__
39*6a54128fSAndroid Build Coastguard Worker #define EXT2FS_ATTR(x) __attribute__(x)
40*6a54128fSAndroid Build Coastguard Worker #else
41*6a54128fSAndroid Build Coastguard Worker #define EXT2FS_ATTR(x)
42*6a54128fSAndroid Build Coastguard Worker #endif
43*6a54128fSAndroid Build Coastguard Worker
44*6a54128fSAndroid Build Coastguard Worker #ifndef S_ISLNK /* So we can compile even with gcc-warn */
45*6a54128fSAndroid Build Coastguard Worker # ifdef __S_IFLNK
46*6a54128fSAndroid Build Coastguard Worker # define S_ISLNK(mode) __S_ISTYPE((mode), __S_IFLNK)
47*6a54128fSAndroid Build Coastguard Worker # else
48*6a54128fSAndroid Build Coastguard Worker # define S_ISLNK(mode) 0
49*6a54128fSAndroid Build Coastguard Worker # endif
50*6a54128fSAndroid Build Coastguard Worker #endif
51*6a54128fSAndroid Build Coastguard Worker
52*6a54128fSAndroid Build Coastguard Worker #include "et/com_err.h"
53*6a54128fSAndroid Build Coastguard Worker #include "e2p/e2p.h"
54*6a54128fSAndroid Build Coastguard Worker #include "support/nls-enable.h"
55*6a54128fSAndroid Build Coastguard Worker
56*6a54128fSAndroid Build Coastguard Worker #include "../version.h"
57*6a54128fSAndroid Build Coastguard Worker
58*6a54128fSAndroid Build Coastguard Worker static const char * program_name = "chattr";
59*6a54128fSAndroid Build Coastguard Worker
60*6a54128fSAndroid Build Coastguard Worker static int add;
61*6a54128fSAndroid Build Coastguard Worker static int rem;
62*6a54128fSAndroid Build Coastguard Worker static int set;
63*6a54128fSAndroid Build Coastguard Worker static int set_version;
64*6a54128fSAndroid Build Coastguard Worker
65*6a54128fSAndroid Build Coastguard Worker static unsigned long version;
66*6a54128fSAndroid Build Coastguard Worker
67*6a54128fSAndroid Build Coastguard Worker static int set_project;
68*6a54128fSAndroid Build Coastguard Worker static unsigned long project;
69*6a54128fSAndroid Build Coastguard Worker
70*6a54128fSAndroid Build Coastguard Worker static int recursive;
71*6a54128fSAndroid Build Coastguard Worker static int verbose;
72*6a54128fSAndroid Build Coastguard Worker static int silent;
73*6a54128fSAndroid Build Coastguard Worker
74*6a54128fSAndroid Build Coastguard Worker static unsigned long af;
75*6a54128fSAndroid Build Coastguard Worker static unsigned long rf;
76*6a54128fSAndroid Build Coastguard Worker static unsigned long sf;
77*6a54128fSAndroid Build Coastguard Worker
78*6a54128fSAndroid Build Coastguard Worker #ifdef _LFS64_LARGEFILE
79*6a54128fSAndroid Build Coastguard Worker #define LSTAT lstat64
80*6a54128fSAndroid Build Coastguard Worker #define STRUCT_STAT struct stat64
81*6a54128fSAndroid Build Coastguard Worker #else
82*6a54128fSAndroid Build Coastguard Worker #define LSTAT lstat
83*6a54128fSAndroid Build Coastguard Worker #define STRUCT_STAT struct stat
84*6a54128fSAndroid Build Coastguard Worker #endif
85*6a54128fSAndroid Build Coastguard Worker
usage(void)86*6a54128fSAndroid Build Coastguard Worker static void usage(void)
87*6a54128fSAndroid Build Coastguard Worker {
88*6a54128fSAndroid Build Coastguard Worker fprintf(stderr,
89*6a54128fSAndroid Build Coastguard Worker _("Usage: %s [-RVf] [-+=aAcCdDeijPsStTuFx] [-p project] [-v version] files...\n"),
90*6a54128fSAndroid Build Coastguard Worker program_name);
91*6a54128fSAndroid Build Coastguard Worker exit(1);
92*6a54128fSAndroid Build Coastguard Worker }
93*6a54128fSAndroid Build Coastguard Worker
94*6a54128fSAndroid Build Coastguard Worker struct flags_char {
95*6a54128fSAndroid Build Coastguard Worker unsigned long flag;
96*6a54128fSAndroid Build Coastguard Worker char optchar;
97*6a54128fSAndroid Build Coastguard Worker };
98*6a54128fSAndroid Build Coastguard Worker
99*6a54128fSAndroid Build Coastguard Worker static const struct flags_char flags_array[] = {
100*6a54128fSAndroid Build Coastguard Worker { EXT2_NOATIME_FL, 'A' },
101*6a54128fSAndroid Build Coastguard Worker { EXT2_SYNC_FL, 'S' },
102*6a54128fSAndroid Build Coastguard Worker { EXT2_DIRSYNC_FL, 'D' },
103*6a54128fSAndroid Build Coastguard Worker { EXT2_APPEND_FL, 'a' },
104*6a54128fSAndroid Build Coastguard Worker { EXT2_COMPR_FL, 'c' },
105*6a54128fSAndroid Build Coastguard Worker { EXT2_NOCOMPR_FL, 'm' },
106*6a54128fSAndroid Build Coastguard Worker { EXT2_NODUMP_FL, 'd' },
107*6a54128fSAndroid Build Coastguard Worker { EXT4_EXTENTS_FL, 'e'},
108*6a54128fSAndroid Build Coastguard Worker { EXT2_IMMUTABLE_FL, 'i' },
109*6a54128fSAndroid Build Coastguard Worker { EXT3_JOURNAL_DATA_FL, 'j' },
110*6a54128fSAndroid Build Coastguard Worker { EXT4_PROJINHERIT_FL, 'P' },
111*6a54128fSAndroid Build Coastguard Worker { EXT2_SECRM_FL, 's' },
112*6a54128fSAndroid Build Coastguard Worker { EXT2_UNRM_FL, 'u' },
113*6a54128fSAndroid Build Coastguard Worker { EXT2_NOTAIL_FL, 't' },
114*6a54128fSAndroid Build Coastguard Worker { EXT2_TOPDIR_FL, 'T' },
115*6a54128fSAndroid Build Coastguard Worker { FS_NOCOW_FL, 'C' },
116*6a54128fSAndroid Build Coastguard Worker { FS_DAX_FL, 'x' },
117*6a54128fSAndroid Build Coastguard Worker { EXT4_CASEFOLD_FL, 'F' },
118*6a54128fSAndroid Build Coastguard Worker { 0, 0 }
119*6a54128fSAndroid Build Coastguard Worker };
120*6a54128fSAndroid Build Coastguard Worker
get_flag(char c)121*6a54128fSAndroid Build Coastguard Worker static unsigned long get_flag(char c)
122*6a54128fSAndroid Build Coastguard Worker {
123*6a54128fSAndroid Build Coastguard Worker const struct flags_char *fp;
124*6a54128fSAndroid Build Coastguard Worker
125*6a54128fSAndroid Build Coastguard Worker for (fp = flags_array; fp->flag != 0; fp++) {
126*6a54128fSAndroid Build Coastguard Worker if (fp->optchar == c)
127*6a54128fSAndroid Build Coastguard Worker return fp->flag;
128*6a54128fSAndroid Build Coastguard Worker }
129*6a54128fSAndroid Build Coastguard Worker return 0;
130*6a54128fSAndroid Build Coastguard Worker }
131*6a54128fSAndroid Build Coastguard Worker
132*6a54128fSAndroid Build Coastguard Worker
decode_arg(int * i,int argc,char ** argv)133*6a54128fSAndroid Build Coastguard Worker static int decode_arg (int * i, int argc, char ** argv)
134*6a54128fSAndroid Build Coastguard Worker {
135*6a54128fSAndroid Build Coastguard Worker char * p;
136*6a54128fSAndroid Build Coastguard Worker char * tmp;
137*6a54128fSAndroid Build Coastguard Worker unsigned long fl;
138*6a54128fSAndroid Build Coastguard Worker
139*6a54128fSAndroid Build Coastguard Worker switch (argv[*i][0])
140*6a54128fSAndroid Build Coastguard Worker {
141*6a54128fSAndroid Build Coastguard Worker case '-':
142*6a54128fSAndroid Build Coastguard Worker for (p = &argv[*i][1]; *p; p++) {
143*6a54128fSAndroid Build Coastguard Worker if (*p == 'R') {
144*6a54128fSAndroid Build Coastguard Worker recursive = 1;
145*6a54128fSAndroid Build Coastguard Worker continue;
146*6a54128fSAndroid Build Coastguard Worker }
147*6a54128fSAndroid Build Coastguard Worker if (*p == 'V') {
148*6a54128fSAndroid Build Coastguard Worker verbose = 1;
149*6a54128fSAndroid Build Coastguard Worker continue;
150*6a54128fSAndroid Build Coastguard Worker }
151*6a54128fSAndroid Build Coastguard Worker if (*p == 'f') {
152*6a54128fSAndroid Build Coastguard Worker silent = 1;
153*6a54128fSAndroid Build Coastguard Worker continue;
154*6a54128fSAndroid Build Coastguard Worker }
155*6a54128fSAndroid Build Coastguard Worker if (*p == 'p') {
156*6a54128fSAndroid Build Coastguard Worker (*i)++;
157*6a54128fSAndroid Build Coastguard Worker if (*i >= argc)
158*6a54128fSAndroid Build Coastguard Worker usage ();
159*6a54128fSAndroid Build Coastguard Worker project = strtol (argv[*i], &tmp, 0);
160*6a54128fSAndroid Build Coastguard Worker if (*tmp) {
161*6a54128fSAndroid Build Coastguard Worker com_err (program_name, 0,
162*6a54128fSAndroid Build Coastguard Worker _("bad project - %s\n"),
163*6a54128fSAndroid Build Coastguard Worker argv[*i]);
164*6a54128fSAndroid Build Coastguard Worker usage ();
165*6a54128fSAndroid Build Coastguard Worker }
166*6a54128fSAndroid Build Coastguard Worker set_project = 1;
167*6a54128fSAndroid Build Coastguard Worker continue;
168*6a54128fSAndroid Build Coastguard Worker }
169*6a54128fSAndroid Build Coastguard Worker if (*p == 'v') {
170*6a54128fSAndroid Build Coastguard Worker (*i)++;
171*6a54128fSAndroid Build Coastguard Worker if (*i >= argc)
172*6a54128fSAndroid Build Coastguard Worker usage ();
173*6a54128fSAndroid Build Coastguard Worker version = strtol (argv[*i], &tmp, 0);
174*6a54128fSAndroid Build Coastguard Worker if (*tmp) {
175*6a54128fSAndroid Build Coastguard Worker com_err (program_name, 0,
176*6a54128fSAndroid Build Coastguard Worker _("bad version - %s\n"),
177*6a54128fSAndroid Build Coastguard Worker argv[*i]);
178*6a54128fSAndroid Build Coastguard Worker usage ();
179*6a54128fSAndroid Build Coastguard Worker }
180*6a54128fSAndroid Build Coastguard Worker set_version = 1;
181*6a54128fSAndroid Build Coastguard Worker continue;
182*6a54128fSAndroid Build Coastguard Worker }
183*6a54128fSAndroid Build Coastguard Worker if ((fl = get_flag(*p)) == 0)
184*6a54128fSAndroid Build Coastguard Worker usage();
185*6a54128fSAndroid Build Coastguard Worker rf |= fl;
186*6a54128fSAndroid Build Coastguard Worker rem = 1;
187*6a54128fSAndroid Build Coastguard Worker }
188*6a54128fSAndroid Build Coastguard Worker break;
189*6a54128fSAndroid Build Coastguard Worker case '+':
190*6a54128fSAndroid Build Coastguard Worker add = 1;
191*6a54128fSAndroid Build Coastguard Worker for (p = &argv[*i][1]; *p; p++) {
192*6a54128fSAndroid Build Coastguard Worker if ((fl = get_flag(*p)) == 0)
193*6a54128fSAndroid Build Coastguard Worker usage();
194*6a54128fSAndroid Build Coastguard Worker af |= fl;
195*6a54128fSAndroid Build Coastguard Worker }
196*6a54128fSAndroid Build Coastguard Worker break;
197*6a54128fSAndroid Build Coastguard Worker case '=':
198*6a54128fSAndroid Build Coastguard Worker set = 1;
199*6a54128fSAndroid Build Coastguard Worker for (p = &argv[*i][1]; *p; p++) {
200*6a54128fSAndroid Build Coastguard Worker if ((fl = get_flag(*p)) == 0)
201*6a54128fSAndroid Build Coastguard Worker usage();
202*6a54128fSAndroid Build Coastguard Worker sf |= fl;
203*6a54128fSAndroid Build Coastguard Worker }
204*6a54128fSAndroid Build Coastguard Worker break;
205*6a54128fSAndroid Build Coastguard Worker default:
206*6a54128fSAndroid Build Coastguard Worker return EOF;
207*6a54128fSAndroid Build Coastguard Worker }
208*6a54128fSAndroid Build Coastguard Worker return 1;
209*6a54128fSAndroid Build Coastguard Worker }
210*6a54128fSAndroid Build Coastguard Worker
211*6a54128fSAndroid Build Coastguard Worker static int chattr_dir_proc(const char *, struct dirent *, void *);
212*6a54128fSAndroid Build Coastguard Worker
change_attributes(const char * name)213*6a54128fSAndroid Build Coastguard Worker static int change_attributes(const char * name)
214*6a54128fSAndroid Build Coastguard Worker {
215*6a54128fSAndroid Build Coastguard Worker unsigned long flags;
216*6a54128fSAndroid Build Coastguard Worker STRUCT_STAT st;
217*6a54128fSAndroid Build Coastguard Worker
218*6a54128fSAndroid Build Coastguard Worker if (LSTAT (name, &st) == -1) {
219*6a54128fSAndroid Build Coastguard Worker if (!silent)
220*6a54128fSAndroid Build Coastguard Worker com_err (program_name, errno,
221*6a54128fSAndroid Build Coastguard Worker _("while trying to stat %s"), name);
222*6a54128fSAndroid Build Coastguard Worker return -1;
223*6a54128fSAndroid Build Coastguard Worker }
224*6a54128fSAndroid Build Coastguard Worker
225*6a54128fSAndroid Build Coastguard Worker if (fgetflags(name, &flags) == -1) {
226*6a54128fSAndroid Build Coastguard Worker if (!silent)
227*6a54128fSAndroid Build Coastguard Worker com_err(program_name, errno,
228*6a54128fSAndroid Build Coastguard Worker _("while reading flags on %s"), name);
229*6a54128fSAndroid Build Coastguard Worker return -1;
230*6a54128fSAndroid Build Coastguard Worker }
231*6a54128fSAndroid Build Coastguard Worker if (set) {
232*6a54128fSAndroid Build Coastguard Worker if (verbose) {
233*6a54128fSAndroid Build Coastguard Worker printf (_("Flags of %s set as "), name);
234*6a54128fSAndroid Build Coastguard Worker print_flags (stdout, sf, 0);
235*6a54128fSAndroid Build Coastguard Worker printf ("\n");
236*6a54128fSAndroid Build Coastguard Worker }
237*6a54128fSAndroid Build Coastguard Worker if (fsetflags (name, sf) == -1)
238*6a54128fSAndroid Build Coastguard Worker perror (name);
239*6a54128fSAndroid Build Coastguard Worker } else {
240*6a54128fSAndroid Build Coastguard Worker if (rem)
241*6a54128fSAndroid Build Coastguard Worker flags &= ~rf;
242*6a54128fSAndroid Build Coastguard Worker if (add)
243*6a54128fSAndroid Build Coastguard Worker flags |= af;
244*6a54128fSAndroid Build Coastguard Worker if (verbose) {
245*6a54128fSAndroid Build Coastguard Worker printf(_("Flags of %s set as "), name);
246*6a54128fSAndroid Build Coastguard Worker print_flags(stdout, flags, 0);
247*6a54128fSAndroid Build Coastguard Worker printf("\n");
248*6a54128fSAndroid Build Coastguard Worker }
249*6a54128fSAndroid Build Coastguard Worker if (!S_ISDIR(st.st_mode))
250*6a54128fSAndroid Build Coastguard Worker flags &= ~EXT2_DIRSYNC_FL;
251*6a54128fSAndroid Build Coastguard Worker if (fsetflags(name, flags) == -1) {
252*6a54128fSAndroid Build Coastguard Worker if (!silent) {
253*6a54128fSAndroid Build Coastguard Worker com_err(program_name, errno,
254*6a54128fSAndroid Build Coastguard Worker _("while setting flags on %s"),
255*6a54128fSAndroid Build Coastguard Worker name);
256*6a54128fSAndroid Build Coastguard Worker }
257*6a54128fSAndroid Build Coastguard Worker return -1;
258*6a54128fSAndroid Build Coastguard Worker }
259*6a54128fSAndroid Build Coastguard Worker }
260*6a54128fSAndroid Build Coastguard Worker if (set_version) {
261*6a54128fSAndroid Build Coastguard Worker if (verbose)
262*6a54128fSAndroid Build Coastguard Worker printf (_("Version of %s set as %lu\n"), name, version);
263*6a54128fSAndroid Build Coastguard Worker if (fsetversion (name, version) == -1) {
264*6a54128fSAndroid Build Coastguard Worker if (!silent)
265*6a54128fSAndroid Build Coastguard Worker com_err (program_name, errno,
266*6a54128fSAndroid Build Coastguard Worker _("while setting version on %s"),
267*6a54128fSAndroid Build Coastguard Worker name);
268*6a54128fSAndroid Build Coastguard Worker return -1;
269*6a54128fSAndroid Build Coastguard Worker }
270*6a54128fSAndroid Build Coastguard Worker }
271*6a54128fSAndroid Build Coastguard Worker if (set_project) {
272*6a54128fSAndroid Build Coastguard Worker if (verbose)
273*6a54128fSAndroid Build Coastguard Worker printf (_("Project of %s set as %lu\n"), name, project);
274*6a54128fSAndroid Build Coastguard Worker if (fsetproject (name, project) == -1) {
275*6a54128fSAndroid Build Coastguard Worker if (!silent)
276*6a54128fSAndroid Build Coastguard Worker com_err (program_name, errno,
277*6a54128fSAndroid Build Coastguard Worker _("while setting project on %s"),
278*6a54128fSAndroid Build Coastguard Worker name);
279*6a54128fSAndroid Build Coastguard Worker return -1;
280*6a54128fSAndroid Build Coastguard Worker }
281*6a54128fSAndroid Build Coastguard Worker
282*6a54128fSAndroid Build Coastguard Worker }
283*6a54128fSAndroid Build Coastguard Worker if (S_ISDIR(st.st_mode) && recursive)
284*6a54128fSAndroid Build Coastguard Worker return iterate_on_dir (name, chattr_dir_proc, NULL);
285*6a54128fSAndroid Build Coastguard Worker return 0;
286*6a54128fSAndroid Build Coastguard Worker }
287*6a54128fSAndroid Build Coastguard Worker
chattr_dir_proc(const char * dir_name,struct dirent * de,void * private EXT2FS_ATTR ((unused)))288*6a54128fSAndroid Build Coastguard Worker static int chattr_dir_proc (const char * dir_name, struct dirent * de,
289*6a54128fSAndroid Build Coastguard Worker void * private EXT2FS_ATTR((unused)))
290*6a54128fSAndroid Build Coastguard Worker {
291*6a54128fSAndroid Build Coastguard Worker int ret = 0;
292*6a54128fSAndroid Build Coastguard Worker
293*6a54128fSAndroid Build Coastguard Worker if (strcmp (de->d_name, ".") && strcmp (de->d_name, "..")) {
294*6a54128fSAndroid Build Coastguard Worker char *path;
295*6a54128fSAndroid Build Coastguard Worker
296*6a54128fSAndroid Build Coastguard Worker path = malloc(strlen (dir_name) + 1 + strlen (de->d_name) + 1);
297*6a54128fSAndroid Build Coastguard Worker if (!path) {
298*6a54128fSAndroid Build Coastguard Worker fprintf(stderr, "%s",
299*6a54128fSAndroid Build Coastguard Worker _("Couldn't allocate path variable "
300*6a54128fSAndroid Build Coastguard Worker "in chattr_dir_proc"));
301*6a54128fSAndroid Build Coastguard Worker return -1;
302*6a54128fSAndroid Build Coastguard Worker }
303*6a54128fSAndroid Build Coastguard Worker sprintf(path, "%s/%s", dir_name, de->d_name);
304*6a54128fSAndroid Build Coastguard Worker ret = change_attributes(path);
305*6a54128fSAndroid Build Coastguard Worker free(path);
306*6a54128fSAndroid Build Coastguard Worker }
307*6a54128fSAndroid Build Coastguard Worker return ret;
308*6a54128fSAndroid Build Coastguard Worker }
309*6a54128fSAndroid Build Coastguard Worker
main(int argc,char ** argv)310*6a54128fSAndroid Build Coastguard Worker int main (int argc, char ** argv)
311*6a54128fSAndroid Build Coastguard Worker {
312*6a54128fSAndroid Build Coastguard Worker int i, j;
313*6a54128fSAndroid Build Coastguard Worker int end_arg = 0;
314*6a54128fSAndroid Build Coastguard Worker int err, retval = 0;
315*6a54128fSAndroid Build Coastguard Worker
316*6a54128fSAndroid Build Coastguard Worker #ifdef ENABLE_NLS
317*6a54128fSAndroid Build Coastguard Worker setlocale(LC_MESSAGES, "");
318*6a54128fSAndroid Build Coastguard Worker setlocale(LC_CTYPE, "");
319*6a54128fSAndroid Build Coastguard Worker bindtextdomain(NLS_CAT_NAME, LOCALEDIR);
320*6a54128fSAndroid Build Coastguard Worker textdomain(NLS_CAT_NAME);
321*6a54128fSAndroid Build Coastguard Worker set_com_err_gettext(gettext);
322*6a54128fSAndroid Build Coastguard Worker #endif
323*6a54128fSAndroid Build Coastguard Worker if (argc && *argv)
324*6a54128fSAndroid Build Coastguard Worker program_name = *argv;
325*6a54128fSAndroid Build Coastguard Worker i = 1;
326*6a54128fSAndroid Build Coastguard Worker while (i < argc && !end_arg) {
327*6a54128fSAndroid Build Coastguard Worker /* '--' arg should end option processing */
328*6a54128fSAndroid Build Coastguard Worker if (strcmp(argv[i], "--") == 0) {
329*6a54128fSAndroid Build Coastguard Worker i++;
330*6a54128fSAndroid Build Coastguard Worker end_arg = 1;
331*6a54128fSAndroid Build Coastguard Worker } else if (decode_arg (&i, argc, argv) == EOF)
332*6a54128fSAndroid Build Coastguard Worker end_arg = 1;
333*6a54128fSAndroid Build Coastguard Worker else
334*6a54128fSAndroid Build Coastguard Worker i++;
335*6a54128fSAndroid Build Coastguard Worker }
336*6a54128fSAndroid Build Coastguard Worker if (i >= argc)
337*6a54128fSAndroid Build Coastguard Worker usage ();
338*6a54128fSAndroid Build Coastguard Worker if (set && (add || rem)) {
339*6a54128fSAndroid Build Coastguard Worker fputs(_("= is incompatible with - and +\n"), stderr);
340*6a54128fSAndroid Build Coastguard Worker exit (1);
341*6a54128fSAndroid Build Coastguard Worker }
342*6a54128fSAndroid Build Coastguard Worker if ((rf & af) != 0) {
343*6a54128fSAndroid Build Coastguard Worker fputs("Can't both set and unset same flag.\n", stderr);
344*6a54128fSAndroid Build Coastguard Worker exit (1);
345*6a54128fSAndroid Build Coastguard Worker }
346*6a54128fSAndroid Build Coastguard Worker if (!(add || rem || set || set_version || set_project )) {
347*6a54128fSAndroid Build Coastguard Worker fputs(_("Must use '-v', =, - or +\n"), stderr);
348*6a54128fSAndroid Build Coastguard Worker exit (1);
349*6a54128fSAndroid Build Coastguard Worker }
350*6a54128fSAndroid Build Coastguard Worker if (verbose)
351*6a54128fSAndroid Build Coastguard Worker fprintf (stderr, "chattr %s (%s)\n",
352*6a54128fSAndroid Build Coastguard Worker E2FSPROGS_VERSION, E2FSPROGS_DATE);
353*6a54128fSAndroid Build Coastguard Worker for (j = i; j < argc; j++) {
354*6a54128fSAndroid Build Coastguard Worker err = change_attributes (argv[j]);
355*6a54128fSAndroid Build Coastguard Worker if (err)
356*6a54128fSAndroid Build Coastguard Worker retval = 1;
357*6a54128fSAndroid Build Coastguard Worker }
358*6a54128fSAndroid Build Coastguard Worker exit(retval);
359*6a54128fSAndroid Build Coastguard Worker }
360