Finish implementing fakeroot handling so mksquashfs properly
authorEric Andersen <andersen@codepoet.org>
Fri, 24 Jun 2005 07:26:33 +0000 (07:26 -0000)
committerEric Andersen <andersen@codepoet.org>
Fri, 24 Jun 2005 07:26:33 +0000 (07:26 -0000)
inherits device table settings and device nodes, exactly as
per mkfs* applications that support device tables natively.

package/fakeroot/fakeroot.mk
target/makedevs/makedevs.c
target/makedevs/makedevs.mk
target/squashfs/squashfsroot.mk

index 3ab83dffaff1a247c65e1cc8f3f583ba7c54986c..07ed20657917e2bf88a0b86df604720424a57047 100644 (file)
@@ -40,6 +40,9 @@ $(FAKEROOT_DIR1)/faked: $(FAKEROOT_DIR1)/.configured
 
 $(STAGING_DIR)/usr/bin/fakeroot: $(FAKEROOT_DIR1)/faked
        $(MAKE) DESTDIR=$(STAGING_DIR) -C $(FAKEROOT_DIR1) install
+       $(SED) 's,^PREFIX=.*,PREFIX=$(STAGING_DIR)/usr,g' $(STAGING_DIR)/usr/bin/fakeroot
+       $(SED) 's,^BINDIR=.*,BINDIR=$(STAGING_DIR)/usr/bin,g' $(STAGING_DIR)/usr/bin/fakeroot
+       $(SED) 's,^PATHS=.*,PATHS=$(FAKEROOT_DIR1)/.libs:/lib:/usr/lib,g' $(STAGING_DIR)/usr/bin/fakeroot
 
 host-fakeroot: uclibc $(STAGING_DIR)/usr/bin/fakeroot
 
index d2b3a2a74b6fbdf53cf32332380738a0b06d837b..bb3310761efd9c896a9d89786b0f2a3b3d0af992 100644 (file)
@@ -25,7 +25,9 @@
 #include <pwd.h>
 #include <grp.h>
 #include <unistd.h>
+#include <ctype.h>
 #include <errno.h>
+#include <libgen.h>
 #include <stdarg.h>
 #include <sys/stat.h>
 #include <sys/types.h>
@@ -97,6 +99,13 @@ FILE *bb_xfopen(const char *path, const char *mode)
        return fp;
 }
 
