From 9a44c4f91ce7e517d5325fd3743e6ad9d54ef3f0 Mon Sep 17 00:00:00 2001 From: Denis Vlasenko Date: Thu, 28 Dec 2006 05:44:47 +0000 Subject: bb_xget[pw/gr]nam were horribly misnamed - fixed. uidgid_get -> get_uidgid, add additional param (numeric_ok). Make chown use it. chown: fix "chown user: ...." install: fix incorrect use of bb_xget[pw/gr]nam --- coreutils/chown.c | 28 +++++++++++------- coreutils/id.c | 4 +-- coreutils/install.c | 82 ++++++++++++++++++++++++++++------------------------- 3 files changed, 63 insertions(+), 51 deletions(-) (limited to 'coreutils') diff --git a/coreutils/chown.c b/coreutils/chown.c index fddce7cf1..a45348a24 100644 --- a/coreutils/chown.c +++ b/coreutils/chown.c @@ -54,32 +54,38 @@ static int fileAction(const char *fileName, struct stat *statbuf, int chown_main(int argc, char **argv) { - int retval = EXIT_SUCCESS; char *groupName; + int retval = EXIT_SUCCESS; opt_complementary = "-2"; getopt32(argc, argv, OPT_STR); + argv += optind; if (OPT_NODEREF) chown_func = lchown; - argv += optind; - /* First, check if there is a group name here */ - groupName = strchr(*argv, '.'); + groupName = strchr(*argv, '.'); /* deprecated? */ if (!groupName) { groupName = strchr(*argv, ':'); } - /* Check for the username and groupname */ - if (groupName) { - *groupName++ = '\0'; - gid = get_ug_id(groupName, bb_xgetgrnam); + /* First, try parsing "user[:[group]]" */ + if (!groupName) { /* "user" */ + uid = get_ug_id(*argv, xuname2uid); + } else if (groupName == *argv) { /* ":group" */ + gid = get_ug_id(groupName + 1, xgroup2gid); + } else { + struct bb_uidgid_t ugid; + if (!groupName[1]) /* "user:" */ + *groupName = '\0'; + if (!get_uidgid(&ugid, *argv, 1)) + bb_error_msg_and_die("unknown user/group %s", *argv); + uid = ugid.uid; + gid = ugid.gid; } - if (--groupName != *argv) - uid = get_ug_id(*argv, bb_xgetpwnam); - ++argv; /* Ok, ready to do the deed now */ + argv++; do { if (!recursive_action(*argv, OPT_RECURSE, // recurse diff --git a/coreutils/id.c b/coreutils/id.c index 66874a71e..35f945dba 100644 --- a/coreutils/id.c +++ b/coreutils/id.c @@ -62,8 +62,8 @@ int id_main(int argc, char **argv) if (argv[optind]) { p = getpwnam(argv[optind]); - /* bb_xgetpwnam is needed because it exits on failure */ - uid = bb_xgetpwnam(argv[optind]); + /* xuname2uid is needed because it exits on failure */ + uid = xuname2uid(argv[optind]); gid = p->pw_gid; /* in this case PRINT_REAL is the same */ } diff --git a/coreutils/install.c b/coreutils/install.c index 3e003905e..aa7e8bf2b 100644 --- a/coreutils/install.c +++ b/coreutils/install.c @@ -13,58 +13,62 @@ #include #include /* struct option */ -#define INSTALL_OPT_CMD 1 -#define INSTALL_OPT_DIRECTORY 2 -#define INSTALL_OPT_PRESERVE_TIME 4 -#define INSTALL_OPT_STRIP 8 -#define INSTALL_OPT_GROUP 16 -#define INSTALL_OPT_MODE 32 -#define INSTALL_OPT_OWNER 64 - #if ENABLE_FEATURE_INSTALL_LONG_OPTIONS static const struct option install_long_options[] = { - { "directory", 0, NULL, 'd' }, - { "preserve-timestamps", 0, NULL, 'p' }, - { "strip", 0, NULL, 's' }, - { "group", 0, NULL, 'g' }, - { "mode", 0, NULL, 'm' }, - { "owner", 0, NULL, 'o' }, - { 0, 0, 0, 0 } + { "directory", 0, NULL, 'd' }, + { "preserve-timestamps", 0, NULL, 'p' }, + { "strip", 0, NULL, 's' }, + { "group", 0, NULL, 'g' }, + { "mode", 0, NULL, 'm' }, + { "owner", 0, NULL, 'o' }, + { 0, 0, 0, 0 } }; #endif int install_main(int argc, char **argv) { + struct stat statbuf; mode_t mode; uid_t uid; gid_t gid; - char *gid_str = "-1"; - char *uid_str = "-1"; - char *mode_str = "0755"; + const char *gid_str; + const char *uid_str; + const char *mode_str; int copy_flags = FILEUTILS_DEREFERENCE | FILEUTILS_FORCE; int ret = EXIT_SUCCESS, flags, i, isdir; + enum { + OPT_CMD = 0x1, + OPT_DIRECTORY = 0x2, + OPT_PRESERVE_TIME = 0x4, + OPT_STRIP = 0x8, + OPT_GROUP = 0x10, + OPT_MODE = 0x20, + OPT_OWNER = 0x40, + }; + #if ENABLE_FEATURE_INSTALL_LONG_OPTIONS applet_long_options = install_long_options; #endif opt_complementary = "?:s--d:d--s"; /* -c exists for backwards compatibility, its needed */ - flags = getopt32(argc, argv, "cdpsg:m:o:", &gid_str, &mode_str, &uid_str); /* 'a' must be 2nd */ + flags = getopt32(argc, argv, "cdpsg:m:o:", &gid_str, &mode_str, &uid_str); /* preserve access and modification time, this is GNU behaviour, BSD only preserves modification time */ - if (flags & INSTALL_OPT_PRESERVE_TIME) { + if (flags & OPT_PRESERVE_TIME) { copy_flags |= FILEUTILS_PRESERVE_STATUS; } - bb_parse_mode(mode_str, &mode); - gid = get_ug_id(gid_str, bb_xgetgrnam); - uid = get_ug_id(uid_str, bb_xgetpwnam); - umask(0); + mode = 0666; + if (flags & OPT_MODE) bb_parse_mode(mode_str, &mode); + uid = (flags & OPT_OWNER) ? get_ug_id(uid_str, xuname2uid) : getuid(); + gid = (flags & OPT_GROUP) ? get_ug_id(gid_str, xgroup2gid) : getgid(); + if (flags & (OPT_OWNER|OPT_GROUP)) umask(0); /* Create directories * don't use bb_make_directory() as it can't change uid or gid * perhaps bb_make_directory() should be improved. */ - if (flags & INSTALL_OPT_DIRECTORY) { + if (flags & OPT_DIRECTORY) { for (argv += optind; *argv; argv++) { char *old_argv_ptr = *argv + 1; char *argv_ptr; @@ -75,14 +79,16 @@ int install_main(int argc, char **argv) *argv_ptr = '\0'; old_argv_ptr++; } - if (mkdir(*argv, mode) == -1) { + if (mkdir(*argv, mode | 0111) == -1) { if (errno != EEXIST) { bb_perror_msg("cannot create %s", *argv); ret = EXIT_FAILURE; break; } } - else if (lchown(*argv, uid, gid) == -1) { + if ((flags & (OPT_OWNER|OPT_GROUP)) + && lchown(*argv, uid, gid) == -1 + ) { bb_perror_msg("cannot change ownership of %s", *argv); ret = EXIT_FAILURE; break; @@ -95,36 +101,36 @@ int install_main(int argc, char **argv) return ret; } - { - struct stat statbuf; - isdir = lstat(argv[argc - 1], &statbuf)<0 - ? 0 : S_ISDIR(statbuf.st_mode); - } + isdir = lstat(argv[argc - 1], &statbuf) < 0 ? 0 : S_ISDIR(statbuf.st_mode); + for (i = optind; i < argc - 1; i++) { char *dest; dest = argv[argc - 1]; - if (isdir) dest = concat_path_file(argv[argc - 1], basename(argv[i])); + if (isdir) + dest = concat_path_file(argv[argc - 1], basename(argv[i])); ret |= copy_file(argv[i], dest, copy_flags); /* Set the file mode */ - if (chmod(dest, mode) == -1) { + if ((flags & OPT_MODE) && chmod(dest, mode) == -1) { bb_perror_msg("cannot change permissions of %s", dest); ret = EXIT_FAILURE; } /* Set the user and group id */ - if (lchown(dest, uid, gid) == -1) { + if ((flags & (OPT_OWNER|OPT_GROUP)) + && lchown(dest, uid, gid) == -1 + ) { bb_perror_msg("cannot change ownership of %s", dest); ret = EXIT_FAILURE; } - if (flags & INSTALL_OPT_STRIP) { + if (flags & OPT_STRIP) { if (execlp("strip", "strip", dest, NULL) == -1) { - bb_error_msg("strip failed"); + bb_perror_msg("strip"); ret = EXIT_FAILURE; } } - if(ENABLE_FEATURE_CLEAN_UP && isdir) free(dest); + if (ENABLE_FEATURE_CLEAN_UP && isdir) free(dest); } return ret; -- cgit v1.2.3