aboutsummaryrefslogtreecommitdiff
path: root/chmod_chown_chgrp.c
diff options
context:
space:
mode:
Diffstat (limited to 'chmod_chown_chgrp.c')
-rw-r--r--chmod_chown_chgrp.c168
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
180int 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
223int
224my_getpwuid(uid_t *uid)
225{
226 return my_getid("/etc/passwd", NULL, uid);
227}
228
229int
230my_getpwnam(char *name, uid_t *uid)
231{
232 return my_getid("/etc/passwd", name, uid);
233}
234
235int
236my_getgrgid(gid_t *gid)
237{
238 return my_getid("/etc/group", NULL, gid);
239}
240
241int
242my_getgrnam(char *name, gid_t *gid)
243{
244 return my_getid("/etc/group", name, gid);
245}
246
247const 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
252int
253parse_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
288extern int
289chown_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