install: shrink a bit, fix two buglets

This commit is contained in:
Denis Vlasenko 2007-08-26 14:21:55 +00:00
parent 6dd333dfe6
commit 614aca61e5

View File

@ -73,11 +73,14 @@ int install_main(int argc, char **argv)
mode_t mode; mode_t mode;
uid_t uid; uid_t uid;
gid_t gid; gid_t gid;
char *arg, *last;
const char *gid_str; const char *gid_str;
const char *uid_str; const char *uid_str;
const char *mode_str; const char *mode_str;
int copy_flags = FILEUTILS_DEREFERENCE | FILEUTILS_FORCE; int copy_flags = FILEUTILS_DEREFERENCE | FILEUTILS_FORCE;
int ret = EXIT_SUCCESS, flags, i, isdir; int flags;
int ret = EXIT_SUCCESS;
int isdir;
#if ENABLE_SELINUX #if ENABLE_SELINUX
security_context_t scontext; security_context_t scontext;
#endif #endif
@ -103,6 +106,8 @@ int install_main(int argc, char **argv)
flags = getopt32(argv, "cdpsg:m:o:" USE_SELINUX("Z:"), flags = getopt32(argv, "cdpsg:m:o:" USE_SELINUX("Z:"),
&gid_str, &mode_str, &uid_str USE_SELINUX(, &scontext)); &gid_str, &mode_str, &uid_str USE_SELINUX(, &scontext));
argc -= optind;
argv += optind;
#if ENABLE_SELINUX #if ENABLE_SELINUX
if (flags & OPT_PRESERVE_SECURITY_CONTEXT) { if (flags & OPT_PRESERVE_SECURITY_CONTEXT) {
@ -135,48 +140,50 @@ int install_main(int argc, char **argv)
* perhaps bb_make_directory() should be improved. * perhaps bb_make_directory() should be improved.
*/ */
if (flags & OPT_DIRECTORY) { if (flags & OPT_DIRECTORY) {
for (argv += optind; *argv; argv++) { while ((arg = *argv++) != NULL) {
char *old_argv_ptr = *argv + 1; char *slash = arg;
char *argv_ptr; while (1) {
do { slash = strchr(slash + 1, '/');
argv_ptr = strchr(old_argv_ptr, '/'); if (slash)
old_argv_ptr = argv_ptr; *slash = '\0';
if (argv_ptr) { if (mkdir(arg, mode | 0111) == -1) {
*argv_ptr = '\0';
old_argv_ptr++;
}
if (mkdir(*argv, mode | 0111) == -1) {
if (errno != EEXIST) { if (errno != EEXIST) {
bb_perror_msg("cannot create %s", *argv); bb_perror_msg("cannot create %s", arg);
ret = EXIT_FAILURE; ret = EXIT_FAILURE;
break; break;
} }
} } /* dir was created, chown? */
if ((flags & (OPT_OWNER|OPT_GROUP)) else if ((flags & (OPT_OWNER|OPT_GROUP))
&& lchown(*argv, uid, gid) == -1 && lchown(arg, uid, gid) == -1
) { ) {
bb_perror_msg("cannot change ownership of %s", *argv); bb_perror_msg("cannot change ownership of %s", arg);
ret = EXIT_FAILURE; ret = EXIT_FAILURE;
break; break;
} }
if (argv_ptr) { if (!slash)
*argv_ptr = '/'; break;
} *slash = '/';
} while (old_argv_ptr); }
} }
return ret; return ret;
} }
if (argc < 2)
bb_show_usage();
last = argv[argc - 1];
/* coreutils install resolves link in this case, don't use lstat */ /* coreutils install resolves link in this case, don't use lstat */
isdir = stat(argv[argc - 1], &statbuf) < 0 ? 0 : S_ISDIR(statbuf.st_mode); isdir = stat(last, &statbuf) < 0 ? 0 : S_ISDIR(statbuf.st_mode);
for (i = optind; i < argc - 1; i++) { while ((arg = *argv++) != NULL) {
char *dest; char *dest = last;
dest = argv[argc - 1];
if (isdir) if (isdir)
dest = concat_path_file(argv[argc - 1], basename(argv[i])); dest = concat_path_file(last, basename(arg));
ret |= copy_file(argv[i], dest, copy_flags); if (copy_file(arg, dest, copy_flags)) {
/* copy is not made */
ret = EXIT_FAILURE;
goto next;
}
/* Set the file mode */ /* Set the file mode */
if ((flags & OPT_MODE) && chmod(dest, mode) == -1) { if ((flags & OPT_MODE) && chmod(dest, mode) == -1) {
@ -204,7 +211,9 @@ int install_main(int argc, char **argv)
ret = EXIT_FAILURE; ret = EXIT_FAILURE;
} }
} }
if (ENABLE_FEATURE_CLEAN_UP && isdir) free(dest); next:
if (ENABLE_FEATURE_CLEAN_UP && isdir)
free(dest);
} }
return ret; return ret;