X-Git-Url: http://git.linux-vserver.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Ftunctl.c;h=3f1c807d7b2fcee27e7426d2d8af2496d8924606;hb=148ab3024621f97b9cf95091657db2448098bc66;hp=ba695b593d107263e19ad50a12e0e1824d82ac5c;hpb=484920dab2064a18ca00f7b3335ae0417c8b4034;p=util-vserver.git diff --git a/src/tunctl.c b/src/tunctl.c index ba695b5..3f1c807 100644 --- a/src/tunctl.c +++ b/src/tunctl.c @@ -33,6 +33,21 @@ #include /* Make sure we have the necessary ioctls */ +#ifndef TUNSETNOCSUM +# define TUNSETNOCSUM _IOW('T', 200, int) +#endif +#ifndef TUNSETIFF +# define TUNSETIFF _IOW('T', 202, int) +#endif +#ifndef TUNSETPERSIST +# define TUNSETPERSIST _IOW('T', 203, int) +#endif +#ifndef TUNSETOWNER +# define TUNSETOWNER _IOW('T', 204, int) +#endif +#ifndef TUNSETLINK +# define TUNSETLINK _IOW('T', 205, int) +#endif #ifndef TUNSETGROUP # define TUNSETGROUP _IOW('T', 206, int) #endif @@ -61,24 +76,26 @@ #define CMD_LINKTYPE 0x0100 #define CMD_TUN 0x0200 #define CMD_TAP 0x0400 +#define CMD_NID_FAILURE_OK (0x0800 | CMD_NID) int wrapper_exit_code = 255; struct option const CMDLINE_OPTIONS[] = { - { "help", no_argument, 0, CMD_HELP }, - { "version", no_argument, 0, CMD_VERSION }, - { "nid", required_argument, 0, CMD_NID }, - { "device", required_argument, 0, CMD_DEVICE }, - { "persist", no_argument, 0, CMD_PERSIST }, - { "~persist", no_argument, 0, CMD_NOPERSIST }, - { "checksum", no_argument, 0, CMD_CSUM }, - { "~checksum", no_argument, 0, CMD_NOCSUM }, - { "uid", required_argument, 0, CMD_UID }, - { "gid", required_argument, 0, CMD_GID }, - { "linktype", required_argument, 0, CMD_LINKTYPE }, - { "tun", no_argument, 0, CMD_TUN }, - { "tap", no_argument, 0, CMD_TAP }, + { "help", no_argument, 0, CMD_HELP }, + { "version", no_argument, 0, CMD_VERSION }, + { "nid", required_argument, 0, CMD_NID }, + { "device", required_argument, 0, CMD_DEVICE }, + { "persist", no_argument, 0, CMD_PERSIST }, + { "~persist", no_argument, 0, CMD_NOPERSIST }, + { "checksum", no_argument, 0, CMD_CSUM }, + { "~checksum", no_argument, 0, CMD_NOCSUM }, + { "uid", required_argument, 0, CMD_UID }, + { "gid", required_argument, 0, CMD_GID }, + { "linktype", required_argument, 0, CMD_LINKTYPE }, + { "tun", no_argument, 0, CMD_TUN }, + { "tap", no_argument, 0, CMD_TAP }, + { "nid-failure-ok", required_argument, 0, CMD_NID_FAILURE_OK }, {0,0,0,0} }; @@ -134,18 +151,22 @@ doTunctl(struct Arguments *args, char *interface) ifr.ifr_flags = args->type; EioctlD(fd, TUNSETIFF, &ifr); - if (args->set & (CMD_PERSIST|CMD_NOPERSIST)) - EioctlD(fd, TUNSETPERSIST, (void *) (long) args->persist); if (args->set & (CMD_CSUM|CMD_NOCSUM)) EioctlD(fd, TUNSETNOCSUM, (void *) (long) !args->checksum); if (args->set & CMD_UID) EioctlD(fd, TUNSETOWNER, (void *) (long) args->uid); if (args->set & CMD_GID) EioctlD(fd, TUNSETGROUP, (void *) (long) args->gid); - if (args->set & CMD_NID) - EioctlD(fd, TUNSETNID, (void *) (long) args->nid); + if (args->set & CMD_NID) { + if (args->set & CMD_NID_FAILURE_OK) + ioctl(fd, TUNSETNID, (void *) (long) args->nid); + else + EioctlD(fd, TUNSETNID, (void *) (long) args->nid); + } if (args->set & CMD_LINKTYPE) EioctlD(fd, TUNSETLINK, (void *) (long) args->linktype); + if (args->set & (CMD_PERSIST|CMD_NOPERSIST)) + EioctlD(fd, TUNSETPERSIST, (void *) (long) args->persist); close(fd); } @@ -174,6 +195,7 @@ int main(int argc, char *argv[]) case CMD_HELP : showHelp(1, argv[0], 0); case CMD_VERSION : showVersion(); + case CMD_NID_FAILURE_OK: case CMD_NID : args.nid = Evc_nidopt2nid(optarg, true); break; case CMD_DEVICE : args.device = optarg; break; case CMD_PERSIST : args.persist = 1; break;