[BusyBox-cvs] busybox/coreutils install.c,1.4,1.5

Glenn McGrath bug1 at busybox.net
Fri Jan 23 10:57:03 UTC 2004


Update of /var/cvs/busybox/coreutils
In directory nail:/tmp/cvs-serv20032/coreutils

Modified Files:
	install.c 
Log Message:
Remove unneeded conditions and logic, fix bug where ownership didnt 
change.
Dont use bb_make_directory it doesnt have the features, and its ugly to 
work around it. 


Index: install.c
===================================================================
RCS file: /var/cvs/busybox/coreutils/install.c,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -d -r1.4 -r1.5
--- install.c	27 Nov 2003 22:40:08 -0000	1.4
+++ install.c	23 Jan 2004 10:57:00 -0000	1.5
@@ -42,12 +42,12 @@
 extern int install_main(int argc, char **argv)
 {
 	struct stat statbuf;
-	mode_t mode = 0755;
-	uid_t uid = -1;
-	gid_t gid = -1;
-	char *gid_str;
-	char *uid_str;
-	char *mode_str;
+	mode_t mode;
+	uid_t uid;
+	gid_t gid;
+	char *gid_str = "-1";
+	char *uid_str = "-1";
+	char *mode_str = "0755";
 	int copy_flags = FILEUTILS_DEREFERENCE | FILEUTILS_FORCE;
 	int ret = EXIT_SUCCESS;
 	int flags;
@@ -60,39 +60,40 @@
 	if (flags & INSTALL_OPT_PRESERVE_TIME) {
 		copy_flags |= FILEUTILS_PRESERVE_STATUS;
 	}
-	if (flags & INSTALL_OPT_GROUP) {
-		gid = get_ug_id(gid_str, my_getgrnam);
-	}
-	if (flags & INSTALL_OPT_MODE) {
-		bb_parse_mode(mode_str, &mode);
-	}
-	if (flags & INSTALL_OPT_OWNER) {
-		uid = get_ug_id(uid_str, my_getpwnam);
-	}
+	bb_parse_mode(mode_str, &mode);
+	gid = get_ug_id(gid_str, my_getgrnam);
+	uid = get_ug_id(uid_str, my_getpwnam);
+	umask(0);
 
-	/* Create directories */
+	/* Create directories
+	 * dont use bb_make_directory() as it cant change uid or gid
+	 * perhaps bb_make_directory() should be improved.
+	 */
 	if (flags & INSTALL_OPT_DIRECTORY) {
-	
 		for (argv += optind; *argv; argv++) {
-			unsigned char *dir_name = *argv;
-			unsigned char *argv_ptr;
-
-			ret |= bb_make_directory(dir_name, mode, FILEUTILS_RECUR);
+			char *old_argv_ptr = *argv + 1;
+			char *argv_ptr;
 			do {
-				argv_ptr = strrchr(dir_name, '/');
-
-				/* Skip the "." and ".." directories */
-				if ((dir_name[0] == '.') && ((dir_name[1] == '\0') || ((dir_name[1] == '.') && (dir_name[2] == '\0')))) {
+				argv_ptr = strchr(old_argv_ptr, '/');
+				old_argv_ptr = argv_ptr;
+				if (argv_ptr) {
+					*argv_ptr = '\0';
+					old_argv_ptr++;
+				}
+				if ((mkdir(*argv, mode) == -1) && (errno != EEXIST)) {
+					bb_perror_msg("coulnt create %s", *argv);
+					ret = EXIT_FAILURE;
 					break;
 				}
-				if (lchown(dir_name, uid, gid) == -1) {
-					bb_perror_msg("cannot change ownership of %s", argv_ptr);
-					ret |= EXIT_FAILURE;
+				else if (lchown(*argv, uid, gid) == -1) {
+					bb_perror_msg("cannot change ownership of %s", *argv);
+					ret = EXIT_FAILURE;
+					break;
 				}
 				if (argv_ptr) {
-					*argv_ptr = '\0';
+					*argv_ptr = '/';
 				}
-			} while (argv_ptr);
+			} while (old_argv_ptr);
 		}
 		return(ret);
 	}
@@ -111,18 +112,18 @@
 		/* Set the file mode */
 		if (chmod(dest, mode) == -1) {
 			bb_perror_msg("cannot change permissions of %s", dest);
-			ret |= EXIT_FAILURE;
+			ret = EXIT_FAILURE;
 		}
 
 		/* Set the user and group id */
 		if (lchown(dest, uid, gid) == -1) {
 			bb_perror_msg("cannot change ownership of %s", dest);
-			ret |= EXIT_FAILURE;			
+			ret = EXIT_FAILURE;			
 		}
 		if (flags & INSTALL_OPT_STRIP) {
 			if (execlp("strip", "strip", dest, NULL) == -1) {
 				bb_error_msg("strip failed");
-				ret |= EXIT_FAILURE;			
+				ret = EXIT_FAILURE;			
 			}
 		}
 	}




More information about the busybox-cvs mailing list