40 |
|
#endif |
41 |
|
|
42 |
|
#include <sys/cdefs.h> |
43 |
< |
__FBSDID("$FreeBSD: release/7.0.0/bin/chflags/chflags.c 146224 2005-05-14 23:23:10Z dd $"); |
43 |
> |
__FBSDID("$FreeBSD$"); |
44 |
|
|
45 |
|
#include <sys/types.h> |
46 |
|
#include <sys/stat.h> |
53 |
|
#include <string.h> |
54 |
|
#include <unistd.h> |
55 |
|
|
56 |
< |
void usage(void); |
56 |
> |
static void usage(void); |
57 |
|
|
58 |
|
int |
59 |
|
main(int argc, char *argv[]) |
60 |
|
{ |
61 |
|
FTS *ftsp; |
62 |
|
FTSENT *p; |
63 |
< |
u_long clear, set; |
63 |
> |
u_long clear, newflags, set; |
64 |
|
long val; |
65 |
< |
int Hflag, Lflag, Rflag, hflag, ch, fts_options, oct, rval; |
65 |
> |
int Hflag, Lflag, Rflag, fflag, hflag, vflag; |
66 |
> |
int ch, fts_options, oct, rval; |
67 |
|
char *flags, *ep; |
68 |
|
int (*change_flags)(const char *, unsigned long); |
69 |
|
|
70 |
< |
Hflag = Lflag = Rflag = hflag = 0; |
71 |
< |
while ((ch = getopt(argc, argv, "HLPRh")) != -1) |
70 |
> |
Hflag = Lflag = Rflag = fflag = hflag = vflag = 0; |
71 |
> |
while ((ch = getopt(argc, argv, "HLPRfhv")) != -1) |
72 |
|
switch (ch) { |
73 |
|
case 'H': |
74 |
|
Hflag = 1; |
84 |
|
case 'R': |
85 |
|
Rflag = 1; |
86 |
|
break; |
87 |
+ |
case 'f': |
88 |
+ |
fflag = 1; |
89 |
+ |
break; |
90 |
|
case 'h': |
91 |
|
hflag = 1; |
92 |
|
break; |
93 |
+ |
case 'v': |
94 |
+ |
vflag++; |
95 |
+ |
break; |
96 |
|
case '?': |
97 |
|
default: |
98 |
|
usage(); |
115 |
|
fts_options |= FTS_LOGICAL; |
116 |
|
} |
117 |
|
} else |
118 |
< |
fts_options = FTS_LOGICAL; |
118 |
> |
fts_options = hflag ? FTS_PHYSICAL : FTS_LOGICAL; |
119 |
|
|
120 |
|
/* XXX: Why don't chflags and lchflags have compatible prototypes? */ |
121 |
|
if (hflag) |
173 |
|
default: |
174 |
|
break; |
175 |
|
} |
176 |
< |
if (oct) { |
177 |
< |
if (!(*change_flags)(p->fts_accpath, set)) |
178 |
< |
continue; |
179 |
< |
} else { |
180 |
< |
p->fts_statp->st_flags |= set; |
181 |
< |
p->fts_statp->st_flags &= clear; |
182 |
< |
if (!(*change_flags)(p->fts_accpath, |
183 |
< |
(u_long)p->fts_statp->st_flags)) |
184 |
< |
continue; |
176 |
> |
if (oct) |
177 |
> |
newflags = set; |
178 |
> |
else |
179 |
> |
newflags = (p->fts_statp->st_flags | set) & clear; |
180 |
> |
if (newflags == p->fts_statp->st_flags) |
181 |
> |
continue; |
182 |
> |
if ((*change_flags)(p->fts_accpath, newflags) && !fflag) { |
183 |
> |
warn("%s", p->fts_path); |
184 |
> |
rval = 1; |
185 |
> |
} else if (vflag) { |
186 |
> |
(void)printf("%s", p->fts_path); |
187 |
> |
if (vflag > 1) |
188 |
> |
(void)printf(": 0%lo -> 0%lo", |
189 |
> |
(u_long)p->fts_statp->st_flags, |
190 |
> |
newflags); |
191 |
> |
(void)printf("\n"); |
192 |
|
} |
179 |
– |
warn("%s", p->fts_path); |
180 |
– |
rval = 1; |
193 |
|
} |
194 |
|
if (errno) |
195 |
|
err(1, "fts_read"); |
196 |
|
exit(rval); |
197 |
|
} |
198 |
|
|
199 |
< |
void |
199 |
> |
static void |
200 |
|
usage(void) |
201 |
|
{ |
202 |
|
(void)fprintf(stderr, |
203 |
< |
"usage: chflags [-h] [-R [-H | -L | -P]] flags file ...\n"); |
203 |
> |
"usage: chflags [-fhv] [-R [-H | -L | -P]] flags file ...\n"); |
204 |
|
exit(1); |
205 |
|
} |