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
usage(FILE * fp)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
ipdadm_list_one(zoneid_t z,const ipd_config_t * icp,void * arg)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
ipdadm_list(int argc,char * argv[])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
ipdadm_info(int argc,char * argv[])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
ipdadm_parse_long(const char * str,const char * name,long min,long max)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
ipdadm_corrupt(int argc,char * argv[])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
ipdadm_delay(int argc,char * argv[])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
ipdadm_drop(int argc,char * argv[])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
ipdadm_remove_valid(const char * str)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
ipdadm_remove(int argc,char * argv[])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
main(int argc,char * argv[])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