+enum {
+       FILEUTILS_PRESERVE_STATUS = 1,
+       FILEUTILS_DEREFERENCE = 2,
+       FILEUTILS_RECUR = 4,
+       FILEUTILS_FORCE = 8,
+       FILEUTILS_INTERACTIVE = 16
+};
 int bb_make_directory (char *path, long mode, int flags)
 {
        mode_t mask;
@@ -104,13 +113,6 @@ int bb_make_directory (char *path, long mode, int flags)
        char *s = path;
        char c;
        struct stat st;
-       enum {
-               FILEUTILS_PRESERVE_STATUS = 1,
-               FILEUTILS_DEREFERENCE = 2,
-               FILEUTILS_RECUR = 4,
-               FILEUTILS_FORCE = 8,
-               FILEUTILS_INTERACTIVE = 16
-       };
 
        mask = umask(0);
        if (mode == -1) {
@@ -325,20 +327,20 @@ int main(int argc, char **argv)
        FILE *table = stdin;
        char *rootdir = "./";
        char *line;
+       int linenum = 0;
        int ret = EXIT_SUCCESS;
 
-       bb_applet_name = argv[0];
+       bb_applet_name = basename(argv[0]);
+       argc--;
+       argv++;
 
-       while ((opt = getopt(argc, argv, "d:r:")) != -1) {
+       while ((opt = getopt(argc, argv, "d:")) != -1) {
                switch(opt) {
                case 'd':
                        table = bb_xfopen(optarg, "r");
                        break;
-               case 'n':
-                       rootdir = optarg;
-                       break;
                default:
-                       fprintf(stderr, "%s: [-r rootdir] [device_table]\n\n", bb_applet_name);
+                       fprintf(stderr, "%s: [-d device_table] rootdir\n\n", bb_applet_name);
                        fprintf(stderr, "Creates a batch of special files as specified in a device table.\n");
                        fprintf(stderr, "Device table entries take the form of:\n");
                        fprintf(stderr, "type mode user group major minor start increment count\n\n");
@@ -370,8 +372,13 @@ int main(int argc, char **argv)
                }
        }
 
+       if (optind >= argc) {
+               bb_error_msg_and_die("root directory not speficied");
+       }
+       rootdir = argv[optind];
+
 
-       if (chdir(rootdir) == -1) {
+       if (chdir(rootdir) != 0) {
                bb_perror_msg_and_die("Couldnt chdir to %s", rootdir);
        }
 
@@ -392,11 +399,16 @@ int main(int argc, char **argv)
                uid_t uid;
                gid_t gid;
 
+               linenum++;
+
                if ((2 > sscanf(line, "%40s %c %o %40s %40s %u %u %u %u %u", name,
                        &type, &mode, user, group, &major,
                        &minor, &start, &increment, &count)) ||
-                       ((major | minor | start | count | increment) > 255)) {
-                       bb_error_msg("Ignoring invalid line\n%s\n", line);
+                       ((major | minor | start | count | increment) > 255))
+               {
+                       if (*line=='\0' || *line=='#' || isspace(*line))
+                               continue;
+                       bb_error_msg("line %d invalid: '%s'\n", linenum, line);
                        ret = EXIT_FAILURE;
                        continue;
                }
@@ -416,9 +428,9 @@ int main(int argc, char **argv)
                full_name = concat_path_file(rootdir, name);
 
                if (type == 'd') {
-                       bb_make_directory(full_name, mode | S_IFDIR, 0);
+                       bb_make_directory(full_name, mode | S_IFDIR, FILEUTILS_RECUR);
                        if (chown(full_name, uid, gid) == -1) {
-                               bb_perror_msg("chown failed for %s", full_name);
+                               bb_perror_msg("line %d: chown failed for %s", linenum, full_name);
                                ret = EXIT_FAILURE;
                                goto loop;
                        }
@@ -434,7 +446,7 @@ int main(int argc, char **argv)
                        else if (type == 'b') {
                                mode |= S_IFBLK;
                        } else {
-                               bb_error_msg("Unsupported file type %c", type);
+                               bb_error_msg("line %d: Unsupported file type %c", linenum, type);
                                ret = EXIT_FAILURE;
                                goto loop;
                        }
@@ -448,11 +460,11 @@ int main(int argc, char **argv)
                                        sprintf(full_name_inc, "%s%d", full_name, i);
                                        rdev = (major << 8) + minor + (i * increment - start);
                                        if (mknod(full_name_inc, mode, rdev) == -1) {
-                                               bb_perror_msg("Couldnt create node %s", full_name_inc);
+                                               bb_perror_msg("line %d: Couldnt create node %s", linenum, full_name_inc);
                                                ret = EXIT_FAILURE;
                                        }
                                        else if (chown(full_name_inc, uid, gid) == -1) {
-                                               bb_perror_msg("chown failed for %s", full_name_inc);
+                                               bb_perror_msg("line %d: chown failed for %s", linenum, full_name_inc);
                                                ret = EXIT_FAILURE;
                                        }
                                }
@@ -460,11 +472,11 @@ int main(int argc, char **argv)
                        } else {
                                rdev = (major << 8) + minor;
                                if (mknod(full_name, mode, rdev) == -1) {
-                                       bb_perror_msg("Couldnt create node %s", full_name);
+                                       bb_perror_msg("line %d: Couldnt create node %s", linenum, full_name);
                                        ret = EXIT_FAILURE;
                                }
                                else if (chown(full_name, uid, gid) == -1) {
-                                       bb_perror_msg("chown failed for %s", full_name);
+                                       bb_perror_msg("line %d: chown failed for %s", linenum, full_name);
                                        ret = EXIT_FAILURE;
                                }
                        }
index cfc19d0ec55a75ebce1fc565979f8899616f8b4b..620b0cdcd6309ca4e9edb6bd33cbef5ab49d8f58 100644 (file)
@@ -7,12 +7,13 @@
 #############################################################
 MAKEDEVS_DIR=$(BUILD_DIR)/makedevs
 
-$(MAKEDEVS_DIR)/makedevs.c:
+$(MAKEDEVS_DIR)/makedevs.c: target/makedevs/makedevs.c
+       rm -rf $(MAKEDEVS_DIR)
        mkdir $(MAKEDEVS_DIR)
        cp target/makedevs/makedevs.c $(MAKEDEVS_DIR)
 
-$(MAKEDEVS_DIR)/makedevs: $(MAKEDEVS_DIR)
-       gcc -Wall -O2 makedevs.c -o makedevs
+$(MAKEDEVS_DIR)/makedevs: $(MAKEDEVS_DIR)/makedevs.c
+       gcc -Wall -Werror -O2 $(MAKEDEVS_DIR)/makedevs.c -o $(MAKEDEVS_DIR)/makedevs
        touch -c $(MAKEDEVS_DIR)/makedevs
 
 $(STAGING_DIR)/bin/makedevs: $(MAKEDEVS_DIR)/makedevs
index 50aaf58fedd2454c232b726d7d2e7275523b6e14..4f4d76dba4954503c363e594558be4ef46ff4ade 100644 (file)
@@ -35,22 +35,28 @@ squashfs-dirclean:
 #############################################################
 
 squashfsroot: squashfs host-fakeroot makedevs
+       -@find $(TARGET_DIR) -type f -perm +111 | xargs $(STRIP) 2>/dev/null || true;
+       @rm -rf $(TARGET_DIR)/usr/man
+       @rm -rf $(TARGET_DIR)/usr/info
+       # Use fakeroot to munge permissions and do root-like things
        rm -f $(STAGING_DIR)/fakeroot.env
        touch $(STAGING_DIR)/fakeroot.env
        # Use fakeroot to pretend all target binaries are owned by root
-       $(STAGING_DIR)/usr/bin/fakeroot -i $(STAGING_DIR)/fakeroot.env \
+       $(STAGING_DIR)/usr/bin/fakeroot \
+               -i $(STAGING_DIR)/fakeroot.env \
                -s $(STAGING_DIR)/fakeroot.env -- \
-               find $(TARGET_DIR) | xargs chown -R root:root
+               chown -R root:root $(TARGET_DIR)
        # Use fakeroot to pretend to create all needed device nodes
-       $(STAGING_DIR)/usr/bin/fakeroot -i $(STAGING_DIR)/fakeroot.env \
+       $(STAGING_DIR)/usr/bin/fakeroot \
+               -i $(STAGING_DIR)/fakeroot.env \
                -s $(STAGING_DIR)/fakeroot.env -- \
-               $(STAGING_DIR)/bin/makedevs -r $(TARGET_DIR) \
-               target/default/device_table.txt
-       -@find $(TARGET_DIR) -type f -perm +111 | xargs $(STRIP) 2>/dev/null || true;
-       @rm -rf $(TARGET_DIR)/usr/man
-       @rm -rf $(TARGET_DIR)/usr/info
+               $(STAGING_DIR)/bin/makedevs \
+               -r $(TARGET_DIR) \
+               -d target/generic/device_table.txt
        # Use fakeroot to fake out mksquashfs per the previous fakery
-       $(STAGING_DIR)/usr/bin/fakeroot -i $(STAGING_DIR)/fakeroot.env -- \
+       $(STAGING_DIR)/usr/bin/fakeroot \
+               -i $(STAGING_DIR)/fakeroot.env \
+               -s $(STAGING_DIR)/fakeroot.env -- \
                $(SQUASHFS_DIR)/squashfs-tools/mksquashfs $(TARGET_DIR) \
                $(IMAGE).squashfs -noappend