aboutsummaryrefslogtreecommitdiff
path: root/coreutils
diff options
context:
space:
mode:
authorDenis Vlasenko <vda.linux@googlemail.com>2008-07-16 21:49:02 +0000
committerDenis Vlasenko <vda.linux@googlemail.com>2008-07-16 21:49:02 +0000
commitd6817f5d8bc1deda64ff3230301a75cf7019fda2 (patch)
tree1f145bead535a3f34cb91cee8d27e4ca8fd4ee64 /coreutils
parent83cea0ef049d5aa50dfd431d5f8f6564cd93ce77 (diff)
downloadbusybox-w32-d6817f5d8bc1deda64ff3230301a75cf7019fda2.tar.gz
busybox-w32-d6817f5d8bc1deda64ff3230301a75cf7019fda2.tar.bz2
busybox-w32-d6817f5d8bc1deda64ff3230301a75cf7019fda2.zip
install: do not chown intermediate directories with install -d; shrink
(by Natanael Copa) function old new delta .rodata 171528 171511 -17 install_main 841 697 -144 ------------------------------------------------------------------------------ (add/remove: 0/0 grow/shrink: 0/2 up/down: 0/-161) Total: -161 bytes
Diffstat (limited to 'coreutils')
-rw-r--r--coreutils/install.c75
1 files changed, 28 insertions, 47 deletions
diff --git a/coreutils/install.c b/coreutils/install.c
index 0b5eda0ac..c5d7a0cc5 100644
--- a/coreutils/install.c
+++ b/coreutils/install.c
@@ -76,8 +76,9 @@ int install_main(int argc, char **argv)
76 const char *mode_str; 76 const char *mode_str;
77 int copy_flags = FILEUTILS_DEREFERENCE | FILEUTILS_FORCE; 77 int copy_flags = FILEUTILS_DEREFERENCE | FILEUTILS_FORCE;
78 int flags; 78 int flags;
79 int min_args = 1;
79 int ret = EXIT_SUCCESS; 80 int ret = EXIT_SUCCESS;
80 int isdir; 81 int isdir = 0;
81#if ENABLE_SELINUX 82#if ENABLE_SELINUX
82 security_context_t scontext; 83 security_context_t scontext;
83 bool use_default_selinux_context = 1; 84 bool use_default_selinux_context = 1;
@@ -133,58 +134,38 @@ int install_main(int argc, char **argv)
133 bb_parse_mode(mode_str, &mode); 134 bb_parse_mode(mode_str, &mode);
134 uid = (flags & OPT_OWNER) ? get_ug_id(uid_str, xuname2uid) : getuid(); 135 uid = (flags & OPT_OWNER) ? get_ug_id(uid_str, xuname2uid) : getuid();
135 gid = (flags & OPT_GROUP) ? get_ug_id(gid_str, xgroup2gid) : getgid(); 136 gid = (flags & OPT_GROUP) ? get_ug_id(gid_str, xgroup2gid) : getgid();
136 if (flags & (OPT_OWNER|OPT_GROUP)) 137
137 umask(0); 138 last = argv[argc - 1];
138 139 if (!(flags & OPT_DIRECTORY)) {
139 /* Create directories 140 argv[argc - 1] = NULL;
140 * don't use bb_make_directory() as it can't change uid or gid 141 min_args++;
141 * perhaps bb_make_directory() should be improved. 142
142 */ 143 /* coreutils install resolves link in this case, don't use lstat */
143 if (flags & OPT_DIRECTORY) { 144 isdir = stat(last, &statbuf) < 0 ? 0 : S_ISDIR(statbuf.st_mode);
144 while ((arg = *argv++) != NULL) {
145 char *slash = arg;
146 while (1) {
147 slash = strchr(slash + 1, '/');
148 if (slash)
149 *slash = '\0';
150 if (mkdir(arg, mode | 0111) == -1) {
151 if (errno != EEXIST) {
152 bb_perror_msg("cannot create %s", arg);
153 ret = EXIT_FAILURE;
154 break;
155 }
156 } /* dir was created, chown? */
157 else if ((flags & (OPT_OWNER|OPT_GROUP))
158 && lchown(arg, uid, gid) == -1
159 ) {
160 bb_perror_msg("cannot change ownership of %s", arg);
161 ret = EXIT_FAILURE;
162 break;
163 }
164 if (!slash)
165 break;
166 *slash = '/';
167 }
168 }
169 return ret;
170 } 145 }
171 146
172 if (argc < 2) 147 if (argc < min_args)
173 bb_show_usage(); 148 bb_show_usage();
174 149
175 last = argv[argc - 1];
176 argv[argc - 1] = NULL;
177 /* coreutils install resolves link in this case, don't use lstat */
178 isdir = stat(last, &statbuf) < 0 ? 0 : S_ISDIR(statbuf.st_mode);
179
180 while ((arg = *argv++) != NULL) { 150 while ((arg = *argv++) != NULL) {
181 char *dest = last; 151 char *dest = last;
182 if (isdir) 152 if (flags & OPT_DIRECTORY) {
183 dest = concat_path_file(last, basename(arg)); 153 dest = arg;
184 if (copy_file(arg, dest, copy_flags)) { 154 /* GNU coreutils 6.9 does not set uid:gid
185 /* copy is not made */ 155 * on intermediate created directories
186 ret = EXIT_FAILURE; 156 * (only on last one) */
187 goto next; 157 if (bb_make_directory(dest, 0755, FILEUTILS_RECUR)) {
158 ret = EXIT_FAILURE;
159 goto next;
160 }
161 } else {
162 if (isdir)
163 dest = concat_path_file(last, basename(arg));
164 if (copy_file(arg, dest, copy_flags)) {
165 /* copy is not made */
166 ret = EXIT_FAILURE;
167 goto next;
168 }
188 } 169 }
189 170
190 /* Set the file mode */ 171 /* Set the file mode */