X-Git-Url: http://git.archive.openwrt.org/?p=project%2Ffstools.git;a=blobdiff_plain;f=block.c;h=4d823e6bec562685c4b8770fab694f94271aa9dc;hp=a3db87bc936d782d5e8892f8be930e5a867299a2;hb=5b61e27d36e5bbf40825a4ae14920efe47d36f02;hpb=a5fa5b6144253726dcd7e769197eed787a723f5f diff --git a/block.c b/block.c index a3db87b..4d823e6 100644 --- a/block.c +++ b/block.c @@ -29,6 +29,8 @@ #include #include +#include + #include #include @@ -147,18 +149,6 @@ struct mount_flag { int32_t flag; }; -#ifndef MS_DIRSYNC -# define MS_DIRSYNC (1 << 7) -#endif - -#ifndef MS_RELATIME -# define MS_RELATIME (1 << 21) -#endif - -#ifndef MS_STRICTATIME -# define MS_STRICTATIME (1 << 24) -#endif - static const struct mount_flag mount_flags[] = { { "sync", MS_SYNCHRONOUS }, { "async", ~MS_SYNCHRONOUS }, @@ -180,6 +170,10 @@ static const struct mount_flag mount_flags[] = { { "relatime", MS_RELATIME }, { "norelatime", ~MS_RELATIME }, { "strictatime", MS_STRICTATIME }, + { "acl", MS_POSIXACL }, + { "noacl", ~MS_POSIXACL }, + { "nouser_xattr", MS_NOUSER }, + { "user_xattr", ~MS_NOUSER }, }; static char *blobmsg_get_strdup(struct blob_attr *attr) @@ -274,6 +268,13 @@ static int mount_add(struct uci_section *s) if (m->target && !strcmp(m->target, "/overlay")) m->extroot = m->overlay = 1; + if (m->target && *m->target != '/') { + ULOG_WARN("ignoring mount section %s due to invalid target '%s'\n", + s->e.name, m->target); + free(m); + return -1; + } + if (m->uuid) vlist_add(&mounts, &m->node, m->uuid); else if (m->label) @@ -505,7 +506,7 @@ static void cache_load(int mtd) if (mtd) { _cache_load("/dev/mtdblock*"); _cache_load("/dev/ubiblock*"); - _cache_load("/dev/ubi?*_?*"); + _cache_load("/dev/ubi[0-9]*"); } _cache_load("/dev/mmcblk*"); _cache_load("/dev/sd*"); @@ -620,32 +621,38 @@ static void check_filesystem(struct blkid_struct_probe *pr) { pid_t pid; struct stat statbuf; - char *e2fsck = "/usr/sbin/e2fsck"; + const char *e2fsck = "/usr/sbin/e2fsck"; + const char *dosfsck = "/usr/sbin/dosfsck"; + const char *ckfs; /* UBIFS does not need stuff like fsck */ if (!strncmp(pr->id->name, "ubifs", 5)) return; - if (strncmp(pr->id->name, "ext", 3)) { + if (!strncmp(pr->id->name, "vfat", 4)) { + ckfs = dosfsck; + } else if (!strncmp(pr->id->name, "ext", 3)) { + ckfs = e2fsck; + } else { ULOG_ERR("check_filesystem: %s is not supported\n", pr->id->name); return; } - if (stat(e2fsck, &statbuf) < 0) { - ULOG_ERR("check_filesystem: %s not found\n", e2fsck); + if (stat(ckfs, &statbuf) < 0) { + ULOG_ERR("check_filesystem: %s not found\n", ckfs); return; } pid = fork(); if (!pid) { - execl(e2fsck, e2fsck, "-p", pr->dev, NULL); + execl(ckfs, ckfs, "-p", pr->dev, NULL); exit(-1); } else if (pid > 0) { int status; waitpid(pid, &status, 0); if (WEXITSTATUS(status)) - ULOG_ERR("check_filesystem: %s returned %d\n", e2fsck, WEXITSTATUS(status)); + ULOG_ERR("check_filesystem: %s returned %d\n", ckfs, WEXITSTATUS(status)); } } @@ -969,7 +976,7 @@ static int check_extroot(char *path) char devpath[32]; #ifdef UBIFS_EXTROOT - if (find_block_mtd("rootfs", devpath, sizeof(devpath))) { + if (find_block_mtd("\"rootfs\"", devpath, sizeof(devpath))) { int err = -1; libubi_t libubi; @@ -980,7 +987,7 @@ static int check_extroot(char *path) return -1; } #else - if (find_block_mtd("rootfs", devpath, sizeof(devpath))) { + if (find_block_mtd("\"rootfs\"", devpath, sizeof(devpath))) { if (find_root_dev(devpath, sizeof(devpath))) { ULOG_ERR("extroot: unable to determine root device\n"); return -1; @@ -1094,7 +1101,8 @@ static int mount_extroot(char *cfg) if (check_fs) check_filesystem(pr); - err = mount(pr->dev, path, pr->id->name, 0, (m->options) ? (m->options) : ("")); + err = mount(pr->dev, path, pr->id->name, m->flags, + (m->options) ? (m->options) : ("")); if (err) { ULOG_ERR("extroot: mounting %s (%s) on %s failed: %d (%s)\n", @@ -1142,7 +1150,7 @@ static int main_extroot(int argc, char **argv) */ /* Start with looking for MTD partition */ - find_block_mtd("rootfs_data", blkdev_path, sizeof(blkdev_path)); + find_block_mtd("\"rootfs_data\"", blkdev_path, sizeof(blkdev_path)); if (blkdev_path[0]) { pr = find_block_info(NULL, NULL, blkdev_path); if (pr && !strcmp(pr->id->name, "jffs2")) { @@ -1304,7 +1312,7 @@ static int main_swapon(int argc, char **argv) return -1; } while (getline(&lineptr, &s, fp) > 0) - printf(lineptr); + printf("%s", lineptr); if (lineptr) free(lineptr); fclose(fp); @@ -1426,6 +1434,14 @@ int main(int argc, char **argv) if (!strcmp(argv[1], "umount")) return main_umount(argc, argv); + + if (!strcmp(argv[1], "remount")) { + int ret = main_umount(argc, argv); + + if (!ret) + ret = main_mount(argc, argv); + return ret; + } } ULOG_ERR("Usage: block \n");