Commit | Line | Data |
---|---|---|
dc986658 | 1 | /* |
13de2e6a KB |
2 | * Copyright (c) 1992, 1993 |
3 | * The Regents of the University of California. All rights reserved. | |
dc986658 KM |
4 | * |
5 | * %sccs.include.redist.c% | |
6 | */ | |
7 | ||
8 | #ifndef lint | |
13de2e6a KB |
9 | static char copyright[] = |
10 | "@(#) Copyright (c) 1992, 1993\n\ | |
11 | The Regents of the University of California. All rights reserved.\n"; | |
dc986658 KM |
12 | #endif /* not lint */ |
13 | ||
14 | #ifndef lint | |
13de2e6a | 15 | static char sccsid[] = "@(#)chflags.c 8.1 (Berkeley) %G%"; |
dc986658 KM |
16 | #endif /* not lint */ |
17 | ||
18 | #include <sys/types.h> | |
19 | #include <sys/stat.h> | |
8a499f2f KB |
20 | |
21 | #include <err.h> | |
dc986658 KM |
22 | #include <fts.h> |
23 | #include <stdio.h> | |
dde011f0 | 24 | #include <stdlib.h> |
dc986658 | 25 | #include <string.h> |
8a499f2f | 26 | #include <unistd.h> |
dc986658 | 27 | |
8a499f2f KB |
28 | u_long string_to_flags __P((char **, u_long *, u_long *)); |
29 | void usage __P((void)); | |
dde011f0 KB |
30 | |
31 | int | |
dc986658 KM |
32 | main(argc, argv) |
33 | int argc; | |
dde011f0 | 34 | char *argv[]; |
dc986658 | 35 | { |
66375d53 | 36 | register FTS *ftsp; |
dc986658 | 37 | register FTSENT *p; |
dde011f0 | 38 | register int oct; |
8a499f2f KB |
39 | u_long clear, set; |
40 | int ch, fts_options, retval, rflag, hflag, Hflag; | |
41 | char *flags, *ep; | |
dc986658 | 42 | |
66375d53 EA |
43 | rflag = hflag = Hflag = 0; |
44 | fts_options = FTS_PHYSICAL; | |
45 | while ((ch = getopt(argc, argv, "HRh")) != EOF) | |
dc986658 | 46 | switch((char)ch) { |
66375d53 EA |
47 | case 'H': |
48 | Hflag = 1; | |
49 | fts_options |= FTS_COMFOLLOW; | |
50 | break; | |
dc986658 KM |
51 | case 'R': |
52 | rflag = 1; | |
53 | break; | |
66375d53 EA |
54 | case 'h': |
55 | hflag = 1; | |
56 | fts_options &= ~FTS_PHYSICAL; | |
57 | fts_options |= FTS_LOGICAL; | |
58 | break; | |
59 | case '?': | |
dc986658 KM |
60 | default: |
61 | usage(); | |
62 | } | |
63 | argv += optind; | |
64 | argc -= optind; | |
65 | ||
66 | if (argc < 2) | |
67 | usage(); | |
68 | ||
69 | flags = *argv; | |
70 | if (*flags >= '0' && *flags <= '7') { | |
8a499f2f KB |
71 | set = (int)strtol(flags, &ep, 8); |
72 | if (set < 0 || *ep) | |
73 | errx(1, "invalid flags: %s", flags); | |
74 | fts_options |= FTS_NOSTAT; | |
dde011f0 | 75 | oct = 1; |
dc986658 | 76 | } else { |
8a499f2f KB |
77 | if (string_to_flags(&flags, &set, &clear)) |
78 | errx(1, "invalid flag: %s", flags); | |
79 | clear = ~clear; | |
dc986658 KM |
80 | oct = 0; |
81 | } | |
82 | ||
8a499f2f KB |
83 | if ((ftsp = fts_open(++argv, fts_options , 0)) == NULL) |
84 | err(1, ""); | |
85 | ||
86 | for (retval = 0; p = fts_read(ftsp);) | |
66375d53 EA |
87 | switch(p->fts_info) { |
88 | case FTS_D: | |
89 | if (!rflag) | |
90 | fts_set(ftsp, p, FTS_SKIP); | |
91 | break; | |
92 | case FTS_DNR: | |
93 | case FTS_ERR: | |
94 | case FTS_NS: | |
8a499f2f | 95 | err(1, "%s", p->fts_path); |
66375d53 EA |
96 | default: |
97 | if (p->fts_info == FTS_SL && | |
98 | !(hflag || | |
99 | (Hflag && p->fts_level == FTS_ROOTLEVEL))) | |
100 | continue; | |
8a499f2f KB |
101 | if (oct) { |
102 | if (!chflags(p->fts_accpath, set)) | |
103 | break; | |
104 | } else { | |
105 | p->fts_statp->st_flags |= set; | |
106 | p->fts_statp->st_flags &= clear; | |
107 | if (!chflags(p->fts_accpath, | |
108 | p->fts_statp->st_flags)) | |
109 | break; | |
110 | } | |
111 | warn("%s", p->fts_path); | |
112 | retval = 1; | |
66375d53 EA |
113 | break; |
114 | } | |
dc986658 KM |
115 | exit(retval); |
116 | } | |
117 | ||
dde011f0 KB |
118 | void |
119 | usage() | |
120 | { | |
66375d53 | 121 | (void)fprintf(stderr, "usage: chflags [-HRh] flags file ...\n"); |
dde011f0 KB |
122 | exit(1); |
123 | } |