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