aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--coreutils/install.c32
1 files changed, 31 insertions, 1 deletions
diff --git a/coreutils/install.c b/coreutils/install.c
index b235817cc..e057aebed 100644
--- a/coreutils/install.c
+++ b/coreutils/install.c
@@ -27,6 +27,7 @@
27#include <errno.h> 27#include <errno.h>
28#include <getopt.h> 28#include <getopt.h>
29#include <stdlib.h> 29#include <stdlib.h>
30#include <string.h>
30#include <unistd.h> 31#include <unistd.h>
31 32
32#include "libbb.h" 33#include "libbb.h"
@@ -40,11 +41,15 @@ extern int install_main(int argc, char **argv)
40 gid_t gid = -1; 41 gid_t gid = -1;
41 int copy_flags = 0; 42 int copy_flags = 0;
42 int strip_flag = 0; 43 int strip_flag = 0;
44 int dir_flag = 0;
43 mode_t mode = 0755; 45 mode_t mode = 0755;
44 46
45 /* -c exists for backwards compatability, its needed */ 47 /* -c exists for backwards compatability, its needed */
46 while ((i = getopt(argc, argv, "cg:m:o:ps")) != -1) { 48 while ((i = getopt(argc, argv, "cdg:m:o:ps")) != -1) {
47 switch (i) { 49 switch (i) {
50 case 'd': /* Create directories */
51 dir_flag = 1;
52 break;
48 case 'g': /* group */ 53 case 'g': /* group */
49 gid = get_ug_id(optarg, my_getgrnam); 54 gid = get_ug_id(optarg, my_getgrnam);
50 break; 55 break;
@@ -65,6 +70,31 @@ extern int install_main(int argc, char **argv)
65 } 70 }
66 } 71 }
67 72
73 if (dir_flag) {
74 for (argv += optind; *argv; argv++) {
75 unsigned char *dir_name = *argv;
76 unsigned char *argv_ptr;
77
78 ret |= bb_make_directory(dir_name, mode, FILEUTILS_RECUR);
79 do {
80 argv_ptr = strrchr(dir_name, '/');
81
82 /* Skip the "." and ".." directories */
83 if ((dir_name[0] == '.') && ((dir_name[1] == '\0') || ((dir_name[1] == '.') && (dir_name[2] == '\0')))) {
84 break;
85 }
86 if (chown(dir_name, uid, gid) == -1) {
87 bb_perror_msg("cannot change ownership of %s", argv_ptr);
88 ret |= EXIT_FAILURE;
89 }
90 if (argv_ptr) {
91 *argv_ptr = '\0';
92 }
93 } while (argv_ptr);
94 }
95 return(ret);
96 }
97
68 if ((stat(argv[argc - 1], &statbuf) == -1) && (errno != ENOENT)) { 98 if ((stat(argv[argc - 1], &statbuf) == -1) && (errno != ENOENT)) {
69 bb_perror_msg_and_die("stat failed for %s: ", argv[argc - 1]); 99 bb_perror_msg_and_die("stat failed for %s: ", argv[argc - 1]);
70 } 100 }