aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenis Vlasenko <vda.linux@googlemail.com>2007-08-26 14:21:55 +0000
committerDenis Vlasenko <vda.linux@googlemail.com>2007-08-26 14:21:55 +0000
commit614aca61e5800ff2253ba6342fd2ae70129cd4c1 (patch)
treea9f15e3b5ee5192217b5665d4385ca6fb75515fc
parent6dd333dfe677858e73651b80d3d190eebddf2709 (diff)
downloadbusybox-w32-614aca61e5800ff2253ba6342fd2ae70129cd4c1.tar.gz
busybox-w32-614aca61e5800ff2253ba6342fd2ae70129cd4c1.tar.bz2
busybox-w32-614aca61e5800ff2253ba6342fd2ae70129cd4c1.zip
install: shrink a bit, fix two buglets
-rw-r--r--coreutils/install.c67
1 files changed, 38 insertions, 29 deletions
diff --git a/coreutils/install.c b/coreutils/install.c
index d087306d6..8575043e1 100644
--- a/coreutils/install.c
+++ b/coreutils/install.c
@@ -73,11 +73,14 @@ int install_main(int argc, char **argv)
73 mode_t mode; 73 mode_t mode;
74 uid_t uid; 74 uid_t uid;
75 gid_t gid; 75 gid_t gid;
76 char *arg, *last;
76 const char *gid_str; 77 const char *gid_str;
77 const char *uid_str; 78 const char *uid_str;
78 const char *mode_str; 79 const char *mode_str;
79 int copy_flags = FILEUTILS_DEREFERENCE | FILEUTILS_FORCE; 80 int copy_flags = FILEUTILS_DEREFERENCE | FILEUTILS_FORCE;
80 int ret = EXIT_SUCCESS, flags, i, isdir; 81 int flags;
82 int ret = EXIT_SUCCESS;
83 int isdir;
81#if ENABLE_SELINUX 84#if ENABLE_SELINUX
82 security_context_t scontext; 85 security_context_t scontext;
83#endif 86#endif
@@ -103,6 +106,8 @@ int install_main(int argc, char **argv)
103 106
104 flags = getopt32(argv, "cdpsg:m:o:" USE_SELINUX("Z:"), 107 flags = getopt32(argv, "cdpsg:m:o:" USE_SELINUX("Z:"),
105 &gid_str, &mode_str, &uid_str USE_SELINUX(, &scontext)); 108 &gid_str, &mode_str, &uid_str USE_SELINUX(, &scontext));
109 argc -= optind;
110 argv += optind;
106 111
107#if ENABLE_SELINUX 112#if ENABLE_SELINUX
108 if (flags & OPT_PRESERVE_SECURITY_CONTEXT) { 113 if (flags & OPT_PRESERVE_SECURITY_CONTEXT) {
@@ -135,48 +140,50 @@ int install_main(int argc, char **argv)
135 * perhaps bb_make_directory() should be improved. 140 * perhaps bb_make_directory() should be improved.
136 */ 141 */
137 if (flags & OPT_DIRECTORY) { 142 if (flags & OPT_DIRECTORY) {
138 for (argv += optind; *argv; argv++) { 143 while ((arg = *argv++) != NULL) {
139 char *old_argv_ptr = *argv + 1; 144 char *slash = arg;
140 char *argv_ptr; 145 while (1) {
141 do { 146 slash = strchr(slash + 1, '/');
142 argv_ptr = strchr(old_argv_ptr, '/'); 147 if (slash)
143 old_argv_ptr = argv_ptr; 148 *slash = '\0';
144 if (argv_ptr) { 149 if (mkdir(arg, mode | 0111) == -1) {
145 *argv_ptr = '\0';
146 old_argv_ptr++;
147 }
148 if (mkdir(*argv, mode | 0111) == -1) {
149 if (errno != EEXIST) { 150 if (errno != EEXIST) {
150 bb_perror_msg("cannot create %s", *argv); 151 bb_perror_msg("cannot create %s", arg);
151 ret = EXIT_FAILURE; 152 ret = EXIT_FAILURE;
152 break; 153 break;
153 } 154 }
154 } 155 } /* dir was created, chown? */
155 if ((flags & (OPT_OWNER|OPT_GROUP)) 156 else if ((flags & (OPT_OWNER|OPT_GROUP))
156 && lchown(*argv, uid, gid) == -1 157 && lchown(arg, uid, gid) == -1
157 ) { 158 ) {
158 bb_perror_msg("cannot change ownership of %s", *argv); 159 bb_perror_msg("cannot change ownership of %s", arg);
159 ret = EXIT_FAILURE; 160 ret = EXIT_FAILURE;
160 break; 161 break;
161 } 162 }
162 if (argv_ptr) { 163 if (!slash)
163 *argv_ptr = '/'; 164 break;
164 } 165 *slash = '/';
165 } while (old_argv_ptr); 166 }
166 } 167 }
167 return ret; 168 return ret;
168 } 169 }
169 170
170 /* coreutils install resolves link in this case, don't use lstat */ 171 if (argc < 2)
171 isdir = stat(argv[argc - 1], &statbuf) < 0 ? 0 : S_ISDIR(statbuf.st_mode); 172 bb_show_usage();
172 173
173 for (i = optind; i < argc - 1; i++) { 174 last = argv[argc - 1];
174 char *dest; 175 /* coreutils install resolves link in this case, don't use lstat */
176 isdir = stat(last, &statbuf) < 0 ? 0 : S_ISDIR(statbuf.st_mode);
175 177
176 dest = argv[argc - 1]; 178 while ((arg = *argv++) != NULL) {
179 char *dest = last;
177 if (isdir) 180 if (isdir)
178 dest = concat_path_file(argv[argc - 1], basename(argv[i])); 181 dest = concat_path_file(last, basename(arg));
179 ret |= copy_file(argv[i], dest, copy_flags); 182 if (copy_file(arg, dest, copy_flags)) {
183 /* copy is not made */
184 ret = EXIT_FAILURE;
185 goto next;
186 }
180 187
181 /* Set the file mode */ 188 /* Set the file mode */
182 if ((flags & OPT_MODE) && chmod(dest, mode) == -1) { 189 if ((flags & OPT_MODE) && chmod(dest, mode) == -1) {
@@ -204,7 +211,9 @@ int install_main(int argc, char **argv)
204 ret = EXIT_FAILURE; 211 ret = EXIT_FAILURE;
205 } 212 }
206 } 213 }
207 if (ENABLE_FEATURE_CLEAN_UP && isdir) free(dest); 214 next:
215 if (ENABLE_FEATURE_CLEAN_UP && isdir)
216 free(dest);
208 } 217 }
209 218
210 return ret; 219 return ret;