/*
* Mini chown/chmod/chgrp implementation for busybox
*
- * Copyright (C) 1998 by Erik Andersen <andersee@debian.org>
+ *
+ * Copyright (C) 1999 by Lineo, inc.
+ * Written by Erik Andersen <andersen@lineo.com>, <andersee@debian.org>
*
* 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
#include "internal.h"
-static int uid=-1;
-static int gid=0;
+static uid_t uid=-1;
+static gid_t gid=-1;
static int whichApp;
static char* invocationName=NULL;
static mode_t mode=0644;
"\t-R\tchange files and directories recursively.\n";
-
static int fileAction(const char *fileName, struct stat* statbuf)
{
switch (whichApp) {
case CHGRP_APP:
case CHOWN_APP:
- if (chown(fileName, ((whichApp==CHOWN_APP)? uid: statbuf->st_uid), gid) < 0)
+ if (chown(fileName, (whichApp==CHOWN_APP)? uid : statbuf->st_uid,
+ (gid==-1)? statbuf->st_gid : gid) == 0) {
return( TRUE);
+ }
+ break;
case CHMOD_APP:
- fprintf(stderr, "%s, %d\n", fileName, mode);
- if (chmod(fileName, mode))
+ if (chmod(fileName, mode) == 0)
return( TRUE);
+ break;
}
perror(fileName);
return( FALSE);
int chmod_chown_chgrp_main(int argc, char **argv)
{
- struct group *grp;
- struct passwd *pwd;
int recursiveFlag=FALSE;
char *groupName;
if ( whichApp == CHMOD_APP ) {
/* Find the specified modes */
- mode &= S_ISVTX|S_ISUID|S_ISGID|S_IRWXU|S_IRWXG|S_IRWXO;
+ mode = 0;
if ( parse_mode(*argv, &mode) == FALSE ) {
fprintf(stderr, "%s: Unknown mode: %s\n", invocationName, *argv);
exit( FALSE);
}
- //mode &= andWithMode;
- fprintf(stderr, "mode %d\n", mode);
} else {
/* Find the selected group */
- groupName = strchr(*argv, '.');
- if ( whichApp==TRUE && groupName )
- *groupName++ = '\0';
- else
+ if ( whichApp==CHGRP_APP ) {
groupName = *argv;
- grp = getgrnam(groupName);
- if (grp == NULL) {
- fprintf(stderr, "%s: Unknown group name: %s\n", invocationName, groupName);
- exit( FALSE);
+ gid = my_getgrnam(groupName);
+ if (gid == -1)
+ goto bad_group;
+ } else {
+ groupName = strchr(*argv, '.');
+ if (groupName) {
+ *groupName++ = '\0';
+ gid = my_getgrnam(groupName);
+ if (gid == -1)
+ goto bad_group;
+ } else
+ gid = -1;
}
- gid = grp->gr_gid;
+
/* Find the selected user (if appropriate) */
- if (whichApp==TRUE) {
- pwd = getpwnam(*argv);
- if (pwd == NULL) {
+ if (whichApp==CHOWN_APP) {
+ uid = my_getpwnam(*argv);
+ if (uid == -1) {
fprintf(stderr, "%s: Unknown user name: %s\n", invocationName, *argv);
exit( FALSE);
}
- uid = pwd->pw_uid;
}
}
exit( FALSE);
}
exit(TRUE);
+
+bad_group:
+ fprintf(stderr, "%s: Unknown group name: %s\n", invocationName, groupName);
+ exit( FALSE);
}
+