mirror of
https://github.com/sheumann/hush.git
synced 2025-02-23 18:29:01 +00:00
install: shrink a bit, fix two buglets
This commit is contained in:
parent
6dd333dfe6
commit
614aca61e5
@ -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;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user