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