1*dbed73cbSSangeeta Misra /*
2*dbed73cbSSangeeta Misra  * CDDL HEADER START
3*dbed73cbSSangeeta Misra  *
4*dbed73cbSSangeeta Misra  * The contents of this file are subject to the terms of the
5*dbed73cbSSangeeta Misra  * Common Development and Distribution License (the "License").
6*dbed73cbSSangeeta Misra  * You may not use this file except in compliance with the License.
7*dbed73cbSSangeeta Misra  *
8*dbed73cbSSangeeta Misra  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9*dbed73cbSSangeeta Misra  * or http://www.opensolaris.org/os/licensing.
10*dbed73cbSSangeeta Misra  * See the License for the specific language governing permissions
11*dbed73cbSSangeeta Misra  * and limitations under the License.
12*dbed73cbSSangeeta Misra  *
13*dbed73cbSSangeeta Misra  * When distributing Covered Code, include this CDDL HEADER in each
14*dbed73cbSSangeeta Misra  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15*dbed73cbSSangeeta Misra  * If applicable, add the following below this CDDL HEADER, with the
16*dbed73cbSSangeeta Misra  * fields enclosed by brackets "[]" replaced with your own identifying
17*dbed73cbSSangeeta Misra  * information: Portions Copyright [yyyy] [name of copyright owner]
18*dbed73cbSSangeeta Misra  *
19*dbed73cbSSangeeta Misra  * CDDL HEADER END
20*dbed73cbSSangeeta Misra  */
21*dbed73cbSSangeeta Misra 
22*dbed73cbSSangeeta Misra /*
23*dbed73cbSSangeeta Misra  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
24*dbed73cbSSangeeta Misra  * Use is subject to license terms.
25*dbed73cbSSangeeta Misra  */
26*dbed73cbSSangeeta Misra 
27*dbed73cbSSangeeta Misra #include <stdio.h>
28*dbed73cbSSangeeta Misra #include <stdlib.h>
29*dbed73cbSSangeeta Misra #include <string.h>
30*dbed73cbSSangeeta Misra #include <unistd.h>
31*dbed73cbSSangeeta Misra #include <strings.h>
32*dbed73cbSSangeeta Misra #include <errno.h>
33*dbed73cbSSangeeta Misra #include <sys/types.h>
34*dbed73cbSSangeeta Misra #include <sys/socket.h>
35*dbed73cbSSangeeta Misra #include <sys/stat.h>
36*dbed73cbSSangeeta Misra #include <fcntl.h>
37*dbed73cbSSangeeta Misra #include <libilb.h>
38*dbed73cbSSangeeta Misra #include "ilbadm.h"
39*dbed73cbSSangeeta Misra 
40*dbed73cbSSangeeta Misra static ilbadm_cmd_help_t create_sg_help = {
41*dbed73cbSSangeeta Misra "[-s server=hostspec[:portspec...]] groupname"
42*dbed73cbSSangeeta Misra };
43*dbed73cbSSangeeta Misra 
44*dbed73cbSSangeeta Misra static ilbadm_cmd_help_t create_rule_help = {
45*dbed73cbSSangeeta Misra "[-e] [-p] -i vip=value,port=value[,protocol=value] \n"			\
46*dbed73cbSSangeeta Misra "	-m lbalg=value,type=value[,proxy-src=ip-range][,pmask=mask] \n"\
47*dbed73cbSSangeeta Misra "	-h hc-name=value[,hc-port=value]] \n"                           \
48*dbed73cbSSangeeta Misra "	[-t [conn-drain=N][,nat-timeout=N][,persist-timeout=N]] \n"     \
49*dbed73cbSSangeeta Misra "	-o servergroup=value name"
50*dbed73cbSSangeeta Misra };
51*dbed73cbSSangeeta Misra 
52*dbed73cbSSangeeta Misra static ilbadm_cmd_help_t destroy_rule_help = {
53*dbed73cbSSangeeta Misra "-a | name ..."
54*dbed73cbSSangeeta Misra };
55*dbed73cbSSangeeta Misra 
56*dbed73cbSSangeeta Misra static ilbadm_cmd_help_t add_server_help = {
57*dbed73cbSSangeeta Misra "-s server=value[,value ...] servergroup"
58*dbed73cbSSangeeta Misra };
59*dbed73cbSSangeeta Misra 
60*dbed73cbSSangeeta Misra static ilbadm_cmd_help_t remove_server_help = {
61*dbed73cbSSangeeta Misra "-s server=value[,value ...] servergroup"
62*dbed73cbSSangeeta Misra };
63*dbed73cbSSangeeta Misra 
64*dbed73cbSSangeeta Misra 
65*dbed73cbSSangeeta Misra static ilbadm_cmd_help_t disable_server_help = {
66*dbed73cbSSangeeta Misra "server ... "
67*dbed73cbSSangeeta Misra };
68*dbed73cbSSangeeta Misra 
69*dbed73cbSSangeeta Misra static ilbadm_cmd_help_t enable_server_help = {
70*dbed73cbSSangeeta Misra "server ..."
71*dbed73cbSSangeeta Misra };
72*dbed73cbSSangeeta Misra 
73*dbed73cbSSangeeta Misra static ilbadm_cmd_help_t enable_rule_help = {
74*dbed73cbSSangeeta Misra "[name ... ]"
75*dbed73cbSSangeeta Misra };
76*dbed73cbSSangeeta Misra 
77*dbed73cbSSangeeta Misra static ilbadm_cmd_help_t disable_rule_help = {
78*dbed73cbSSangeeta Misra "[name ... ]"
79*dbed73cbSSangeeta Misra };
80*dbed73cbSSangeeta Misra 
81*dbed73cbSSangeeta Misra static ilbadm_cmd_help_t show_server_help = {
82*dbed73cbSSangeeta Misra "[[-p] -o field[,field...]] [rulename ... ]"
83*dbed73cbSSangeeta Misra };
84*dbed73cbSSangeeta Misra 
85*dbed73cbSSangeeta Misra static ilbadm_cmd_help_t showstats_help = {
86*dbed73cbSSangeeta Misra "[-p] -o field[,...]] [-tdAvi]\n"				\
87*dbed73cbSSangeeta Misra "	[-r rulename|-s servername] [interval [count]]"
88*dbed73cbSSangeeta Misra };
89*dbed73cbSSangeeta Misra 
90*dbed73cbSSangeeta Misra static ilbadm_cmd_help_t show_nat_help = {
91*dbed73cbSSangeeta Misra "[count]"
92*dbed73cbSSangeeta Misra };
93*dbed73cbSSangeeta Misra 
94*dbed73cbSSangeeta Misra static ilbadm_cmd_help_t show_persist_help = {
95*dbed73cbSSangeeta Misra "[count]"
96*dbed73cbSSangeeta Misra };
97*dbed73cbSSangeeta Misra 
98*dbed73cbSSangeeta Misra static ilbadm_cmd_help_t show_hc_help = {
99*dbed73cbSSangeeta Misra "[hc-name]"
100*dbed73cbSSangeeta Misra };
101*dbed73cbSSangeeta Misra 
102*dbed73cbSSangeeta Misra static ilbadm_cmd_help_t create_hc_help = {
103*dbed73cbSSangeeta Misra "[-n] -h hc-test=value[,hc-timeout=value]\n"			\
104*dbed73cbSSangeeta Misra "	[,hc-count=value][,hc-interval=value] hcname"
105*dbed73cbSSangeeta Misra };
106*dbed73cbSSangeeta Misra 
107*dbed73cbSSangeeta Misra static ilbadm_cmd_help_t destroy_hc_help = {
108*dbed73cbSSangeeta Misra "name ..."
109*dbed73cbSSangeeta Misra };
110*dbed73cbSSangeeta Misra 
111*dbed73cbSSangeeta Misra static ilbadm_cmd_help_t show_hc_result_help = {
112*dbed73cbSSangeeta Misra "[rule-name]"
113*dbed73cbSSangeeta Misra };
114*dbed73cbSSangeeta Misra 
115*dbed73cbSSangeeta Misra static ilbadm_cmd_help_t show_rule_help = {
116*dbed73cbSSangeeta Misra "[-e|-d] [-f |[-p] -o key[,key ...]] [name ...]"
117*dbed73cbSSangeeta Misra };
118*dbed73cbSSangeeta Misra 
119*dbed73cbSSangeeta Misra static ilbadm_cmd_help_t destroy_servergroup_help = {
120*dbed73cbSSangeeta Misra "groupname"
121*dbed73cbSSangeeta Misra };
122*dbed73cbSSangeeta Misra 
123*dbed73cbSSangeeta Misra static ilbadm_cmd_help_t show_servergroup_help = {
124*dbed73cbSSangeeta Misra "[[-p] -o field[,field]] [name]"
125*dbed73cbSSangeeta Misra };
126*dbed73cbSSangeeta Misra 
127*dbed73cbSSangeeta Misra static ilbadm_cmd_help_t export_config_help = {
128*dbed73cbSSangeeta Misra "[filename]"
129*dbed73cbSSangeeta Misra };
130*dbed73cbSSangeeta Misra 
131*dbed73cbSSangeeta Misra static ilbadm_cmd_help_t import_config_help = {
132*dbed73cbSSangeeta Misra "[-p] [filename]"
133*dbed73cbSSangeeta Misra };
134*dbed73cbSSangeeta Misra static ilbadm_cmd_desc_t ilbadm_cmds[] = {
135*dbed73cbSSangeeta Misra 	{"create-rule", "create-rl", ilbadm_create_rule, &create_rule_help},
136*dbed73cbSSangeeta Misra 	{"delete-rule", "delete-rl", ilbadm_destroy_rule, &destroy_rule_help},
137*dbed73cbSSangeeta Misra 	{"enable-rule", "enable-rl", ilbadm_enable_rule, &enable_rule_help},
138*dbed73cbSSangeeta Misra 	{"disable-rule", "disable-rl", ilbadm_disable_rule,
139*dbed73cbSSangeeta Misra 	    &disable_rule_help},
140*dbed73cbSSangeeta Misra 	{"show-rule", "show-rl", ilbadm_show_rules, &show_rule_help},
141*dbed73cbSSangeeta Misra 
142*dbed73cbSSangeeta Misra 	{"create-servergroup", "create-sg", ilbadm_create_servergroup,
143*dbed73cbSSangeeta Misra 	    &create_sg_help},
144*dbed73cbSSangeeta Misra 	{"delete-servergroup", "delete-sg", ilbadm_destroy_servergroup,
145*dbed73cbSSangeeta Misra 	    &destroy_servergroup_help},
146*dbed73cbSSangeeta Misra 	{"show-servergroup", "show-sg", ilbadm_show_servergroups,
147*dbed73cbSSangeeta Misra 	    &show_servergroup_help},
148*dbed73cbSSangeeta Misra 
149*dbed73cbSSangeeta Misra 	{"add-server", "add-srv", ilbadm_add_server_to_group,
150*dbed73cbSSangeeta Misra 	    &add_server_help},
151*dbed73cbSSangeeta Misra 	{"remove-server", "remove-srv", ilbadm_rem_server_from_group,
152*dbed73cbSSangeeta Misra 	    &remove_server_help},
153*dbed73cbSSangeeta Misra 	{"disable-server", "disable-srv", ilbadm_disable_server,
154*dbed73cbSSangeeta Misra 	    &disable_server_help},
155*dbed73cbSSangeeta Misra 	{"enable-server", "enable-srv", ilbadm_enable_server,
156*dbed73cbSSangeeta Misra 	    &enable_server_help},
157*dbed73cbSSangeeta Misra 	{"show-server", "show-srv", ilbadm_show_server,
158*dbed73cbSSangeeta Misra 	    &show_server_help},
159*dbed73cbSSangeeta Misra 
160*dbed73cbSSangeeta Misra 	{"show-healthcheck", "show-hc", ilbadm_show_hc, &show_hc_help},
161*dbed73cbSSangeeta Misra 	{"create-healthcheck", "create-hc", ilbadm_create_hc, &create_hc_help},
162*dbed73cbSSangeeta Misra 	{"delete-healthcheck", "delete-hc", ilbadm_destroy_hc,
163*dbed73cbSSangeeta Misra 	    &destroy_hc_help},
164*dbed73cbSSangeeta Misra 	{"show-hc-result", "show-hc-res", ilbadm_show_hc_result,
165*dbed73cbSSangeeta Misra 	    &show_hc_result_help},
166*dbed73cbSSangeeta Misra 
167*dbed73cbSSangeeta Misra 	{"export-config", "export-cf", ilbadm_export, &export_config_help},
168*dbed73cbSSangeeta Misra 	{"import-config", "import-cf", ilbadm_noimport, &import_config_help},
169*dbed73cbSSangeeta Misra 
170*dbed73cbSSangeeta Misra 	{"show-statistics", "show-stats", ilbadm_show_stats, &showstats_help},
171*dbed73cbSSangeeta Misra 	{"show-nat", "show-nat", ilbadm_show_nat, &show_nat_help},
172*dbed73cbSSangeeta Misra 	{"show-persist", "show-pt", ilbadm_show_persist,
173*dbed73cbSSangeeta Misra 	    &show_persist_help},
174*dbed73cbSSangeeta Misra 	{"", "", NULL, NULL}
175*dbed73cbSSangeeta Misra };
176*dbed73cbSSangeeta Misra 
177*dbed73cbSSangeeta Misra 
178*dbed73cbSSangeeta Misra /* ARGSUSED */
179*dbed73cbSSangeeta Misra ilbadm_status_t
ilbadm_noimport(int argc,char * argv[])180*dbed73cbSSangeeta Misra ilbadm_noimport(int argc, char *argv[])
181*dbed73cbSSangeeta Misra {
182*dbed73cbSSangeeta Misra 	ilbadm_err(ilbadm_errstr(ILBADM_NORECURSIVE));
183*dbed73cbSSangeeta Misra 	return (ILBADM_LIBERR);
184*dbed73cbSSangeeta Misra }
185*dbed73cbSSangeeta Misra 
186*dbed73cbSSangeeta Misra static void
print_cmd_short(char * name,FILE * fp,ilbadm_cmd_desc_t * cmd)187*dbed73cbSSangeeta Misra print_cmd_short(char *name, FILE *fp, ilbadm_cmd_desc_t *cmd)
188*dbed73cbSSangeeta Misra {
189*dbed73cbSSangeeta Misra 	char	*h;
190*dbed73cbSSangeeta Misra 
191*dbed73cbSSangeeta Misra 	while (cmd->c_name[0] != '\0') {
192*dbed73cbSSangeeta Misra 		if (cmd->c_help != NULL &&
193*dbed73cbSSangeeta Misra 		    (h = cmd->c_help->h_help) != NULL)
194*dbed73cbSSangeeta Misra 			(void) fprintf(fp, "%s %s|%s %s\n", name,
195*dbed73cbSSangeeta Misra 			    cmd->c_name, cmd->c_alias, h);
196*dbed73cbSSangeeta Misra 		else
197*dbed73cbSSangeeta Misra 			(void) fprintf(fp, "%s %s|%s\n", name, cmd->c_name,
198*dbed73cbSSangeeta Misra 			    cmd->c_alias);
199*dbed73cbSSangeeta Misra 		cmd++;
200*dbed73cbSSangeeta Misra 	}
201*dbed73cbSSangeeta Misra }
202*dbed73cbSSangeeta Misra 
203*dbed73cbSSangeeta Misra void
print_cmdlist_short(char * name,FILE * fp)204*dbed73cbSSangeeta Misra print_cmdlist_short(char *name, FILE *fp)
205*dbed73cbSSangeeta Misra {
206*dbed73cbSSangeeta Misra 	print_cmd_short(name, fp, ilbadm_cmds);
207*dbed73cbSSangeeta Misra }
208*dbed73cbSSangeeta Misra 
209*dbed73cbSSangeeta Misra #define	IMPORT_FILE	0x1
210*dbed73cbSSangeeta Misra 
211*dbed73cbSSangeeta Misra static void
match_cmd(char * name,ilbadm_cmd_desc_t * cmds,cmdfunc_t * action,int flags)212*dbed73cbSSangeeta Misra match_cmd(char *name, ilbadm_cmd_desc_t *cmds, cmdfunc_t *action, int flags)
213*dbed73cbSSangeeta Misra {
214*dbed73cbSSangeeta Misra 	ilbadm_cmd_desc_t	*cmd;
215*dbed73cbSSangeeta Misra 
216*dbed73cbSSangeeta Misra 	if ((flags & IMPORT_FILE) == IMPORT_FILE) {
217*dbed73cbSSangeeta Misra 		if (strcasecmp(name, "export-config") == 0 ||
218*dbed73cbSSangeeta Misra 		    strcasecmp(name, "export-cf") == 0) {
219*dbed73cbSSangeeta Misra 			ilbadm_err(gettext("export from import file"
220*dbed73cbSSangeeta Misra 			    " not allowed"));
221*dbed73cbSSangeeta Misra 			exit(1);
222*dbed73cbSSangeeta Misra 		}
223*dbed73cbSSangeeta Misra 	}
224*dbed73cbSSangeeta Misra 
225*dbed73cbSSangeeta Misra 	for (cmd = &cmds[0]; cmd->c_name[0] != '\0'; cmd++) {
226*dbed73cbSSangeeta Misra 		if (strncasecmp(cmd->c_name, name, sizeof (cmd->c_name)) == 0 ||
227*dbed73cbSSangeeta Misra 		    strncasecmp(cmd->c_alias, name, sizeof (cmd->c_alias)) == 0)
228*dbed73cbSSangeeta Misra 			break;
229*dbed73cbSSangeeta Misra 	}
230*dbed73cbSSangeeta Misra 	*action = cmd->c_action;
231*dbed73cbSSangeeta Misra }
232*dbed73cbSSangeeta Misra 
233*dbed73cbSSangeeta Misra /*
234*dbed73cbSSangeeta Misra  * read and parse commandline
235*dbed73cbSSangeeta Misra  */
236*dbed73cbSSangeeta Misra static ilbadm_status_t
ilb_import_cmdline(int argc,char * argv[],int flags)237*dbed73cbSSangeeta Misra ilb_import_cmdline(int argc, char *argv[], int flags)
238*dbed73cbSSangeeta Misra {
239*dbed73cbSSangeeta Misra 	ilbadm_status_t	rc = ILBADM_OK;
240*dbed73cbSSangeeta Misra 	cmdfunc_t	cmd;
241*dbed73cbSSangeeta Misra 
242*dbed73cbSSangeeta Misra 	match_cmd(argv[0], ilbadm_cmds, &cmd, flags);
243*dbed73cbSSangeeta Misra 
244*dbed73cbSSangeeta Misra 	if (*cmd != NULL) {
245*dbed73cbSSangeeta Misra 		rc = cmd(argc, argv);
246*dbed73cbSSangeeta Misra 	} else {
247*dbed73cbSSangeeta Misra 		rc = ILBADM_INVAL_COMMAND;
248*dbed73cbSSangeeta Misra 		ilbadm_err(ilbadm_errstr(rc));
249*dbed73cbSSangeeta Misra 	}
250*dbed73cbSSangeeta Misra 
251*dbed73cbSSangeeta Misra 	return (rc);
252*dbed73cbSSangeeta Misra }
253*dbed73cbSSangeeta Misra 
254*dbed73cbSSangeeta Misra #define	CHUNK	10
255*dbed73cbSSangeeta Misra #define	LINESZ	1024
256*dbed73cbSSangeeta Misra 
257*dbed73cbSSangeeta Misra typedef struct {
258*dbed73cbSSangeeta Misra 	int	listsz;
259*dbed73cbSSangeeta Misra 	char	*arglist[1];
260*dbed73cbSSangeeta Misra } arg_t;
261*dbed73cbSSangeeta Misra 
262*dbed73cbSSangeeta Misra static int
i_getln_to_argv(FILE * fp,arg_t ** ap)263*dbed73cbSSangeeta Misra i_getln_to_argv(FILE *fp, arg_t **ap)
264*dbed73cbSSangeeta Misra {
265*dbed73cbSSangeeta Misra 	static char	*linebuf = NULL;
266*dbed73cbSSangeeta Misra 	char	*stringp, *currp;
267*dbed73cbSSangeeta Misra 	char	delim[] = " \t\n";
268*dbed73cbSSangeeta Misra 	int	i;
269*dbed73cbSSangeeta Misra 	arg_t	*a = *ap;
270*dbed73cbSSangeeta Misra 
271*dbed73cbSSangeeta Misra #define	STR_DIFF(s1, s2)	(int)((char *)s2 - (char *)s1)
272*dbed73cbSSangeeta Misra #define	STR_ADJ_SZ(sz, buf, s)	(sz - STR_DIFF(buf, s))
273*dbed73cbSSangeeta Misra 
274*dbed73cbSSangeeta Misra 	if (linebuf == NULL)
275*dbed73cbSSangeeta Misra 		if ((linebuf = (char *)malloc(LINESZ)) == NULL)
276*dbed73cbSSangeeta Misra 			return (0);
277*dbed73cbSSangeeta Misra 
278*dbed73cbSSangeeta Misra 	stringp = currp = linebuf;
279*dbed73cbSSangeeta Misra 	i = 0;
280*dbed73cbSSangeeta Misra read_next:
281*dbed73cbSSangeeta Misra 	if (fgets(currp, STR_ADJ_SZ(LINESZ, linebuf, currp), fp) == NULL)
282*dbed73cbSSangeeta Misra 		return (i);
283*dbed73cbSSangeeta Misra 
284*dbed73cbSSangeeta Misra 	/* ignore lines starting with a # character */
285*dbed73cbSSangeeta Misra 	if (*currp == '#')
286*dbed73cbSSangeeta Misra 		goto read_next;
287*dbed73cbSSangeeta Misra 
288*dbed73cbSSangeeta Misra 	for (; stringp != NULL && currp != NULL; i++) {
289*dbed73cbSSangeeta Misra 		currp = strsep(&stringp, delim);
290*dbed73cbSSangeeta Misra 		/*
291*dbed73cbSSangeeta Misra 		 * if there's more than one adjacent delimiters ...
292*dbed73cbSSangeeta Misra 		 */
293*dbed73cbSSangeeta Misra 		if (*currp == '\0') {
294*dbed73cbSSangeeta Misra 			i--;
295*dbed73cbSSangeeta Misra 			continue;
296*dbed73cbSSangeeta Misra 		}
297*dbed73cbSSangeeta Misra 		/*
298*dbed73cbSSangeeta Misra 		 * if we find a '\' at the end of a line, treat
299*dbed73cbSSangeeta Misra 		 * it as a continuation character.
300*dbed73cbSSangeeta Misra 		 */
301*dbed73cbSSangeeta Misra 		if (*currp == '\\' && stringp == NULL) {
302*dbed73cbSSangeeta Misra 			stringp = currp;
303*dbed73cbSSangeeta Misra 			goto read_next;
304*dbed73cbSSangeeta Misra 		}
305*dbed73cbSSangeeta Misra 		if (a == NULL) {
306*dbed73cbSSangeeta Misra 			a = (arg_t *)malloc(sizeof (*a));
307*dbed73cbSSangeeta Misra 			bzero(a, sizeof (*a));
308*dbed73cbSSangeeta Misra 		}
309*dbed73cbSSangeeta Misra 		if (a->listsz <= i) {
310*dbed73cbSSangeeta Misra 			int	sz;
311*dbed73cbSSangeeta Misra 
312*dbed73cbSSangeeta Misra 			a->listsz += CHUNK;
313*dbed73cbSSangeeta Misra 			sz = sizeof (*a) +
314*dbed73cbSSangeeta Misra 			    ((a->listsz - 1) * sizeof (a->arglist));
315*dbed73cbSSangeeta Misra 			a = (arg_t *)realloc(a, sz);
316*dbed73cbSSangeeta Misra 			*ap = a;
317*dbed73cbSSangeeta Misra 		}
318*dbed73cbSSangeeta Misra 		a->arglist[i] = currp;
319*dbed73cbSSangeeta Misra 	}
320*dbed73cbSSangeeta Misra 	return (i);
321*dbed73cbSSangeeta Misra }
322*dbed73cbSSangeeta Misra 
323*dbed73cbSSangeeta Misra static ilbadm_status_t
ilb_import_file(int fd,int flags)324*dbed73cbSSangeeta Misra ilb_import_file(int fd, int flags)
325*dbed73cbSSangeeta Misra {
326*dbed73cbSSangeeta Misra 	FILE		*fp;
327*dbed73cbSSangeeta Misra 	arg_t		*a = NULL;
328*dbed73cbSSangeeta Misra 	int		argcount;
329*dbed73cbSSangeeta Misra 	ilbadm_status_t	rc = ILBADM_OK;
330*dbed73cbSSangeeta Misra 
331*dbed73cbSSangeeta Misra 	if ((fp = fdopen(fd, "r")) == NULL) {
332*dbed73cbSSangeeta Misra 		ilbadm_err(gettext("cannot import file for reading"));
333*dbed73cbSSangeeta Misra 		exit(1);
334*dbed73cbSSangeeta Misra 	}
335*dbed73cbSSangeeta Misra 
336*dbed73cbSSangeeta Misra 	if ((flags & ILBADM_IMPORT_PRESERVE) == 0) {
337*dbed73cbSSangeeta Misra 		ilb_handle_t	h = ILB_INVALID_HANDLE;
338*dbed73cbSSangeeta Misra 		ilb_status_t	rclib;
339*dbed73cbSSangeeta Misra 
340*dbed73cbSSangeeta Misra 		rclib = ilb_open(&h);
341*dbed73cbSSangeeta Misra 		if (rclib == ILB_STATUS_OK)
342*dbed73cbSSangeeta Misra 			(void) ilb_reset_config(h);
343*dbed73cbSSangeeta Misra 		if (h != ILB_INVALID_HANDLE)
344*dbed73cbSSangeeta Misra 			(void) ilb_close(h);
345*dbed73cbSSangeeta Misra 	}
346*dbed73cbSSangeeta Misra 
347*dbed73cbSSangeeta Misra 	while ((argcount = i_getln_to_argv(fp, &a)) > 0) {
348*dbed73cbSSangeeta Misra 		optind = 1;
349*dbed73cbSSangeeta Misra 		rc = ilb_import_cmdline(argcount, a->arglist, IMPORT_FILE);
350*dbed73cbSSangeeta Misra 		if (rc != ILBADM_OK)
351*dbed73cbSSangeeta Misra 			break;
352*dbed73cbSSangeeta Misra 	}
353*dbed73cbSSangeeta Misra 
354*dbed73cbSSangeeta Misra 	return (rc);
355*dbed73cbSSangeeta Misra }
356*dbed73cbSSangeeta Misra 
357*dbed73cbSSangeeta Misra /*
358*dbed73cbSSangeeta Misra  * this is the wrapper around everything to do with importing and
359*dbed73cbSSangeeta Misra  * parsing either commandline or persistent storage.
360*dbed73cbSSangeeta Misra  * if (fd == -1), parse commandline, otherwise use the given fd as input.
361*dbed73cbSSangeeta Misra  */
362*dbed73cbSSangeeta Misra /* ARGSUSED */
363*dbed73cbSSangeeta Misra ilbadm_status_t
ilbadm_import(int fd,int argc,char * argv[],int flags)364*dbed73cbSSangeeta Misra ilbadm_import(int fd, int argc, char *argv[], int flags)
365*dbed73cbSSangeeta Misra {
366*dbed73cbSSangeeta Misra 	ilbadm_status_t	rc;
367*dbed73cbSSangeeta Misra 
368*dbed73cbSSangeeta Misra 	if (fd == -1)
369*dbed73cbSSangeeta Misra 		rc = ilb_import_cmdline(argc, argv, 0);
370*dbed73cbSSangeeta Misra 	else
371*dbed73cbSSangeeta Misra 		rc = ilb_import_file(fd, flags);
372*dbed73cbSSangeeta Misra 
373*dbed73cbSSangeeta Misra 	return (rc);
374*dbed73cbSSangeeta Misra }
375*dbed73cbSSangeeta Misra 
376*dbed73cbSSangeeta Misra ilbadm_status_t
ilbadm_export(int argc,char * argv[])377*dbed73cbSSangeeta Misra ilbadm_export(int argc, char *argv[])
378*dbed73cbSSangeeta Misra {
379*dbed73cbSSangeeta Misra 	ilb_handle_t	h = ILB_INVALID_HANDLE;
380*dbed73cbSSangeeta Misra 	ilbadm_status_t	rc = ILBADM_OK;
381*dbed73cbSSangeeta Misra 	ilb_status_t	rclib = ILB_STATUS_OK;
382*dbed73cbSSangeeta Misra 	int		fd;
383*dbed73cbSSangeeta Misra 	FILE		*fp;
384*dbed73cbSSangeeta Misra 	char		*fname = NULL;
385*dbed73cbSSangeeta Misra 	char		tmpfile[MAXPATHLEN];
386*dbed73cbSSangeeta Misra 
387*dbed73cbSSangeeta Misra 	if (argc < 2) {
388*dbed73cbSSangeeta Misra 		fd = 1; 	/* stdout */
389*dbed73cbSSangeeta Misra 		*tmpfile = '\0';
390*dbed73cbSSangeeta Misra 	} else {
391*dbed73cbSSangeeta Misra 		fname = argv[1];
392*dbed73cbSSangeeta Misra 		(void) snprintf(tmpfile, sizeof (tmpfile), "%sXXXXXX", fname);
393*dbed73cbSSangeeta Misra 		fd = mkstemp(tmpfile);
394*dbed73cbSSangeeta Misra 
395*dbed73cbSSangeeta Misra 		if (fd == -1) {
396*dbed73cbSSangeeta Misra 			ilbadm_err(gettext("cannot create working file"));
397*dbed73cbSSangeeta Misra 			exit(1);
398*dbed73cbSSangeeta Misra 		}
399*dbed73cbSSangeeta Misra 	}
400*dbed73cbSSangeeta Misra 	fp = fdopen(fd, "w");
401*dbed73cbSSangeeta Misra 	if (fp == NULL) {
402*dbed73cbSSangeeta Misra 		ilbadm_err(gettext("cannot open file for writing"), fd);
403*dbed73cbSSangeeta Misra 		exit(1);
404*dbed73cbSSangeeta Misra 	}
405*dbed73cbSSangeeta Misra 
406*dbed73cbSSangeeta Misra 	rclib = ilb_open(&h);
407*dbed73cbSSangeeta Misra 	if (rclib != ILB_STATUS_OK)
408*dbed73cbSSangeeta Misra 		goto out;
409*dbed73cbSSangeeta Misra 
410*dbed73cbSSangeeta Misra 	rc = ilbadm_export_servergroups(h, fp);
411*dbed73cbSSangeeta Misra 	if (rc != ILBADM_OK)
412*dbed73cbSSangeeta Misra 		goto out;
413*dbed73cbSSangeeta Misra 
414*dbed73cbSSangeeta Misra 	rc = ilbadm_export_hc(h, fp);
415*dbed73cbSSangeeta Misra 	if (rc != ILBADM_OK)
416*dbed73cbSSangeeta Misra 		goto out;
417*dbed73cbSSangeeta Misra 
418*dbed73cbSSangeeta Misra 	rc = ilbadm_export_rules(h, fp);
419*dbed73cbSSangeeta Misra 	if (rc != ILBADM_OK)
420*dbed73cbSSangeeta Misra 		goto out;
421*dbed73cbSSangeeta Misra 
422*dbed73cbSSangeeta Misra 	if (fname != NULL) {
423*dbed73cbSSangeeta Misra 		if (rename(tmpfile, fname) == -1) {
424*dbed73cbSSangeeta Misra 			ilbadm_err(gettext("cannot create %s: %s"), fname,
425*dbed73cbSSangeeta Misra 			    strerror(errno));
426*dbed73cbSSangeeta Misra 			exit(1);
427*dbed73cbSSangeeta Misra 		}
428*dbed73cbSSangeeta Misra 		*tmpfile = '\0';
429*dbed73cbSSangeeta Misra 	}
430*dbed73cbSSangeeta Misra 
431*dbed73cbSSangeeta Misra out:
432*dbed73cbSSangeeta Misra 	if (h != ILB_INVALID_HANDLE)
433*dbed73cbSSangeeta Misra 		(void) ilb_close(h);
434*dbed73cbSSangeeta Misra 
435*dbed73cbSSangeeta Misra 	if ((rc != ILBADM_OK) && (rc != ILBADM_LIBERR))
436*dbed73cbSSangeeta Misra 		ilbadm_err(ilbadm_errstr(rc));
437*dbed73cbSSangeeta Misra 	(void) fclose(fp);
438*dbed73cbSSangeeta Misra 	if (*tmpfile != '\0')
439*dbed73cbSSangeeta Misra 		(void) unlink(tmpfile);
440*dbed73cbSSangeeta Misra 	return (rc);
441*dbed73cbSSangeeta Misra }
442