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/cat.c | 8 +-- coreutils/chgrp.c | 89 ------------------------------ coreutils/chown.c | 156 +++++++++++++++++++++++++++++++++++++---------------- coreutils/chroot.c | 73 ++++++++++++++++++------- 4 files changed, 166 insertions(+), 160 deletions(-) delete mode 100644 coreutils/chgrp.c (limited to 'coreutils') diff --git a/coreutils/cat.c b/coreutils/cat.c index 12faf55ab..0f2460eb7 100644 --- a/coreutils/cat.c +++ b/coreutils/cat.c @@ -31,7 +31,7 @@ extern int cat_more_main(int argc, char **argv) if (argc < 2) { fprintf(stderr, "Usage: %s %s", *argv, cat_usage); - return 1; + return(FALSE); } argc--; argv++; @@ -39,8 +39,8 @@ extern int cat_more_main(int argc, char **argv) while (argc-- > 0) { file = fopen(*argv, "r"); if (file == NULL) { - name_and_error(*argv); - return 1; + perror(*argv); + return(FALSE); } while ((c = getc(file)) != EOF) putc(c, stdout); @@ -50,5 +50,5 @@ extern int cat_more_main(int argc, char **argv) argc--; argv++; } - return 0; + return(TRUE); } diff --git a/coreutils/chgrp.c b/coreutils/chgrp.c deleted file mode 100644 index 038c665dd..000000000 --- a/coreutils/chgrp.c +++ /dev/null @@ -1,89 +0,0 @@ -/* - * Mini 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 "internal.h" -#include -#include - -const char chgrp_usage[] = "chgrp [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"; - -int chgrp_main(int argc, char **argv) -{ - const char *cp; - int gid; - struct group *grp; - struct stat statBuf; - - if (argc < 2) { - fprintf(stderr, "Usage: %s %s", *argv, chgrp_usage); - return 1; - } - argc--; - argv++; - - cp = argv[1]; - if (isDecimal(*cp)) { - gid = 0; - while (isDecimal(*cp)) - gid = gid * 10 + (*cp++ - '0'); - if (*cp) { - fprintf(stderr, "Bad gid value\n"); - return -1; - } - } else { - grp = getgrnam(cp); - if (grp == NULL) { - fprintf(stderr, "Unknown group name\n"); - return -1; - } - gid = grp->gr_gid; - } - argc--; - argv++; - while (argc-- > 1) { - argv++; - if ((stat(*argv, &statBuf) < 0) || - (chown(*argv, statBuf.st_uid, gid) < 0)) { - perror(*argv); - } - } - return 1; -} - - - - - - - - - -#if 0 -int -recursive(const char *fileName, BOOL followLinks, const char *pattern, - int (*fileAction) (const char *fileName, - const struct stat * statbuf), - int (*dirAction) (const char *fileName, - const struct stat * statbuf)) - -#endif 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); } diff --git a/coreutils/chroot.c b/coreutils/chroot.c index ca0bfcf3f..d39549496 100644 --- a/coreutils/chroot.c +++ b/coreutils/chroot.c @@ -1,32 +1,65 @@ +/* + * Mini chroot 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 "internal.h" #include #include -const char chroot_usage[] = "chroot directory [command]\n" - "Run a command with special root directory.\n"; +static const char chroot_usage[] = "NEWROOT [COMMAND...]\n" +"Run COMMAND with root directory set to NEWROOT.\n"; + + -extern int -chroot_main (struct FileInfo *i, int argc, char **argv) +int chroot_main(int argc, char **argv) { - char *prog; + if (argc < 2) { + fprintf(stderr, "Usage: %s %s", *argv, chroot_usage); + return( FALSE); + } + argc--; + argv++; - if (chroot (argv[1])) - { - name_and_error ("cannot chroot to that directory"); - return 1; + fprintf(stderr, "new root: %s\n", *argv); + + if (chroot (*argv) || (chdir ("/"))) { + perror("cannot chroot"); + return( FALSE); } - if (argc > 2) - { - execvp (argv[2], argv + 2); + + argc--; + argv++; + if (argc >= 1) { + fprintf(stderr, "command: %s\n", *argv); + execvp (*argv, argv); } - else - { - prog = getenv ("SHELL"); - if (!prog) - prog = "/bin/sh"; - execlp (prog, prog, NULL); + else { + char *prog; + prog = getenv ("SHELL"); + if (!prog) + prog = "/bin/sh"; + fprintf(stderr, "no command. running: %s\n", prog); + execlp (prog, prog, NULL); } - name_and_error ("cannot exec"); - return 1; + perror("cannot exec"); + return(FALSE); } + -- cgit v1.2.3