X-Git-Url: http://git.linux-vserver.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=util-vserver%2Fsrc%2Fsetattr.c;h=03fb884f4a748fbc1f2f8eb610f6cff92b9a9ce5;hb=1171042cfba2870d05f6dcc771f6331fb5c9ad78;hp=3fc093e5efdff466f8e195c348d58202566d20de;hpb=8b8d663cd844948ab38f43b94540a62ab533cabd;p=util-vserver.git diff --git a/util-vserver/src/setattr.c b/util-vserver/src/setattr.c index 3fc093e..03fb884 100644 --- a/util-vserver/src/setattr.c +++ b/util-vserver/src/setattr.c @@ -37,15 +37,22 @@ struct option const CMDLINE_OPTIONS[] = { { "help", no_argument, 0, CMD_HELP }, { "version", no_argument, 0, CMD_VERSION }, - { "immutable", no_argument, 0, CMD_IMMUTABLE }, - { "immulink", no_argument, 0, CMD_IMMULINK }, + { "immu", no_argument, 0, CMD_IMMU }, + { "iunlink", no_argument, 0, CMD_IMMU }, + { "admin", no_argument, 0, CMD_ADMIN }, + { "watch", no_argument, 0, CMD_WATCH }, + { "hide", no_argument, 0, CMD_HIDE }, + { "barrier", no_argument, 0, CMD_BARRIER }, + { "~iunlink", no_argument, 0, CMD_UNSET_IMMU }, + { "~immu", no_argument, 0, CMD_UNSET_IMMU }, + { "~admin", no_argument, 0, CMD_UNSET_ADMIN }, + { "~watch", no_argument, 0, CMD_UNSET_WATCH }, + { "~hide", no_argument, 0, CMD_UNSET_HIDE }, + { "~barrier", no_argument, 0, CMD_UNSET_BARRIER }, { 0,0,0,0 } }; -char const CMDLINE_OPTIONS_SHORT[] = "Rsux"; - -static long set_mask = 0; -static long del_mask = VC_IMMUTABLE_ALL; +char const CMDLINE_OPTIONS_SHORT[] = "Rx"; void showHelp(int fd, char const *cmd, int res) @@ -53,12 +60,9 @@ showHelp(int fd, char const *cmd, int res) WRITE_MSG(fd, "Usage: "); WRITE_STR(fd, cmd); WRITE_MSG(fd, - " [-Rsux] [--immutable] [--immulink] [--] +\n\n" + " [-Rx] [--[~]iunlink] [--[~]admin] [--[~]watch] [--[~]hide] [--[~]barrier] [--] +\n\n" " Options:\n" " -R ... recurse through directories\n" - " -s ... set flag only; when only one of the '--immu*' options\n" - " is given, do not delete the other ones\n" - " -u ... revert operation and unset the given flags\n" " -x ... do not cross filesystems\n\n" "Please report bugs to " PACKAGE_BUGREPORT "\n"); exit(res); @@ -83,52 +87,23 @@ fixupParams(struct Arguments * args, int argc) exit(1); } - set_mask = 0; - if (args->immutable) set_mask |= VC_IMMUTABLE_FILE_FL; - if (args->immulink) set_mask |= VC_IMMUTABLE_LINK_FL; - - if (args->do_set) del_mask = 0; - else del_mask = VC_IMMUTABLE_ALL; - - if (args->do_unset) { - del_mask = set_mask; - set_mask = 0; - } -} - -static bool -setFlags(char const *name, char const *display_name, - struct stat const *exp_st) -{ - int fd = open(name, O_RDONLY); - int res = false; - - if (fd==-1) { - perror("open()"); - return false; - } - - if (!exp_st || - !checkForRace(fd, name, exp_st)) - goto err; - - if (vc_X_set_ext2flags(fd, set_mask, del_mask)==-1) { - perror(display_name); - goto err; - } - - res = true; - - err: - close(fd); - return res; + args->do_display_dir = !args->do_recurse; } bool handleFile(char const *name, char const * display_name, struct stat const *exp_st) { - if (!S_ISREG(exp_st->st_mode)) return true; + int rc = vc_set_iattr_compat(name, exp_st->st_dev, exp_st->st_ino, + 0, + global_args->set_mask & ~global_args->del_mask, + global_args->set_mask | global_args->del_mask, + &exp_st->st_mode); + + if (rc==-1) { + perror(display_name); + return false; + } - return setFlags(name, display_name, exp_st); + return true; }