From 2b69c40e8060934c115922c012737bd471956f09 Mon Sep 17 00:00:00 2001 From: Eric Andersen Date: Tue, 5 Oct 1999 22:58:32 +0000 Subject: More stuff works. -Erik --- coreutils/chown.c | 156 ++++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 109 insertions(+), 47 deletions(-) (limited to 'coreutils/chown.c') diff --git a/coreutils/chown.c b/coreutils/chown.c index a611f92f1..fc0c2424f 100644 --- a/coreutils/chown.c +++ b/coreutils/chown.c @@ -1,63 +1,125 @@ -#include "internal.h" -#include -#include -#include +/* + * Mini chown/chgrp implementation for busybox + * + * Copyright (C) 1998 by Erik Andersen + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + #include +#include +#include +#include "internal.h" -const char chown_usage[] = "chown [-R] user-name file [file ...]\n" -"\n\tThe group list is kept in the file /etc/groups.\n\n" -"\t-R:\tRecursively change the mode of all files and directories\n" -"\t\tunder the argument directory."; -int -parse_user_name(const char * s, struct FileInfo * i) -{ - struct passwd * p; - char * dot = strchr(s, '.'); +static int uid=-1; +static int gid=0; +static int chownApp; +static char* invocationName=NULL; - if (! dot ) - dot = strchr(s, ':'); - if ( dot ) - *dot = '\0'; +const char chgrp_usage[] = "[OPTION]... GROUP FILE...\n" + "Change the group membership of each FILE to GROUP.\n" + "\n\tOptions:\n" "\t-R\tchange files and directories recursively\n"; +const char chown_usage[] = "[OPTION]... OWNER[.[GROUP] FILE...\n" + "Change the owner and/or group of each FILE to OWNER and/or GROUP.\n" + "\n\tOptions:\n" "\t-R\tchange files and directories recursively\n"; - if ( (p = getpwnam(s)) == 0 ) { - fprintf(stderr, "%s: no such user.\n", s); - return 1; - } - i->userID = p->pw_uid; - - if ( dot ) { - struct group * g = getgrnam(++dot); - if ( g == 0 ) { - fprintf(stderr, "%s: no such group.\n", dot); - return 1; - } - i->groupID = g->gr_gid; - i->changeGroupID = 1; - } - return 0; + + +static int fileAction(const char *fileName) +{ + struct stat statBuf; + if ((stat(fileName, &statBuf) < 0) || + (chown(fileName, + ((chownApp==TRUE)? uid: statBuf.st_uid), + gid) < 0)) { + perror(fileName); + return( TRUE); + } + return( FALSE); } -extern int -chown_main(struct FileInfo * i, int argc, char * * argv) +int chown_main(int argc, char **argv) { - int status; + struct group *grp; + struct passwd *pwd; + int recursiveFlag=FALSE; + char *groupName; - while ( argc >= 3 && strcmp("-R", argv[1]) == 0 ) { - i->recursive = 1; - argc--; - argv++; - } - if ( (status = parse_user_name(argv[1], i)) != 0 ) - return status; + chownApp = (strcmp(*argv, "chown")==0)? TRUE : FALSE; - argv++; + if (argc < 2) { + fprintf(stderr, "Usage: %s %s", *argv, + (chownApp==TRUE)? chown_usage : chgrp_usage); + return( FALSE); + } + invocationName=*argv; + argc--; + argv++; + + /* Parse options */ + while (**argv == '-') { + while (*++(*argv)) switch (**argv) { + case 'R': + recursiveFlag = TRUE; + break; + default: + fprintf(stderr, "Unknown option: %c\n", **argv); + return( FALSE); + } argc--; + argv++; + } + + /* Find the selected group */ + groupName = strchr(*argv, '.'); + if ( chownApp==TRUE && groupName ) + *groupName++ = '\0'; + else + groupName = *argv; + grp = getgrnam(groupName); + if (grp == NULL) { + fprintf(stderr, "%s: Unknown group name: %s\n", invocationName, groupName); + return( FALSE); + } + gid = grp->gr_gid; - i->changeUserID = 1; - i->complainInPostProcess = 1; + /* Find the selected user (if appropriate) */ + if (chownApp==TRUE) { + pwd = getpwnam(*argv); + if (pwd == NULL) { + fprintf(stderr, "%s: Unknown user name: %s\n", invocationName, *argv); + return( FALSE); + } + uid = pwd->pw_uid; + } - return monadic_main(i, argc, argv); + /* Ok, ready to do the deed now */ + if (argc <= 1) { + fprintf(stderr, "%s: too few arguments", invocationName); + return( FALSE); + } + while (argc-- > 1) { + argv++; + if (recursiveFlag==TRUE) + recursiveAction( *argv, TRUE, fileAction, fileAction); + else + fileAction( *argv); + } + return(TRUE); } -- cgit v1.2.3