setattr.c (4346B)
1 // $Id$ --*- c -*-- 2 3 // Copyright (C) 2004 Enrico Scholz <enrico.scholz@informatik.tu-chemnitz.de> 4 // 5 // This program is free software; you can redistribute it and/or modify 6 // it under the terms of the GNU General Public License as published by 7 // the Free Software Foundation; version 2 of the License. 8 // 9 // This program is distributed in the hope that it will be useful, 10 // but WITHOUT ANY WARRANTY; without even the implied warranty of 11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 // GNU General Public License for more details. 13 // 14 // You should have received a copy of the GNU General Public License 15 // along with this program; if not, write to the Free Software 16 // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 17 18 19 #ifdef HAVE_CONFIG_H 20 # include <config.h> 21 #endif 22 23 #include "fstool.h" 24 #include "util.h" 25 26 #include <lib/fmt.h> 27 #include <lib/vserver.h> 28 #include <lib/vserver-internal.h> 29 30 #include <stdio.h> 31 #include <sys/types.h> 32 #include <sys/stat.h> 33 #include <fcntl.h> 34 35 36 struct option const 37 CMDLINE_OPTIONS[] = { 38 { "help", no_argument, 0, CMD_HELP }, 39 { "version", no_argument, 0, CMD_VERSION }, 40 { "immu", no_argument, 0, CMD_IMMU }, 41 { "iunlink", no_argument, 0, CMD_IMMU }, 42 { "admin", no_argument, 0, CMD_ADMIN }, 43 { "watch", no_argument, 0, CMD_WATCH }, 44 { "hide", no_argument, 0, CMD_HIDE }, 45 { "barrier", no_argument, 0, CMD_BARRIER }, 46 { "~iunlink", no_argument, 0, CMD_UNSET_IMMU }, 47 { "!iunlink", no_argument, 0, CMD_UNSET_IMMU }, 48 { "~immu", no_argument, 0, CMD_UNSET_IMMU }, 49 { "!immu", no_argument, 0, CMD_UNSET_IMMU }, 50 { "~admin", no_argument, 0, CMD_UNSET_ADMIN }, 51 { "!admin", no_argument, 0, CMD_UNSET_ADMIN }, 52 { "~watch", no_argument, 0, CMD_UNSET_WATCH }, 53 { "!watch", no_argument, 0, CMD_UNSET_WATCH }, 54 { "~hide", no_argument, 0, CMD_UNSET_HIDE }, 55 { "!hide", no_argument, 0, CMD_UNSET_HIDE }, 56 { "~barrier", no_argument, 0, CMD_UNSET_BARRIER }, 57 { "!barrier", no_argument, 0, CMD_UNSET_BARRIER }, 58 { "iunlink-but-not-immutable", no_argument, 0, CMD_IMMUX }, 59 { "~iunlink-but-not-immutable", no_argument, 0, CMD_UNSET_IMMUX }, 60 { "!iunlink-but-not-immutable", no_argument, 0, CMD_UNSET_IMMUX }, 61 { "immutable", no_argument, 0, CMD_IMMUTABLE }, 62 { "~immutable", no_argument, 0, CMD_UNSET_IMMUTABLE }, 63 { "!immutable", no_argument, 0, CMD_UNSET_IMMUTABLE }, 64 { "write", no_argument, 0, CMD_WRITE }, 65 { "~write", no_argument, 0, CMD_UNSET_WRITE }, 66 { "!write", no_argument, 0, CMD_UNSET_WRITE }, 67 { "cow", no_argument, 0, CMD_COW }, 68 { "~cow", no_argument, 0, CMD_UNSET_COW }, 69 { "!cow", no_argument, 0, CMD_UNSET_COW }, 70 { "ixunlink", no_argument, 0, CMD_IMMUX }, 71 { "~ixunlink", no_argument, 0, CMD_UNSET_IMMUX }, 72 { "!ixunlink", no_argument, 0, CMD_UNSET_IMMUX }, 73 { "flags", required_argument, 0, CMD_FLAGS }, 74 { "~flags", required_argument, 0, CMD_UNSET_FLAGS }, 75 { 0,0,0,0 } 76 }; 77 78 char const CMDLINE_OPTIONS_SHORT[] = "Rx"; 79 80 void 81 showHelp(int fd, char const *cmd, int res) 82 { 83 WRITE_MSG(fd, "Usage: "); 84 WRITE_STR(fd, cmd); 85 WRITE_MSG(fd, 86 " [-Rx] [--[~](iunlink|admin|watch|hide|barrier|iunlink-but-not-immutable|immutable|write|cow|ixunlink)]* [--] <file>+\n\n" 87 " Options:\n" 88 " -R ... recurse through directories\n" 89 " -x ... do not cross filesystems\n\n" 90 "Please report bugs to " PACKAGE_BUGREPORT "\n"); 91 exit(res); 92 } 93 94 void 95 showVersion() 96 { 97 WRITE_MSG(1, 98 "setattr " VERSION " -- sets vserver specific file attributes\n" 99 "This program is part of " PACKAGE_STRING "\n\n" 100 "Copyright (C) 2004 Enrico Scholz\n" 101 VERSION_COPYRIGHT_DISCLAIMER); 102 exit(0); 103 } 104 105 void 106 fixupParams(struct Arguments * args, int argc) 107 { 108 if (optind==argc) { 109 WRITE_MSG(2, "No filename given; use '--help' for more information\n"); 110 exit(1); 111 } 112 113 args->do_display_dir = !args->do_recurse; 114 args->do_display_dot = true; 115 } 116 117 bool 118 handleFile(char const *name, char const * display_name) 119 { 120 int rc = vc_set_iattr(name, 121 0, 122 global_args->set_mask & ~global_args->del_mask, 123 global_args->set_mask | global_args->del_mask); 124 125 if (rc==-1) { 126 perror(display_name); 127 return false; 128 } 129 130 return true; 131 }