X-Git-Url: http://git.linux-vserver.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Ffstool.c;h=34dc97689d4585734dc007c57f2f63ee5092b607;hb=HEAD;hp=63fb0443dac3ad0281af5de641fa3f6da50f7ef8;hpb=517fb954f46091a78f471435b7f284668138a2da;p=util-vserver.git diff --git a/src/fstool.c b/src/fstool.c index 63fb044..34dc976 100644 --- a/src/fstool.c +++ b/src/fstool.c @@ -182,39 +182,63 @@ int main(int argc, char *argv[]) .do_set = false, .do_unset = false, .local_fs = false, - .set_mask = 0, - .del_mask = 0 + .set_mask = 0, + .del_mask = 0, + .no_unified = false, }; global_args = &args; while (1) { int c = getopt_long(argc, argv, CMDLINE_OPTIONS_SHORT, CMDLINE_OPTIONS, 0); + long flags; + char *endptr; if (c==-1) break; switch (c) { case CMD_HELP : showHelp(1, argv[0], 0); case CMD_VERSION : showVersion(); case CMD_IMMU : args.set_mask |= VC_IATTR_IMMUTABLE; /*@fallthrough@*/ - case CMD_IMMUX : args.set_mask |= VC_IATTR_IUNLINK; break; - case CMD_ADMIN : args.set_mask |= VC_IATTR_ADMIN; break; - case CMD_WATCH : args.set_mask |= VC_IATTR_WATCH; break; - case CMD_HIDE : args.set_mask |= VC_IATTR_HIDE; break; - case CMD_BARRIER : args.set_mask |= VC_IATTR_BARRIER; break; + case CMD_IMMUX : args.set_mask |= VC_IATTR_IUNLINK; break; + case CMD_IMMUTABLE : args.set_mask |= VC_IATTR_IMMUTABLE; break; + case CMD_ADMIN : args.set_mask |= VC_IATTR_ADMIN; break; + case CMD_WATCH : args.set_mask |= VC_IATTR_WATCH; break; + case CMD_HIDE : args.set_mask |= VC_IATTR_HIDE; break; + case CMD_BARRIER : args.set_mask |= VC_IATTR_BARRIER; break; + case CMD_WRITE : args.set_mask |= VC_IATTR_WRITE; break; + case CMD_COW : args.set_mask |= VC_IATTR_COW; break; case CMD_UNSET_IMMU : args.del_mask |= VC_IATTR_IMMUTABLE; /*@fallthrough@*/ - case CMD_UNSET_IMMUX : args.del_mask |= VC_IATTR_IUNLINK; break; - case CMD_UNSET_ADMIN : args.del_mask |= VC_IATTR_ADMIN; break; - case CMD_UNSET_WATCH : args.del_mask |= VC_IATTR_WATCH; break; - case CMD_UNSET_HIDE : args.del_mask |= VC_IATTR_HIDE; break; - case CMD_UNSET_BARRIER : args.del_mask |= VC_IATTR_BARRIER; break; - case 'R' : args.do_recurse = true; break; - case 'a' : args.do_display_dot = true; break; - case 'd' : args.do_display_dir = true; break; - case 'n' : args.do_mapping = false; break; - case 's' : args.do_set = true; break; - case 'u' : args.do_unset = true; break; - case 'c' : args.ctx_str = optarg; break; - case 'x' : args.local_fs = true; break; + case CMD_UNSET_IMMUX : args.del_mask |= VC_IATTR_IUNLINK; break; + case CMD_UNSET_IMMUTABLE : args.del_mask |= VC_IATTR_IMMUTABLE; break; + case CMD_UNSET_ADMIN : args.del_mask |= VC_IATTR_ADMIN; break; + case CMD_UNSET_WATCH : args.del_mask |= VC_IATTR_WATCH; break; + case CMD_UNSET_HIDE : args.del_mask |= VC_IATTR_HIDE; break; + case CMD_UNSET_BARRIER : args.del_mask |= VC_IATTR_BARRIER; break; + case CMD_UNSET_WRITE : args.del_mask |= VC_IATTR_WRITE; break; + case CMD_UNSET_COW : args.del_mask |= VC_IATTR_COW; break; + case CMD_FLAGS : + case CMD_UNSET_FLAGS : + flags = strtoul(optarg, &endptr, 0); + if ((flags == 0 && errno != 0) || *endptr != '\0') { + WRITE_MSG(2, "Invalid flags argument: '"); + WRITE_STR(2, optarg); + WRITE_MSG(2, "'; try '--help' for more information\n"); + return EXIT_FAILURE; + } + if (c == CMD_FLAGS) + args.set_mask |= flags; + else + args.del_mask |= flags; + break; + case 'R' : args.do_recurse = true; break; + case 'a' : args.do_display_dot = true; break; + case 'd' : args.do_display_dir = true; break; + case 'n' : args.do_mapping = false; break; + case 's' : args.do_set = true; break; + case 'u' : args.do_unset = true; break; + case 'c' : args.ctx_str = optarg; break; + case 'x' : args.local_fs = true; break; + case 'U' : args.no_unified = true; break; default : WRITE_MSG(2, "Try '"); WRITE_STR(2, argv[0]);