nattribute.c (5543B)
1 // $Id$ --*- c -*-- 2 3 // Copyright (C) 2004 Enrico Scholz <enrico.scholz@informatik.tu-chemnitz.de> 4 // Copyright (C) 2006 Daniel Hokka Zakrisson 5 // 6 // This program is free software; you can redistribute it and/or modify 7 // it under the terms of the GNU General Public License as published by 8 // the Free Software Foundation; version 2 of the License. 9 // 10 // This program is distributed in the hope that it will be useful, 11 // but WITHOUT ANY WARRANTY; without even the implied warranty of 12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 // GNU General Public License for more details. 14 // 15 // You should have received a copy of the GNU General Public License 16 // along with this program; if not, write to the Free Software 17 // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 18 19 20 #ifdef HAVE_CONFIG_H 21 # include <config.h> 22 #endif 23 24 #include "util.h" 25 #include "attribute-util.h" 26 #include <lib/vserver.h> 27 28 #include <getopt.h> 29 #include <stdint.h> 30 #include <errno.h> 31 32 #define ENSC_WRAPPERS_PREFIX "nattribute: " 33 #define ENSC_WRAPPERS_VSERVER 1 34 #define ENSC_WRAPPERS_UNISTD 1 35 #include <wrappers.h> 36 37 #define CMD_HELP 0x1000 38 #define CMD_VERSION 0x1001 39 #define CMD_NID 0x2000 40 #define CMD_SET 0x2001 41 #define CMD_CAP 0x2002 42 #define CMD_FLAG 0x2003 43 #define CMD_SECURE 0x2004 44 #define CMD_GET 0x2005 45 46 int wrapper_exit_code = 1; 47 48 struct option const 49 CMDLINE_OPTIONS[] = { 50 { "help", no_argument, 0, CMD_HELP }, 51 { "version", no_argument, 0, CMD_VERSION }, 52 { "nid", required_argument, 0, CMD_NID }, 53 { "set", no_argument, 0, CMD_SET }, 54 { "ncap", required_argument, 0, CMD_CAP }, 55 { "flag", required_argument, 0, CMD_FLAG }, 56 { "secure", no_argument, 0, CMD_SECURE }, 57 { "get", no_argument, 0, CMD_GET }, 58 {0,0,0,0} 59 }; 60 61 struct Arguments { 62 int mode; 63 nid_t nid; 64 struct vc_net_flags flags; 65 struct vc_net_caps caps; 66 }; 67 68 static void 69 showHelp(int fd, char const *cmd, int res) 70 { 71 WRITE_MSG(fd, "Usage:\n "); 72 WRITE_STR(fd, cmd); 73 WRITE_MSG(fd, 74 " {--set|--get} [--nid <nid>] [--ncap [~!]<ncap>] [--flag [~!]<flag>] [--secure] --\n" 75 " [<program> <args>*]\n" 76 "\n" 77 " --ncap <cap> ... network capability to be added\n" 78 " --flag <flag> ... network flag to be added\n" 79 "\n" 80 "Please report bugs to " PACKAGE_BUGREPORT "\n"); 81 82 exit(res); 83 } 84 85 static void 86 showVersion() 87 { 88 WRITE_MSG(1, 89 "nattribute " VERSION " -- sets/gets attributes of network contexts\n" 90 "This program is part of " PACKAGE_STRING "\n\n" 91 "Copyright (C) 2004 Enrico Scholz\n" 92 "Copyright (C) 2006 Daniel Hokka Zakrisson\n" 93 VERSION_COPYRIGHT_DISCLAIMER); 94 exit(0); 95 } 96 97 static void 98 parseFlags(char const *str, struct vc_net_flags *flags) 99 { 100 struct vc_err_listparser err; 101 int rc; 102 103 rc = vc_list2nflag(str, 0, &err, flags); 104 105 if (rc==-1) { 106 WRITE_MSG(2, "Unknown flag '"); 107 Vwrite(2, err.ptr, err.len); 108 WRITE_MSG(2, "'\n"); 109 exit(wrapper_exit_code); 110 } 111 } 112 113 static void 114 parseNCaps(char const *str, struct vc_net_caps *caps) 115 { 116 struct vc_err_listparser err; 117 int rc; 118 119 rc = vc_list2ncap(str,0, &err, caps); 120 121 if (rc==-1) { 122 WRITE_MSG(2, "Unknown ncap '"); 123 Vwrite(2, err.ptr, err.len); 124 WRITE_MSG(2, "'\n"); 125 exit(wrapper_exit_code); 126 } 127 } 128 129 static void 130 parseSecure(struct vc_net_flags * flags, 131 struct vc_net_caps * caps) 132 { 133 // TODO: generalize this 134 caps->ncaps = VC_NXC_RAW_ICMP; 135 caps->cmask = VC_NXC_RAW_ICMP; 136 137 flags->flagword = VC_NXF_HIDE_NETIF; 138 flags->mask = VC_NXF_HIDE_NETIF; 139 } 140 141 static int 142 printAttrs(struct Arguments *args) 143 { 144 struct vc_net_flags flags; 145 struct vc_net_caps caps; 146 147 Evc_get_nflags(args->nid, &flags); 148 Evc_get_ncaps(args->nid, &caps); 149 150 print_bitfield(1, ncap, "ncapabilities", &caps.ncaps); 151 print_bitfield(1, nflag, "nflags", &flags.flagword); 152 153 return 0; 154 } 155 156 int main(int argc, char *argv[]) 157 { 158 struct Arguments args = { 159 .mode = CMD_SET, 160 .nid = VC_NOCTX, 161 .flags = { .flagword = 0, .mask = 0 }, 162 .caps = { .ncaps = 0, .cmask = 0 }, 163 }; 164 165 while (1) { 166 int c = getopt_long(argc, argv, "+", CMDLINE_OPTIONS, 0); 167 if (c==-1) break; 168 169 switch (c) { 170 case CMD_HELP : showHelp(1, argv[0], 0); 171 case CMD_VERSION : showVersion(); 172 case CMD_SET : args.mode = CMD_SET; break; 173 case CMD_GET : args.mode = CMD_GET; break; 174 case CMD_NID : args.nid = Evc_nidopt2nid(optarg,true); break; 175 case CMD_FLAG : parseFlags(optarg, &args.flags); break; 176 case CMD_CAP : parseNCaps(optarg, &args.caps); break; 177 case CMD_SECURE : parseSecure(&args.flags, &args.caps); break; 178 default : 179 WRITE_MSG(2, "Try '"); 180 WRITE_STR(2, argv[0]); 181 WRITE_MSG(2, " --help' for more information.\n"); 182 return 255; 183 break; 184 } 185 } 186 187 if (args.nid==VC_NOCTX) args.nid = Evc_get_task_nid(0); 188 189 if (args.mode == CMD_SET) { 190 if (args.caps.cmask && 191 vc_set_ncaps(args.nid, &args.caps)==-1) 192 perror(ENSC_WRAPPERS_PREFIX "vc_set_ncaps()"); 193 else if (args.flags.mask && 194 vc_set_nflags(args.nid, &args.flags)==-1) 195 perror(ENSC_WRAPPERS_PREFIX "vc_set_nflags()"); 196 else if (optind<argc) 197 EexecvpD(argv[optind], argv+optind); 198 else 199 return EXIT_SUCCESS; 200 } 201 else if (args.mode == CMD_GET) { 202 printAttrs(&args); 203 if (optind<argc) 204 EexecvpD(argv[optind], argv+optind); 205 else 206 return EXIT_SUCCESS; 207 } 208 209 return EXIT_FAILURE; 210 }