diff options
author | bug1 <bug1@69ca8d6d-28ef-0310-b511-8ec308f3f277> | 2003-09-24 05:00:29 +0000 |
---|---|---|
committer | bug1 <bug1@69ca8d6d-28ef-0310-b511-8ec308f3f277> | 2003-09-24 05:00:29 +0000 |
commit | c1f7524ceb342d7c500d9ddd7b6736b740603943 (patch) | |
tree | 70f4539ece6eb3453b70b774c5b396f62a1e94cc | |
parent | ab96005684675240c7afc36c3547dfd4bfb99f23 (diff) | |
download | busybox-w32-c1f7524ceb342d7c500d9ddd7b6736b740603943.tar.gz busybox-w32-c1f7524ceb342d7c500d9ddd7b6736b740603943.tar.bz2 busybox-w32-c1f7524ceb342d7c500d9ddd7b6736b740603943.zip |
Add the -d option
git-svn-id: svn://busybox.net/trunk/busybox@7558 69ca8d6d-28ef-0310-b511-8ec308f3f277
-rw-r--r-- | coreutils/install.c | 32 |
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 | } |