diff options
Diffstat (limited to 'chmod_chown_chgrp.c')
-rw-r--r-- | chmod_chown_chgrp.c | 168 |
1 files changed, 168 insertions, 0 deletions
diff --git a/chmod_chown_chgrp.c b/chmod_chown_chgrp.c index cac09e71d..e76050022 100644 --- a/chmod_chown_chgrp.c +++ b/chmod_chown_chgrp.c | |||
@@ -144,3 +144,171 @@ int chmod_chown_chgrp_main(int argc, char **argv) | |||
144 | exit(TRUE); | 144 | exit(TRUE); |
145 | } | 145 | } |
146 | 146 | ||
147 | |||
148 | |||
149 | |||
150 | |||
151 | |||
152 | |||
153 | |||
154 | |||
155 | |||
156 | |||
157 | |||
158 | #ifdef fooo | ||
159 | |||
160 | |||
161 | |||
162 | |||
163 | |||
164 | |||
165 | |||
166 | |||
167 | |||
168 | |||
169 | |||
170 | |||
171 | |||
172 | |||
173 | |||
174 | #include "internal.h" | ||
175 | #include <pwd.h> | ||
176 | #include <grp.h> | ||
177 | #include <string.h> | ||
178 | #include <stdio.h> | ||
179 | |||
180 | int my_getid(const char *filename, const char *name, uid_t *id) | ||
181 | { | ||
182 | FILE *stream; | ||
183 | uid_t rid; | ||
184 | char *rname, *start, *end, buf[128]; | ||
185 | |||
186 | stream=fopen(filename,"r"); | ||
187 | |||
188 | while (fgets (buf, 128, stream) != NULL) { | ||
189 | if (buf[0] == '#') | ||
190 | continue; | ||
191 | |||
192 | start = buf; | ||
193 | end = strchr (start, ':'); | ||
194 | if (end == NULL) | ||
195 | continue; | ||
196 | *end = '\0'; | ||
197 | rname = start; | ||
198 | |||
199 | start = end + 1; | ||
200 | end = strchr (start, ':'); | ||
201 | if (end == NULL) | ||
202 | continue; | ||
203 | |||
204 | start = end + 1; | ||
205 | rid = (uid_t) strtol (start, &end, 10); | ||
206 | if (end == start) | ||
207 | continue; | ||
208 | |||
209 | if (name) { | ||
210 | if (0 == strcmp(rname, name)) { | ||
211 | *id=rid; | ||
212 | return 0; | ||
213 | } | ||
214 | } else { | ||
215 | if ( *id == rid ) | ||
216 | return 0; | ||
217 | } | ||
218 | } | ||
219 | fclose(stream); | ||
220 | return -1; | ||
221 | } | ||
222 | |||
223 | int | ||
224 | my_getpwuid(uid_t *uid) | ||
225 | { | ||
226 | return my_getid("/etc/passwd", NULL, uid); | ||
227 | } | ||
228 | |||
229 | int | ||
230 | my_getpwnam(char *name, uid_t *uid) | ||
231 | { | ||
232 | return my_getid("/etc/passwd", name, uid); | ||
233 | } | ||
234 | |||
235 | int | ||
236 | my_getgrgid(gid_t *gid) | ||
237 | { | ||
238 | return my_getid("/etc/group", NULL, gid); | ||
239 | } | ||
240 | |||
241 | int | ||
242 | my_getgrnam(char *name, gid_t *gid) | ||
243 | { | ||
244 | return my_getid("/etc/group", name, gid); | ||
245 | } | ||
246 | |||
247 | const char chown_usage[] = "chown [-R] user-name file [file ...]\n" | ||
248 | "\n\tThe group list is kept in the file /etc/groups.\n\n" | ||
249 | "\t-R:\tRecursively change the mode of all files and directories\n" | ||
250 | "\t\tunder the argument directory."; | ||
251 | |||
252 | int | ||
253 | parse_user_name(const char * s, struct FileInfo * i) | ||
254 | { | ||
255 | char * dot = strchr(s, '.'); | ||
256 | char * end = NULL; | ||
257 | uid_t id = 0; | ||
258 | |||
259 | if (! dot ) | ||
260 | dot = strchr(s, ':'); | ||
261 | |||
262 | if ( dot ) | ||
263 | *dot = '\0'; | ||
264 | |||
265 | if ( my_getpwnam(s,&id) == -1 ) { | ||
266 | id = strtol(s,&end,10); | ||
267 | if ((*end != '\0') || ( my_getpwuid(&id) == -1 )) { | ||
268 | fprintf(stderr, "%s: no such user.\n", s); | ||
269 | return 1; | ||
270 | } | ||
271 | } | ||
272 | i->userID = id; | ||
273 | |||
274 | if ( dot ) { | ||
275 | if ( my_getgrnam(++dot,&id) == -1 ) { | ||
276 | id = strtol(dot,&end,10); | ||
277 | if ((*end != '\0') || ( my_getgrgid(&id) == -1 )) { | ||
278 | fprintf(stderr, "%s: no such group.\n", dot); | ||
279 | return 1; | ||
280 | } | ||
281 | } | ||
282 | i->groupID = id; | ||
283 | i->changeGroupID = 1; | ||
284 | } | ||
285 | return 0; | ||
286 | } | ||
287 | |||
288 | extern int | ||
289 | chown_main(struct FileInfo * i, int argc, char * * argv) | ||
290 | { | ||
291 | int status; | ||
292 | |||
293 | while ( argc >= 3 && strcmp("-R", argv[1]) == 0 ) { | ||
294 | i->recursive = 1; | ||
295 | argc--; | ||
296 | argv++; | ||
297 | } | ||
298 | |||
299 | if ( (status = parse_user_name(argv[1], i)) != 0 ) | ||
300 | return status; | ||
301 | |||
302 | argv++; | ||
303 | argc--; | ||
304 | |||
305 | i->changeUserID = 1; | ||
306 | i->complainInPostProcess = 1; | ||
307 | |||
308 | return monadic_main(i, argc, argv); | ||
309 | } | ||
310 | |||
311 | |||
312 | |||
313 | |||
314 | #endif | ||