فهرست منبع

Fixup standalong makedevs to handle regular files, and also fix
it to properly update file permissions as specified.

Eric Andersen 20 سال پیش
والد
کامیت
7b8aeaeb28
1فایلهای تغییر یافته به همراه32 افزوده شده و 1 حذف شده
  1. 32 1
      target/makedevs/makedevs.c

+ 32 - 1
target/makedevs/makedevs.c

@@ -443,7 +443,30 @@ int main(int argc, char **argv)
 				ret = EXIT_FAILURE;
 				goto loop;
 			}
-		} else {
+			if ((mode != -1) && (chmod(full_name, mode) < 0)){
+				bb_perror_msg("line %d: chmod failed for %s", linenum, full_name);
+				ret = EXIT_FAILURE;
+				goto loop;
+			}
+		} else if (type == 'f') {
+			struct stat st;
+			if ((stat(full_name, &st) < 0 || !S_ISREG(st.st_mode))) {
+				bb_perror_msg("line %d: regular file '%s' does not exist", linenum, full_name);
+				ret = EXIT_FAILURE;
+				goto loop;
+			}
+			if (chown(full_name, uid, gid) == -1) {
+				bb_perror_msg("line %d: chown failed for %s", linenum, full_name);
+				ret = EXIT_FAILURE;
+				goto loop;
+			}
+			if ((mode != -1) && (chmod(full_name, mode) < 0)){
+				bb_perror_msg("line %d: chmod failed for %s", linenum, full_name);
+				ret = EXIT_FAILURE;
+				goto loop;
+			}
+		} else
+		{
 			dev_t rdev;
 
 			if (type == 'p') {
@@ -476,6 +499,10 @@ int main(int argc, char **argv)
 						bb_perror_msg("line %d: chown failed for %s", linenum, full_name_inc);
 						ret = EXIT_FAILURE;
 					}
+					if ((mode != -1) && (chmod(full_name_inc, mode) < 0)){
+						bb_perror_msg("line %d: chmod failed for %s", linenum, full_name_inc);
+						ret = EXIT_FAILURE;
+					}
 				}
 				free(full_name_inc);
 			} else {
@@ -488,6 +515,10 @@ int main(int argc, char **argv)
 					bb_perror_msg("line %d: chown failed for %s", linenum, full_name);
 					ret = EXIT_FAILURE;
 				}
+				if ((mode != -1) && (chmod(full_name, mode) < 0)){
+					bb_perror_msg("line %d: chmod failed for %s", linenum, full_name);
+					ret = EXIT_FAILURE;
+				}
 			}
 		}
 loop: