xref: /titanic_51/usr/src/cmd/ipdadm/ipdadm.c (revision ceec9e142e4fe8e2388e7bd73fa65809ab1b0715)
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