xref: /titanic_51/usr/src/cmd/svr4pkg/pkgadm/main.c (revision 5c51f1241dbbdf2656d0e10011981411ed0c9673)
1*5c51f124SMoriah Waterland /*
2*5c51f124SMoriah Waterland  * CDDL HEADER START
3*5c51f124SMoriah Waterland  *
4*5c51f124SMoriah Waterland  * The contents of this file are subject to the terms of the
5*5c51f124SMoriah Waterland  * Common Development and Distribution License (the "License").
6*5c51f124SMoriah Waterland  * You may not use this file except in compliance with the License.
7*5c51f124SMoriah Waterland  *
8*5c51f124SMoriah Waterland  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9*5c51f124SMoriah Waterland  * or http://www.opensolaris.org/os/licensing.
10*5c51f124SMoriah Waterland  * See the License for the specific language governing permissions
11*5c51f124SMoriah Waterland  * and limitations under the License.
12*5c51f124SMoriah Waterland  *
13*5c51f124SMoriah Waterland  * When distributing Covered Code, include this CDDL HEADER in each
14*5c51f124SMoriah Waterland  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15*5c51f124SMoriah Waterland  * If applicable, add the following below this CDDL HEADER, with the
16*5c51f124SMoriah Waterland  * fields enclosed by brackets "[]" replaced with your own identifying
17*5c51f124SMoriah Waterland  * information: Portions Copyright [yyyy] [name of copyright owner]
18*5c51f124SMoriah Waterland  *
19*5c51f124SMoriah Waterland  * CDDL HEADER END
20*5c51f124SMoriah Waterland  */
21*5c51f124SMoriah Waterland 
22*5c51f124SMoriah Waterland /*
23*5c51f124SMoriah Waterland  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
24*5c51f124SMoriah Waterland  * Use is subject to license terms.
25*5c51f124SMoriah Waterland  */
26*5c51f124SMoriah Waterland 
27*5c51f124SMoriah Waterland 
28*5c51f124SMoriah Waterland /* unix system includes */
29*5c51f124SMoriah Waterland 
30*5c51f124SMoriah Waterland #include <stdio.h>
31*5c51f124SMoriah Waterland #include <stdarg.h>
32*5c51f124SMoriah Waterland #include <stdlib.h>
33*5c51f124SMoriah Waterland #include <string.h>
34*5c51f124SMoriah Waterland #include <sys/types.h>
35*5c51f124SMoriah Waterland #include <unistd.h>
36*5c51f124SMoriah Waterland #include <locale.h>
37*5c51f124SMoriah Waterland #include <sys/param.h>
38*5c51f124SMoriah Waterland #include <openssl/bio.h>
39*5c51f124SMoriah Waterland 
40*5c51f124SMoriah Waterland #include <pkglib.h>
41*5c51f124SMoriah Waterland #include <pkgerr.h>
42*5c51f124SMoriah Waterland #include <keystore.h>
43*5c51f124SMoriah Waterland #include "pkgadm.h"
44*5c51f124SMoriah Waterland #include "pkgadm_msgs.h"
45*5c51f124SMoriah Waterland 
46*5c51f124SMoriah Waterland /* initial error message buffer size */
47*5c51f124SMoriah Waterland 
48*5c51f124SMoriah Waterland #define	ERR_BUFSIZE		2048
49*5c51f124SMoriah Waterland 
50*5c51f124SMoriah Waterland /* Local Function Prototypes */
51*5c51f124SMoriah Waterland 
52*5c51f124SMoriah Waterland static void			print_version();
53*5c51f124SMoriah Waterland int				get_dbstatus(int argc, char **argv);
54*5c51f124SMoriah Waterland 
55*5c51f124SMoriah Waterland /* holds subcommands and their definitions */
56*5c51f124SMoriah Waterland struct cmd {
57*5c51f124SMoriah Waterland 	char		*c_name;
58*5c51f124SMoriah Waterland 	int		(*c_func)(int, char **);
59*5c51f124SMoriah Waterland };
60*5c51f124SMoriah Waterland 
61*5c51f124SMoriah Waterland struct cmd  cmds[] = {
62*5c51f124SMoriah Waterland 	{ "dbstatus",		get_dbstatus},
63*5c51f124SMoriah Waterland 	{ "lock",		admin_lock},
64*5c51f124SMoriah Waterland 	/* last one must be all NULLs */
65*5c51f124SMoriah Waterland 	{ NULL, NULL }
66*5c51f124SMoriah Waterland };
67*5c51f124SMoriah Waterland 
68*5c51f124SMoriah Waterland struct cmd cert_cmds[] = {
69*5c51f124SMoriah Waterland 	{ "addcert",		addcert},
70*5c51f124SMoriah Waterland 	{ "listcert",		listcert},
71*5c51f124SMoriah Waterland 	{ "removecert",		removecert},
72*5c51f124SMoriah Waterland 	/* last one must be all NULLs */
73*5c51f124SMoriah Waterland 	{ NULL, NULL }
74*5c51f124SMoriah Waterland };
75*5c51f124SMoriah Waterland 
76*5c51f124SMoriah Waterland 
77*5c51f124SMoriah Waterland /*
78*5c51f124SMoriah Waterland  * Function:	main
79*5c51f124SMoriah Waterland  *
80*5c51f124SMoriah Waterland  * Return:	0	- subprocessing successful
81*5c51f124SMoriah Waterland  *			  scripts and reboot
82*5c51f124SMoriah Waterland  *	[other]	- subprocessing-specific failure
83*5c51f124SMoriah Waterland  */
84*5c51f124SMoriah Waterland int
85*5c51f124SMoriah Waterland main(int argc, char **argv)
86*5c51f124SMoriah Waterland {
87*5c51f124SMoriah Waterland 	char	cur_cmd;
88*5c51f124SMoriah Waterland 	int	newargc;
89*5c51f124SMoriah Waterland 	char	**newargv;
90*5c51f124SMoriah Waterland 	int	i;
91*5c51f124SMoriah Waterland 
92*5c51f124SMoriah Waterland 	/* Should be defined by cc -D */
93*5c51f124SMoriah Waterland #if	!defined(TEXT_DOMAIN)
94*5c51f124SMoriah Waterland #define	TEXT_DOMAIN "SYS_TEST"
95*5c51f124SMoriah Waterland #endif
96*5c51f124SMoriah Waterland 
97*5c51f124SMoriah Waterland 	/* set the default text domain for messaging */
98*5c51f124SMoriah Waterland 	(void) setlocale(LC_ALL, "");
99*5c51f124SMoriah Waterland 	(void) textdomain(TEXT_DOMAIN);
100*5c51f124SMoriah Waterland 
101*5c51f124SMoriah Waterland 	if (getenv("PKGADM_VERBOSE")) {
102*5c51f124SMoriah Waterland 	    set_verbose(B_TRUE);
103*5c51f124SMoriah Waterland 	}
104*5c51f124SMoriah Waterland 
105*5c51f124SMoriah Waterland 	/* Superficial check of the arguments. */
106*5c51f124SMoriah Waterland 	if (argc <= 1) {
107*5c51f124SMoriah Waterland 		log_msg(LOG_MSG_INFO, MSG_USAGE);
108*5c51f124SMoriah Waterland 		return (1);
109*5c51f124SMoriah Waterland 	}
110*5c51f124SMoriah Waterland 
111*5c51f124SMoriah Waterland 	/* first, process any arguments that can appear before the subcommand */
112*5c51f124SMoriah Waterland 	while ((i = getopt(argc, argv, "vV?")) != EOF) {
113*5c51f124SMoriah Waterland 		switch (i) {
114*5c51f124SMoriah Waterland 		case 'v':	/* verbose mode enabled */
115*5c51f124SMoriah Waterland 			set_verbose(B_TRUE);
116*5c51f124SMoriah Waterland 			break;
117*5c51f124SMoriah Waterland 		case 'V':
118*5c51f124SMoriah Waterland 			print_version();
119*5c51f124SMoriah Waterland 			return (0);
120*5c51f124SMoriah Waterland 		case '?':
121*5c51f124SMoriah Waterland 			log_msg(LOG_MSG_INFO, MSG_USAGE);
122*5c51f124SMoriah Waterland 			return (0);
123*5c51f124SMoriah Waterland 		}
124*5c51f124SMoriah Waterland 	}
125*5c51f124SMoriah Waterland 
126*5c51f124SMoriah Waterland 	/* OK, hand it off to the subcommand processors */
127*5c51f124SMoriah Waterland 	for (cur_cmd = 0; cmds[cur_cmd].c_name != NULL; cur_cmd++) {
128*5c51f124SMoriah Waterland 		if (ci_streq(argv[optind], cmds[cur_cmd].c_name)) {
129*5c51f124SMoriah Waterland 			/* make subcommand the first option */
130*5c51f124SMoriah Waterland 			newargc = argc - optind;
131*5c51f124SMoriah Waterland 			newargv = argv + optind;
132*5c51f124SMoriah Waterland 			opterr = optind = 1; optopt = 0;
133*5c51f124SMoriah Waterland 			return (cmds[cur_cmd].c_func(newargc, newargv));
134*5c51f124SMoriah Waterland 		}
135*5c51f124SMoriah Waterland 	}
136*5c51f124SMoriah Waterland 
137*5c51f124SMoriah Waterland 	/* initialize security library */
138*5c51f124SMoriah Waterland 	sec_init();
139*5c51f124SMoriah Waterland 
140*5c51f124SMoriah Waterland 	/* OK, hand it off to the subcommand processors */
141*5c51f124SMoriah Waterland 	for (cur_cmd = 0; cert_cmds[cur_cmd].c_name != NULL; cur_cmd++) {
142*5c51f124SMoriah Waterland 		if (ci_streq(argv[optind], cert_cmds[cur_cmd].c_name)) {
143*5c51f124SMoriah Waterland 			/* make subcommand the first option */
144*5c51f124SMoriah Waterland 			newargc = argc - optind;
145*5c51f124SMoriah Waterland 			newargv = argv + optind;
146*5c51f124SMoriah Waterland 			opterr = optind = 1; optopt = 0;
147*5c51f124SMoriah Waterland 			return (cert_cmds[cur_cmd].c_func(newargc, newargv));
148*5c51f124SMoriah Waterland 		}
149*5c51f124SMoriah Waterland 	}
150*5c51f124SMoriah Waterland 
151*5c51f124SMoriah Waterland 	/* bad subcommand */
152*5c51f124SMoriah Waterland 	log_msg(LOG_MSG_ERR, MSG_BAD_SUB, argv[optind]);
153*5c51f124SMoriah Waterland 	log_msg(LOG_MSG_INFO, MSG_USAGE);
154*5c51f124SMoriah Waterland 	return (1);
155*5c51f124SMoriah Waterland }
156*5c51f124SMoriah Waterland 
157*5c51f124SMoriah Waterland /*
158*5c51f124SMoriah Waterland  * Name:	set_verbose
159*5c51f124SMoriah Waterland  * Description:	Turns on verbose output
160*5c51f124SMoriah Waterland  * Scope:	public
161*5c51f124SMoriah Waterland  * Arguments:	verbose = B_TRUE indicates verbose mode
162*5c51f124SMoriah Waterland  * Returns:	none
163*5c51f124SMoriah Waterland  */
164*5c51f124SMoriah Waterland void
165*5c51f124SMoriah Waterland set_verbose(boolean_t setting)
166*5c51f124SMoriah Waterland {
167*5c51f124SMoriah Waterland 	log_set_verbose(setting);
168*5c51f124SMoriah Waterland }
169*5c51f124SMoriah Waterland 
170*5c51f124SMoriah Waterland /*
171*5c51f124SMoriah Waterland  * Name:	get_verbose
172*5c51f124SMoriah Waterland  * Description:	Returns whether or not to output verbose messages
173*5c51f124SMoriah Waterland  * Scope:	public
174*5c51f124SMoriah Waterland  * Arguments:	none
175*5c51f124SMoriah Waterland  * Returns:	B_TRUE - verbose messages should be output
176*5c51f124SMoriah Waterland  */
177*5c51f124SMoriah Waterland boolean_t
178*5c51f124SMoriah Waterland get_verbose()
179*5c51f124SMoriah Waterland {
180*5c51f124SMoriah Waterland 	return (log_get_verbose());
181*5c51f124SMoriah Waterland }
182*5c51f124SMoriah Waterland 
183*5c51f124SMoriah Waterland /*
184*5c51f124SMoriah Waterland  * Name:	log_pkgerr
185*5c51f124SMoriah Waterland  * Description:	Outputs pkgerr messages to logging facility.
186*5c51f124SMoriah Waterland  * Scope:	public
187*5c51f124SMoriah Waterland  * Arguments:	type - the severity of the message
188*5c51f124SMoriah Waterland  *		err - error stack to dump to facility
189*5c51f124SMoriah Waterland  * Returns:	none
190*5c51f124SMoriah Waterland  */
191*5c51f124SMoriah Waterland void
192*5c51f124SMoriah Waterland log_pkgerr(LogMsgType type, PKG_ERR *err)
193*5c51f124SMoriah Waterland {
194*5c51f124SMoriah Waterland 	int i;
195*5c51f124SMoriah Waterland 	for (i = 0; i < pkgerr_num(err); i++) {
196*5c51f124SMoriah Waterland 		log_msg(type, "%s", pkgerr_get(err, i));
197*5c51f124SMoriah Waterland 	}
198*5c51f124SMoriah Waterland }
199*5c51f124SMoriah Waterland 
200*5c51f124SMoriah Waterland /*
201*5c51f124SMoriah Waterland  * Name:	print_Version
202*5c51f124SMoriah Waterland  * Desc:  Prints Version of packaging tools
203*5c51f124SMoriah Waterland  * Arguments: none
204*5c51f124SMoriah Waterland  * Returns: none
205*5c51f124SMoriah Waterland  */
206*5c51f124SMoriah Waterland static void
207*5c51f124SMoriah Waterland print_version()
208*5c51f124SMoriah Waterland {
209*5c51f124SMoriah Waterland 	/* ignore any and all arguments, print version only */
210*5c51f124SMoriah Waterland 	(void) fprintf(stdout, "%s\n", SUNW_PKGVERS);
211*5c51f124SMoriah Waterland }
212*5c51f124SMoriah Waterland 
213*5c51f124SMoriah Waterland /*
214*5c51f124SMoriah Waterland  * usage
215*5c51f124SMoriah Waterland  *
216*5c51f124SMoriah Waterland  * Outputs the usage string.
217*5c51f124SMoriah Waterland  *
218*5c51f124SMoriah Waterland  * Return:1
219*5c51f124SMoriah Waterland  * Side effects: none
220*5c51f124SMoriah Waterland  */
221*5c51f124SMoriah Waterland static int
222*5c51f124SMoriah Waterland usage()
223*5c51f124SMoriah Waterland {
224*5c51f124SMoriah Waterland 	log_msg(LOG_MSG_INFO, MSG_USAGE);
225*5c51f124SMoriah Waterland 	return (1);
226*5c51f124SMoriah Waterland }
227*5c51f124SMoriah Waterland 
228*5c51f124SMoriah Waterland /*
229*5c51f124SMoriah Waterland  * get_dbstatus
230*5c51f124SMoriah Waterland  *
231*5c51f124SMoriah Waterland  * Return 'text' as the db status.
232*5c51f124SMoriah Waterland  * Use the command line to determine if there is an alternate root.
233*5c51f124SMoriah Waterland  *
234*5c51f124SMoriah Waterland  * Return: 0 on success, nonzero on failure
235*5c51f124SMoriah Waterland  * Side effects: none
236*5c51f124SMoriah Waterland  */
237*5c51f124SMoriah Waterland int
238*5c51f124SMoriah Waterland get_dbstatus(int argc, char **argv)
239*5c51f124SMoriah Waterland {
240*5c51f124SMoriah Waterland 	/* Either accept 1 argument or 3 arguments where the second is -R */
241*5c51f124SMoriah Waterland 	if (argc != 1 && (argc != 3 || strcmp(argv[1], "-R")))
242*5c51f124SMoriah Waterland 		return (usage());
243*5c51f124SMoriah Waterland 
244*5c51f124SMoriah Waterland 	(void) printf("%s\n", PKGADM_DBSTATUS_TEXT);
245*5c51f124SMoriah Waterland 
246*5c51f124SMoriah Waterland 	return (0);
247*5c51f124SMoriah Waterland }
248