From d4b719878f5a08986d0a3dc493aad90d4466752e Mon Sep 17 00:00:00 2001 From: Denis Vlasenko Date: Wed, 3 Sep 2008 21:54:46 +0000 Subject: kbd_mode: fix non-ASCII letters in comments install: support -D --- coreutils/install.c | 64 +++++++++++++++++++++++++++++++---------------------- 1 file changed, 37 insertions(+), 27 deletions(-) (limited to 'coreutils/install.c') diff --git a/coreutils/install.c b/coreutils/install.c index e99f1a3bd..69bf7dc55 100644 --- a/coreutils/install.c +++ b/coreutils/install.c @@ -4,9 +4,6 @@ * SELinux support: by Yuichi Nakamura * * Licensed under GPLv2 or later, see file LICENSE in this tarball for details. - * - * TODO: -d option, need a way of recursively making directories and changing - * owner/group, will probably modify bb_make_directory(...) */ #include "libbb.h" @@ -53,7 +50,8 @@ static void setdefaultfilecon(const char *path) if (lsetfilecon(path, scontext) < 0) { if (errno != ENOTSUP) { - bb_perror_msg("warning: failed to change context of %s to %s", path, scontext); + bb_perror_msg("warning: failed to change context" + " of %s to %s", path, scontext); } } @@ -75,7 +73,7 @@ int install_main(int argc, char **argv) const char *uid_str; const char *mode_str; int copy_flags = FILEUTILS_DEREFERENCE | FILEUTILS_FORCE; - int flags; + int opts; int min_args = 1; int ret = EXIT_SUCCESS; int isdir = 0; @@ -87,15 +85,16 @@ int install_main(int argc, char **argv) OPT_c = 1 << 0, OPT_v = 1 << 1, OPT_b = 1 << 2, - OPT_DIRECTORY = 1 << 3, - OPT_PRESERVE_TIME = 1 << 4, - OPT_STRIP = 1 << 5, - OPT_GROUP = 1 << 6, - OPT_MODE = 1 << 7, - OPT_OWNER = 1 << 8, + OPT_MKDIR_LEADING = 1 << 3, + OPT_DIRECTORY = 1 << 4, + OPT_PRESERVE_TIME = 1 << 5, + OPT_STRIP = 1 << 6, + OPT_GROUP = 1 << 7, + OPT_MODE = 1 << 8, + OPT_OWNER = 1 << 9, #if ENABLE_SELINUX - OPT_SET_SECURITY_CONTEXT = 1 << 9, - OPT_PRESERVE_SECURITY_CONTEXT = 1 << 10, + OPT_SET_SECURITY_CONTEXT = 1 << 10, + OPT_PRESERVE_SECURITY_CONTEXT = 1 << 11, #endif }; @@ -106,37 +105,38 @@ int install_main(int argc, char **argv) /* -c exists for backwards compatibility, it's needed */ /* -v is ignored ("print name of each created directory") */ /* -b is ignored ("make a backup of each existing destination file") */ - flags = getopt32(argv, "cvb" "dpsg:m:o:" USE_SELINUX("Z:"), + opts = getopt32(argv, "cvb" "Ddpsg:m:o:" USE_SELINUX("Z:"), &gid_str, &mode_str, &uid_str USE_SELINUX(, &scontext)); argc -= optind; argv += optind; #if ENABLE_SELINUX - if (flags & (OPT_PRESERVE_SECURITY_CONTEXT|OPT_SET_SECURITY_CONTEXT)) { + if (opts & (OPT_PRESERVE_SECURITY_CONTEXT|OPT_SET_SECURITY_CONTEXT)) { selinux_or_die(); use_default_selinux_context = 0; - if (flags & OPT_PRESERVE_SECURITY_CONTEXT) { + if (opts & OPT_PRESERVE_SECURITY_CONTEXT) { copy_flags |= FILEUTILS_PRESERVE_SECURITY_CONTEXT; } - if (flags & OPT_SET_SECURITY_CONTEXT) { + if (opts & OPT_SET_SECURITY_CONTEXT) { setfscreatecon_or_die(scontext); copy_flags |= FILEUTILS_SET_SECURITY_CONTEXT; } } #endif - /* preserve access and modification time, this is GNU behaviour, BSD only preserves modification time */ - if (flags & OPT_PRESERVE_TIME) { + /* preserve access and modification time, this is GNU behaviour, + * BSD only preserves modification time */ + if (opts & OPT_PRESERVE_TIME) { copy_flags |= FILEUTILS_PRESERVE_STATUS; } mode = 0666; - if (flags & OPT_MODE) + if (opts & 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(); + uid = (opts & OPT_OWNER) ? get_ug_id(uid_str, xuname2uid) : getuid(); + gid = (opts & OPT_GROUP) ? get_ug_id(gid_str, xgroup2gid) : getgid(); last = argv[argc - 1]; - if (!(flags & OPT_DIRECTORY)) { + if (!(opts & OPT_DIRECTORY)) { argv[argc - 1] = NULL; min_args++; @@ -149,7 +149,7 @@ int install_main(int argc, char **argv) while ((arg = *argv++) != NULL) { char *dest = last; - if (flags & OPT_DIRECTORY) { + if (opts & OPT_DIRECTORY) { dest = arg; /* GNU coreutils 6.9 does not set uid:gid * on intermediate created directories @@ -161,6 +161,16 @@ int install_main(int argc, char **argv) } else { if (isdir) dest = concat_path_file(last, basename(arg)); + if (opts & OPT_MKDIR_LEADING) { + char *slash = strrchr(dest, '/'); + if (slash) { + *slash = '\0'; + bb_make_directory(dest, 0755, FILEUTILS_RECUR); + /* errors are not checked. copy_file + * will fail if dir is not created. */ + *slash = '/'; + } + } if (copy_file(arg, dest, copy_flags)) { /* copy is not made */ ret = EXIT_FAILURE; @@ -169,7 +179,7 @@ int install_main(int argc, char **argv) } /* Set the file mode */ - if ((flags & OPT_MODE) && chmod(dest, mode) == -1) { + if ((opts & OPT_MODE) && chmod(dest, mode) == -1) { bb_perror_msg("can't change %s of %s", "permissions", dest); ret = EXIT_FAILURE; } @@ -178,13 +188,13 @@ int install_main(int argc, char **argv) setdefaultfilecon(dest); #endif /* Set the user and group id */ - if ((flags & (OPT_OWNER|OPT_GROUP)) + if ((opts & (OPT_OWNER|OPT_GROUP)) && lchown(dest, uid, gid) == -1 ) { bb_perror_msg("can't change %s of %s", "ownership", dest); ret = EXIT_FAILURE; } - if (flags & OPT_STRIP) { + if (opts & OPT_STRIP) { char *args[3]; args[0] = (char*)"strip"; args[1] = dest; -- cgit v1.2.3