1fe77cc04SRobert Mustacchi /* 2fe77cc04SRobert Mustacchi * This file and its contents are supplied under the terms of the 3fe77cc04SRobert Mustacchi * Common Development and Distribution License ("CDDL"), version 1.0. 4fe77cc04SRobert Mustacchi * You may only use this file in accordance with the terms of version 5fe77cc04SRobert Mustacchi * 1.0 of the CDDL. 6fe77cc04SRobert Mustacchi * 7fe77cc04SRobert Mustacchi * A full copy of the text of the CDDL should have accompanied this 8fe77cc04SRobert Mustacchi * source. A copy of the CDDL is also available via the Internet at 9fe77cc04SRobert Mustacchi * http://www.illumos.org/license/CDDL. 10fe77cc04SRobert Mustacchi */ 11fe77cc04SRobert Mustacchi 12fe77cc04SRobert Mustacchi 13fe77cc04SRobert Mustacchi /* 14fe77cc04SRobert Mustacchi * Copyright (c) 2012 Joyent, Inc. All rights reserved. 15fe77cc04SRobert Mustacchi * Use is subject to license terms. 16fe77cc04SRobert Mustacchi */ 17fe77cc04SRobert Mustacchi 18fe77cc04SRobert Mustacchi #include <sys/types.h> 19fe77cc04SRobert Mustacchi #include <sys/stat.h> 20fe77cc04SRobert Mustacchi #include <values.h> 21fe77cc04SRobert Mustacchi #include <fcntl.h> 22fe77cc04SRobert Mustacchi #include <errno.h> 23fe77cc04SRobert Mustacchi #include <string.h> 24fe77cc04SRobert Mustacchi #include <strings.h> 25fe77cc04SRobert Mustacchi #include <stdio.h> 26fe77cc04SRobert Mustacchi #include <stdlib.h> 27fe77cc04SRobert Mustacchi #include <unistd.h> 28fe77cc04SRobert Mustacchi #include <stropts.h> 29fe77cc04SRobert Mustacchi #include <zone.h> 30fe77cc04SRobert Mustacchi #include <libgen.h> 31fe77cc04SRobert Mustacchi #include <assert.h> 32fe77cc04SRobert Mustacchi 33fe77cc04SRobert Mustacchi #include <libipd.h> 34fe77cc04SRobert Mustacchi 35fe77cc04SRobert Mustacchi static char *g_pname; 36fe77cc04SRobert Mustacchi static char g_zonename[ZONENAME_MAX]; 37fe77cc04SRobert Mustacchi static zoneid_t g_zid; 38fe77cc04SRobert Mustacchi 39fe77cc04SRobert Mustacchi #define E_SUCCESS 0 40fe77cc04SRobert Mustacchi #define E_ERROR 1 41fe77cc04SRobert Mustacchi #define E_USAGE 2 42fe77cc04SRobert Mustacchi 43fe77cc04SRobert Mustacchi typedef int (*idc_cmd_func_t)(int, char *[]); 44fe77cc04SRobert Mustacchi typedef struct ipdadm_cmd { 45fe77cc04SRobert Mustacchi const char *idc_name; /* subcommand name */ 46fe77cc04SRobert Mustacchi idc_cmd_func_t idc_func; /* subcommand function */ 47fe77cc04SRobert Mustacchi const char *idc_usage; /* subcommand help */ 48fe77cc04SRobert Mustacchi } ipdadm_cmd_t; 49fe77cc04SRobert Mustacchi 50fe77cc04SRobert Mustacchi static int ipdadm_list(int, char *[]); 51fe77cc04SRobert Mustacchi static int ipdadm_info(int, char *[]); 52fe77cc04SRobert Mustacchi static int ipdadm_corrupt(int, char *[]); 53fe77cc04SRobert Mustacchi static int ipdadm_delay(int, char *[]); 54fe77cc04SRobert Mustacchi static int ipdadm_drop(int, char *[]); 55fe77cc04SRobert Mustacchi static int ipdadm_remove(int, char *[]); 56fe77cc04SRobert Mustacchi 57fe77cc04SRobert Mustacchi #define IPDADM_NCMDS 6 58fe77cc04SRobert Mustacchi static ipdadm_cmd_t ipdadm_cmds[] = { 59fe77cc04SRobert Mustacchi { "list", ipdadm_list, "list [-v]" }, 60fe77cc04SRobert Mustacchi { "info", ipdadm_info, "info" }, 61fe77cc04SRobert Mustacchi { "corrupt", ipdadm_corrupt, "corrupt <percentage>" }, 62fe77cc04SRobert Mustacchi { "delay", ipdadm_delay, "delay <microseconds>" }, 63fe77cc04SRobert Mustacchi { "drop", ipdadm_drop, "drop <percentage>" }, 64fe77cc04SRobert Mustacchi { "remove", ipdadm_remove, "remove [corrupt|delay|drop]" } 65fe77cc04SRobert Mustacchi }; 66fe77cc04SRobert Mustacchi 67fe77cc04SRobert Mustacchi static int 68fe77cc04SRobert Mustacchi usage(FILE *fp) 69fe77cc04SRobert Mustacchi { 70fe77cc04SRobert Mustacchi int ii; 71fe77cc04SRobert Mustacchi ipdadm_cmd_t *cmd; 72fe77cc04SRobert Mustacchi 73fe77cc04SRobert Mustacchi (void) fprintf(fp, "Usage: %s [-z zonename] subcommand " 74fe77cc04SRobert Mustacchi "[subcommand opts]\n\n", g_pname); 75fe77cc04SRobert Mustacchi (void) fprintf(fp, "Subcommands:\n"); 76fe77cc04SRobert Mustacchi for (ii = 0; ii < IPDADM_NCMDS; ii++) { 77fe77cc04SRobert Mustacchi cmd = &ipdadm_cmds[ii]; 78fe77cc04SRobert Mustacchi (void) fprintf(fp, "\t%s\n", cmd->idc_usage); 79fe77cc04SRobert Mustacchi } 80fe77cc04SRobert Mustacchi 81fe77cc04SRobert Mustacchi return (E_USAGE); 82fe77cc04SRobert Mustacchi } 83fe77cc04SRobert Mustacchi 84fe77cc04SRobert Mustacchi static void 85fe77cc04SRobert Mustacchi ipdadm_list_one(zoneid_t z, const ipd_config_t *icp, void *arg) 86fe77cc04SRobert Mustacchi { 87fe77cc04SRobert Mustacchi char zonename[ZONENAME_MAX]; 88fe77cc04SRobert Mustacchi int opt_v = (int)(intptr_t)arg; 89fe77cc04SRobert Mustacchi 90fe77cc04SRobert Mustacchi if (getzonenamebyid(z, zonename, sizeof (zonename)) < 0) 91fe77cc04SRobert Mustacchi (void) printf("%ld", z); 92fe77cc04SRobert Mustacchi else 93fe77cc04SRobert Mustacchi (void) printf("%s", zonename); 94fe77cc04SRobert Mustacchi 95fe77cc04SRobert Mustacchi if (!opt_v) { 96fe77cc04SRobert Mustacchi (void) printf("\n"); 97fe77cc04SRobert Mustacchi return; 98fe77cc04SRobert Mustacchi } 99fe77cc04SRobert Mustacchi 100fe77cc04SRobert Mustacchi (void) printf("\t%u\t%u\t%u\n", icp->ic_corrupt, icp->ic_drop, 101fe77cc04SRobert Mustacchi icp->ic_delay); 102fe77cc04SRobert Mustacchi } 103fe77cc04SRobert Mustacchi 104fe77cc04SRobert Mustacchi static int 105fe77cc04SRobert Mustacchi ipdadm_list(int argc, char *argv[]) 106fe77cc04SRobert Mustacchi { 107fe77cc04SRobert Mustacchi int opt_v = 0; 108fe77cc04SRobert Mustacchi int fd, rval; 109fe77cc04SRobert Mustacchi ipd_stathdl_t hdl; 110fe77cc04SRobert Mustacchi 111fe77cc04SRobert Mustacchi if (argc > 1) 112fe77cc04SRobert Mustacchi return (usage(stderr)); 113fe77cc04SRobert Mustacchi 114fe77cc04SRobert Mustacchi if (argc == 1) { 115fe77cc04SRobert Mustacchi if (strcmp(argv[0], "-v") == 0) 116fe77cc04SRobert Mustacchi ++opt_v; 117fe77cc04SRobert Mustacchi else 118fe77cc04SRobert Mustacchi return (usage(stderr)); 119fe77cc04SRobert Mustacchi } 120fe77cc04SRobert Mustacchi 121fe77cc04SRobert Mustacchi fd = ipd_open(NULL); 122*ceec9e14SKeith M Wesolowski if (fd < 0) { 123*ceec9e14SKeith M Wesolowski (void) fprintf(stderr, "%s: failed to open ipd ctl node: %s\n", 124*ceec9e14SKeith M Wesolowski g_pname, ipd_errmsg); 125*ceec9e14SKeith M Wesolowski return (E_ERROR); 126*ceec9e14SKeith M Wesolowski } 127fe77cc04SRobert Mustacchi rval = ipd_status_read(fd, &hdl); 128fe77cc04SRobert Mustacchi (void) ipd_close(fd); 129fe77cc04SRobert Mustacchi 130fe77cc04SRobert Mustacchi if (rval != 0) { 131fe77cc04SRobert Mustacchi (void) fprintf(stderr, "%s: failed to get list info: %s\n", 132fe77cc04SRobert Mustacchi g_pname, ipd_errmsg); 133fe77cc04SRobert Mustacchi return (E_ERROR); 134fe77cc04SRobert Mustacchi } 135fe77cc04SRobert Mustacchi 136fe77cc04SRobert Mustacchi ipd_status_foreach_zone(hdl, ipdadm_list_one, (void *)(intptr_t)opt_v); 137fe77cc04SRobert Mustacchi ipd_status_free(hdl); 138fe77cc04SRobert Mustacchi 139fe77cc04SRobert Mustacchi return (E_SUCCESS); 140fe77cc04SRobert Mustacchi } 141fe77cc04SRobert Mustacchi 142fe77cc04SRobert Mustacchi /*ARGSUSED*/ 143fe77cc04SRobert Mustacchi static int 144fe77cc04SRobert Mustacchi ipdadm_info(int argc, char *argv[]) 145fe77cc04SRobert Mustacchi { 146fe77cc04SRobert Mustacchi int rval, fd; 147fe77cc04SRobert Mustacchi ipd_stathdl_t hdl; 148fe77cc04SRobert Mustacchi ipd_config_t *icp; 149fe77cc04SRobert Mustacchi 150fe77cc04SRobert Mustacchi if (argc != 0) 151fe77cc04SRobert Mustacchi return (usage(stderr)); 152fe77cc04SRobert Mustacchi 153fe77cc04SRobert Mustacchi fd = ipd_open(NULL); 154*ceec9e14SKeith M Wesolowski if (fd < 0) { 155*ceec9e14SKeith M Wesolowski (void) fprintf(stderr, "%s: failed to open ipd ctl node: %s\n", 156*ceec9e14SKeith M Wesolowski g_pname, ipd_errmsg); 157*ceec9e14SKeith M Wesolowski return (E_ERROR); 158*ceec9e14SKeith M Wesolowski } 159fe77cc04SRobert Mustacchi rval = ipd_status_read(fd, &hdl); 160fe77cc04SRobert Mustacchi (void) ipd_close(fd); 161fe77cc04SRobert Mustacchi if (rval != 0) { 162fe77cc04SRobert Mustacchi (void) fprintf(stderr, "%s: failed to get info: %s\n", 163fe77cc04SRobert Mustacchi g_pname, ipd_errmsg); 164fe77cc04SRobert Mustacchi return (E_ERROR); 165fe77cc04SRobert Mustacchi } 166fe77cc04SRobert Mustacchi 167fe77cc04SRobert Mustacchi if (ipd_status_get_config(hdl, g_zid, &icp) != 0) { 168fe77cc04SRobert Mustacchi if (ipd_errno == EIPD_ZC_NOENT) { 169fe77cc04SRobert Mustacchi (void) printf("zone %s does not exist or has no " 170fe77cc04SRobert Mustacchi "ipd actions enabled\n", g_zonename); 171fe77cc04SRobert Mustacchi return (E_SUCCESS); 172fe77cc04SRobert Mustacchi } 173fe77cc04SRobert Mustacchi (void) fprintf(stderr, "%s: failed to get info: %s\n", 174fe77cc04SRobert Mustacchi g_pname, ipd_errmsg); 175fe77cc04SRobert Mustacchi return (E_ERROR); 176fe77cc04SRobert Mustacchi } 177fe77cc04SRobert Mustacchi 178fe77cc04SRobert Mustacchi (void) printf("ipd information for zone %s:\n", 179fe77cc04SRobert Mustacchi g_zonename); 180fe77cc04SRobert Mustacchi (void) printf("\tcorrupt:\t%u%% chance of packet corruption\n", 181fe77cc04SRobert Mustacchi icp->ic_corrupt); 182fe77cc04SRobert Mustacchi (void) printf("\tdrop:\t\t%u%% chance of packet drop\n", 183fe77cc04SRobert Mustacchi icp->ic_drop); 184fe77cc04SRobert Mustacchi (void) printf("\tdelay:\t\t%u microsecond delay per packet\n", 185fe77cc04SRobert Mustacchi icp->ic_delay); 186fe77cc04SRobert Mustacchi 187fe77cc04SRobert Mustacchi ipd_status_free(hdl); 188fe77cc04SRobert Mustacchi 189fe77cc04SRobert Mustacchi return (E_SUCCESS); 190fe77cc04SRobert Mustacchi } 191fe77cc04SRobert Mustacchi 192fe77cc04SRobert Mustacchi static long 193fe77cc04SRobert Mustacchi ipdadm_parse_long(const char *str, const char *name, long min, long max) 194fe77cc04SRobert Mustacchi { 195fe77cc04SRobert Mustacchi long val; 196fe77cc04SRobert Mustacchi char *end; 197fe77cc04SRobert Mustacchi 198fe77cc04SRobert Mustacchi errno = 0; 199fe77cc04SRobert Mustacchi val = strtol(str, &end, 10); 200fe77cc04SRobert Mustacchi if (errno != 0) { 201fe77cc04SRobert Mustacchi (void) fprintf(stderr, "%s: invalid value for %s: %s\n", 202fe77cc04SRobert Mustacchi g_pname, name, str); 203fe77cc04SRobert Mustacchi exit(E_ERROR); 204fe77cc04SRobert Mustacchi } 205fe77cc04SRobert Mustacchi 206fe77cc04SRobert Mustacchi /* 207fe77cc04SRobert Mustacchi * We want to make sure that we got the whole string. If not that's an 208fe77cc04SRobert Mustacchi * error. e.g. 23.42 should not be valid. 209fe77cc04SRobert Mustacchi */ 210fe77cc04SRobert Mustacchi if (*end != '\0') { 211fe77cc04SRobert Mustacchi (void) fprintf(stderr, "%s: %s value must be an integer\n", 212fe77cc04SRobert Mustacchi g_pname, name); 213fe77cc04SRobert Mustacchi exit(E_ERROR); 214fe77cc04SRobert Mustacchi } 215fe77cc04SRobert Mustacchi 216fe77cc04SRobert Mustacchi if (val < min || val > max) { 217fe77cc04SRobert Mustacchi (void) fprintf(stderr, "%s: %s value must be between %ld and " 218fe77cc04SRobert Mustacchi "%ld inclusive\n", g_pname, name, min, max); 219fe77cc04SRobert Mustacchi exit(E_ERROR); 220fe77cc04SRobert Mustacchi } 221fe77cc04SRobert Mustacchi 222fe77cc04SRobert Mustacchi return (val); 223fe77cc04SRobert Mustacchi } 224fe77cc04SRobert Mustacchi 225fe77cc04SRobert Mustacchi static int 226fe77cc04SRobert Mustacchi ipdadm_corrupt(int argc, char *argv[]) 227fe77cc04SRobert Mustacchi { 228fe77cc04SRobert Mustacchi int rval, fd; 229fe77cc04SRobert Mustacchi long val; 230fe77cc04SRobert Mustacchi ipd_config_t ic; 231fe77cc04SRobert Mustacchi 232fe77cc04SRobert Mustacchi if (argc != 1) { 233fe77cc04SRobert Mustacchi (void) fprintf(stderr, "%s: corrupt <percentage>\n", 234fe77cc04SRobert Mustacchi g_pname); 235fe77cc04SRobert Mustacchi return (usage(stderr)); 236fe77cc04SRobert Mustacchi } 237fe77cc04SRobert Mustacchi 238fe77cc04SRobert Mustacchi val = ipdadm_parse_long(argv[0], "corrupt", 0, 100); 239fe77cc04SRobert Mustacchi bzero(&ic, sizeof (ic)); 240fe77cc04SRobert Mustacchi ic.ic_mask = IPDM_CORRUPT; 241fe77cc04SRobert Mustacchi ic.ic_corrupt = val; 242fe77cc04SRobert Mustacchi 243fe77cc04SRobert Mustacchi fd = ipd_open(NULL); 244*ceec9e14SKeith M Wesolowski if (fd < 0) { 245*ceec9e14SKeith M Wesolowski (void) fprintf(stderr, "%s: failed to open ipd ctl node: %s\n", 246*ceec9e14SKeith M Wesolowski g_pname, ipd_errmsg); 247*ceec9e14SKeith M Wesolowski return (E_ERROR); 248*ceec9e14SKeith M Wesolowski } 249fe77cc04SRobert Mustacchi rval = ipd_ctl(fd, g_zid, &ic); 250fe77cc04SRobert Mustacchi (void) ipd_close(fd); 251fe77cc04SRobert Mustacchi 252fe77cc04SRobert Mustacchi if (rval != 0) { 253fe77cc04SRobert Mustacchi (void) fprintf(stderr, "%s: failed to change corrupt " 254fe77cc04SRobert Mustacchi "value: %s\n", g_pname, ipd_errmsg); 255fe77cc04SRobert Mustacchi return (E_ERROR); 256fe77cc04SRobert Mustacchi } 257fe77cc04SRobert Mustacchi 258fe77cc04SRobert Mustacchi return (E_SUCCESS); 259fe77cc04SRobert Mustacchi } 260fe77cc04SRobert Mustacchi 261fe77cc04SRobert Mustacchi static int 262fe77cc04SRobert Mustacchi ipdadm_delay(int argc, char *argv[]) 263fe77cc04SRobert Mustacchi { 264fe77cc04SRobert Mustacchi long val; 265fe77cc04SRobert Mustacchi int fd, rval; 266fe77cc04SRobert Mustacchi ipd_config_t ic; 267fe77cc04SRobert Mustacchi 268fe77cc04SRobert Mustacchi if (argc != 1) { 269fe77cc04SRobert Mustacchi (void) fprintf(stderr, "%s: delay <microseconds>\n", 270fe77cc04SRobert Mustacchi g_pname); 271fe77cc04SRobert Mustacchi return (usage(stderr)); 272fe77cc04SRobert Mustacchi } 273fe77cc04SRobert Mustacchi 274fe77cc04SRobert Mustacchi val = ipdadm_parse_long(argv[0], "delay", 0, MAXLONG); 275fe77cc04SRobert Mustacchi bzero(&ic, sizeof (ic)); 276fe77cc04SRobert Mustacchi ic.ic_mask = IPDM_DELAY; 277fe77cc04SRobert Mustacchi ic.ic_delay = val; 278fe77cc04SRobert Mustacchi 279fe77cc04SRobert Mustacchi fd = ipd_open(NULL); 280*ceec9e14SKeith M Wesolowski if (fd < 0) { 281*ceec9e14SKeith M Wesolowski (void) fprintf(stderr, "%s: failed to open ipd ctl node: %s\n", 282*ceec9e14SKeith M Wesolowski g_pname, ipd_errmsg); 283*ceec9e14SKeith M Wesolowski return (E_ERROR); 284*ceec9e14SKeith M Wesolowski } 285fe77cc04SRobert Mustacchi rval = ipd_ctl(fd, g_zid, &ic); 286fe77cc04SRobert Mustacchi (void) ipd_close(fd); 287fe77cc04SRobert Mustacchi 288fe77cc04SRobert Mustacchi if (rval != 0) { 289fe77cc04SRobert Mustacchi (void) fprintf(stderr, "%s: failed to change delay value: %s\n", 290fe77cc04SRobert Mustacchi g_pname, ipd_errmsg); 291fe77cc04SRobert Mustacchi return (E_ERROR); 292fe77cc04SRobert Mustacchi } 293fe77cc04SRobert Mustacchi 294fe77cc04SRobert Mustacchi return (E_SUCCESS); 295fe77cc04SRobert Mustacchi } 296fe77cc04SRobert Mustacchi 297fe77cc04SRobert Mustacchi static int 298fe77cc04SRobert Mustacchi ipdadm_drop(int argc, char *argv[]) 299fe77cc04SRobert Mustacchi { 300fe77cc04SRobert Mustacchi long val; 301fe77cc04SRobert Mustacchi int fd, rval; 302fe77cc04SRobert Mustacchi ipd_config_t ic; 303fe77cc04SRobert Mustacchi 304fe77cc04SRobert Mustacchi if (argc != 1) { 305fe77cc04SRobert Mustacchi (void) fprintf(stderr, "%s: drop <percentage>\n", 306fe77cc04SRobert Mustacchi g_pname); 307fe77cc04SRobert Mustacchi return (usage(stderr)); 308fe77cc04SRobert Mustacchi } 309fe77cc04SRobert Mustacchi 310fe77cc04SRobert Mustacchi val = ipdadm_parse_long(argv[0], "drop", 0, 100); 311fe77cc04SRobert Mustacchi bzero(&ic, sizeof (ic)); 312fe77cc04SRobert Mustacchi ic.ic_mask = IPDM_DROP; 313fe77cc04SRobert Mustacchi ic.ic_drop = val; 314fe77cc04SRobert Mustacchi 315fe77cc04SRobert Mustacchi fd = ipd_open(NULL); 316*ceec9e14SKeith M Wesolowski if (fd < 0) { 317*ceec9e14SKeith M Wesolowski (void) fprintf(stderr, "%s: failed to open ipd ctl node: %s\n", 318*ceec9e14SKeith M Wesolowski g_pname, ipd_errmsg); 319*ceec9e14SKeith M Wesolowski return (E_ERROR); 320*ceec9e14SKeith M Wesolowski } 321fe77cc04SRobert Mustacchi rval = ipd_ctl(fd, g_zid, &ic); 322fe77cc04SRobert Mustacchi (void) ipd_close(fd); 323fe77cc04SRobert Mustacchi 324fe77cc04SRobert Mustacchi if (rval != 0) { 325fe77cc04SRobert Mustacchi (void) fprintf(stderr, "%s: failed to change drop value: %s\n", 326fe77cc04SRobert Mustacchi g_pname, ipd_errmsg); 327fe77cc04SRobert Mustacchi return (E_ERROR); 328fe77cc04SRobert Mustacchi } 329fe77cc04SRobert Mustacchi 330fe77cc04SRobert Mustacchi return (E_SUCCESS); 331fe77cc04SRobert Mustacchi } 332fe77cc04SRobert Mustacchi 333fe77cc04SRobert Mustacchi static int 334fe77cc04SRobert Mustacchi ipdadm_remove_valid(const char *str) 335fe77cc04SRobert Mustacchi { 336fe77cc04SRobert Mustacchi if (strcmp(str, "corrupt") == 0) { 337fe77cc04SRobert Mustacchi return (IPDM_CORRUPT); 338fe77cc04SRobert Mustacchi } else if (strcmp(str, "drop") == 0) { 339fe77cc04SRobert Mustacchi return (IPDM_DROP); 340fe77cc04SRobert Mustacchi } else if (strcmp(str, "delay") == 0) { 341fe77cc04SRobert Mustacchi return (IPDM_DELAY); 342fe77cc04SRobert Mustacchi } 343fe77cc04SRobert Mustacchi 344fe77cc04SRobert Mustacchi return (0); 345fe77cc04SRobert Mustacchi } 346fe77cc04SRobert Mustacchi 347fe77cc04SRobert Mustacchi static int 348fe77cc04SRobert Mustacchi ipdadm_remove(int argc, char *argv[]) 349fe77cc04SRobert Mustacchi { 350fe77cc04SRobert Mustacchi ipd_config_t ic; 351fe77cc04SRobert Mustacchi char *cur, *res; 352fe77cc04SRobert Mustacchi int rval, fd; 353fe77cc04SRobert Mustacchi 354fe77cc04SRobert Mustacchi if (argc < 1) { 355fe77cc04SRobert Mustacchi (void) fprintf(stderr, "%s: remove <arguments>\n", 356fe77cc04SRobert Mustacchi g_pname); 357fe77cc04SRobert Mustacchi return (usage(stderr)); 358fe77cc04SRobert Mustacchi } 359fe77cc04SRobert Mustacchi 360fe77cc04SRobert Mustacchi if (argc > 1) { 361fe77cc04SRobert Mustacchi (void) fprintf(stderr, "%s: remove's arguments must be " 362fe77cc04SRobert Mustacchi "comma seperated\n", g_pname); 363fe77cc04SRobert Mustacchi return (E_ERROR); 364fe77cc04SRobert Mustacchi } 365fe77cc04SRobert Mustacchi 366fe77cc04SRobert Mustacchi bzero(&ic, sizeof (ic)); 367fe77cc04SRobert Mustacchi 368fe77cc04SRobert Mustacchi cur = argv[0]; 369fe77cc04SRobert Mustacchi while ((res = strchr(cur, ',')) != NULL) { 370fe77cc04SRobert Mustacchi *res = '\0'; 371fe77cc04SRobert Mustacchi if ((rval = ipdadm_remove_valid(cur)) == 0) { 372fe77cc04SRobert Mustacchi (void) fprintf(stderr, "%s: unknown remove " 373fe77cc04SRobert Mustacchi "argument: %s\n", g_pname, cur); 374fe77cc04SRobert Mustacchi return (E_ERROR); 375fe77cc04SRobert Mustacchi } 376fe77cc04SRobert Mustacchi ic.ic_mask |= rval; 377fe77cc04SRobert Mustacchi cur = res + 1; 378fe77cc04SRobert Mustacchi } 379fe77cc04SRobert Mustacchi 380fe77cc04SRobert Mustacchi if ((rval = ipdadm_remove_valid(cur)) == 0) { 381fe77cc04SRobert Mustacchi (void) fprintf(stderr, "%s: unknown remove argument: %s\n", 382fe77cc04SRobert Mustacchi g_pname, cur); 383fe77cc04SRobert Mustacchi return (E_ERROR); 384fe77cc04SRobert Mustacchi } 385fe77cc04SRobert Mustacchi ic.ic_mask |= rval; 386fe77cc04SRobert Mustacchi 387fe77cc04SRobert Mustacchi fd = ipd_open(NULL); 388*ceec9e14SKeith M Wesolowski if (fd < 0) { 389*ceec9e14SKeith M Wesolowski (void) fprintf(stderr, "%s: failed to open ipd ctl node: %s\n", 390*ceec9e14SKeith M Wesolowski g_pname, ipd_errmsg); 391*ceec9e14SKeith M Wesolowski return (E_ERROR); 392*ceec9e14SKeith M Wesolowski } 393fe77cc04SRobert Mustacchi rval = ipd_ctl(fd, g_zid, &ic); 394fe77cc04SRobert Mustacchi (void) ipd_close(fd); 395fe77cc04SRobert Mustacchi if (rval == -1) { 396fe77cc04SRobert Mustacchi (void) fprintf(stderr, "%s: failed to remove instances: %s\n", 397fe77cc04SRobert Mustacchi g_pname, ipd_errmsg); 398fe77cc04SRobert Mustacchi return (E_ERROR); 399fe77cc04SRobert Mustacchi } 400fe77cc04SRobert Mustacchi 401fe77cc04SRobert Mustacchi return (E_SUCCESS); 402fe77cc04SRobert Mustacchi } 403fe77cc04SRobert Mustacchi 404fe77cc04SRobert Mustacchi 405fe77cc04SRobert Mustacchi int 406fe77cc04SRobert Mustacchi main(int argc, char *argv[]) 407fe77cc04SRobert Mustacchi { 408fe77cc04SRobert Mustacchi int ii; 409fe77cc04SRobert Mustacchi ipdadm_cmd_t *cmd; 410fe77cc04SRobert Mustacchi 411fe77cc04SRobert Mustacchi g_pname = basename(argv[0]); 412fe77cc04SRobert Mustacchi 413fe77cc04SRobert Mustacchi if (argc < 2) 414fe77cc04SRobert Mustacchi return (usage(stderr)); 415fe77cc04SRobert Mustacchi argc--; 416fe77cc04SRobert Mustacchi argv++; 417fe77cc04SRobert Mustacchi 418fe77cc04SRobert Mustacchi g_zid = getzoneid(); 419fe77cc04SRobert Mustacchi if (strcmp("-z", argv[0]) == 0) { 420fe77cc04SRobert Mustacchi argc--; 421fe77cc04SRobert Mustacchi argv++; 422fe77cc04SRobert Mustacchi if (argc < 1) { 423fe77cc04SRobert Mustacchi (void) fprintf(stderr, "%s: -z requires an argument\n", 424fe77cc04SRobert Mustacchi g_pname); 425fe77cc04SRobert Mustacchi return (usage(stderr)); 426fe77cc04SRobert Mustacchi } 427fe77cc04SRobert Mustacchi 428fe77cc04SRobert Mustacchi if (g_zid != GLOBAL_ZONEID) { 429fe77cc04SRobert Mustacchi (void) fprintf(stderr, "%s: -z option only permitted " 430fe77cc04SRobert Mustacchi "in global zone\n", g_pname); 431fe77cc04SRobert Mustacchi return (usage(stderr)); 432fe77cc04SRobert Mustacchi } 433fe77cc04SRobert Mustacchi 434fe77cc04SRobert Mustacchi g_zid = getzoneidbyname(argv[0]); 435fe77cc04SRobert Mustacchi if (g_zid == -1) { 436fe77cc04SRobert Mustacchi (void) fprintf(stderr, "%s: %s: invalid zone\n", 437fe77cc04SRobert Mustacchi g_pname, argv[0]); 438fe77cc04SRobert Mustacchi return (E_ERROR); 439fe77cc04SRobert Mustacchi } 440fe77cc04SRobert Mustacchi argc--; 441fe77cc04SRobert Mustacchi argv++; 442fe77cc04SRobert Mustacchi } 443fe77cc04SRobert Mustacchi 444fe77cc04SRobert Mustacchi if (getzonenamebyid(g_zid, g_zonename, sizeof (g_zonename)) < 0) { 445fe77cc04SRobert Mustacchi (void) fprintf(stderr, "%s: failed to get zonename: %s\n", 446fe77cc04SRobert Mustacchi g_pname, strerror(errno)); 447fe77cc04SRobert Mustacchi return (E_ERROR); 448fe77cc04SRobert Mustacchi } 449fe77cc04SRobert Mustacchi 450fe77cc04SRobert Mustacchi if (argc < 1) 451fe77cc04SRobert Mustacchi return (usage(stderr)); 452fe77cc04SRobert Mustacchi 453fe77cc04SRobert Mustacchi for (ii = 0; ii < IPDADM_NCMDS; ii++) { 454fe77cc04SRobert Mustacchi cmd = &ipdadm_cmds[ii]; 455fe77cc04SRobert Mustacchi if (strcmp(argv[0], cmd->idc_name) == 0) { 456fe77cc04SRobert Mustacchi argv++; 457fe77cc04SRobert Mustacchi argc--; 458fe77cc04SRobert Mustacchi assert(cmd->idc_func != NULL); 459fe77cc04SRobert Mustacchi return (cmd->idc_func(argc, argv)); 460fe77cc04SRobert Mustacchi } 461fe77cc04SRobert Mustacchi } 462fe77cc04SRobert Mustacchi 463fe77cc04SRobert Mustacchi (void) fprintf(stderr, "%s: %s: unknown command\n", g_pname, argv[0]); 464fe77cc04SRobert Mustacchi return (usage(stderr)); 465fe77cc04SRobert Mustacchi } 466