1 /*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
7 *
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
12 *
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
18 *
19 * CDDL HEADER END
20 */
21
22 /*
23 * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
24 * Use is subject to license terms.
25 */
26
27 /* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
28 /* All Rights Reserved */
29
30
31 #include <stdio.h>
32 #include <string.h>
33 #include <errno.h>
34 #include <limits.h>
35 #include <stdlib.h>
36 #include <unistd.h>
37 #include <sys/types.h>
38 #include <pkgstrct.h>
39 #include <pkginfo.h>
40 #include <locale.h>
41 #include <libintl.h>
42
43 #include <pkglib.h>
44 #include <libadm.h>
45 #include <libinst.h>
46
47 extern char *pkgfile;
48
49 #define ERR_ROOT_SET "Could not set install root from the environment."
50 #define ERR_ROOT_CMD "Command line install root contends with environment."
51 #define ERR_MESG "unable to locate parameter information for \"%s\""
52 #define ERR_FLT "parsing error in parameter file"
53 #define ERR_USAGE "usage:\n" \
54 "\t%s [-v] [-d device] pkginst [param [param ...]]\n" \
55 "\t%s [-v] -f file [param [param ...]]\n"
56 #define HASHSIZE 151
57 #define BSZ 4
58
59
60 static char *device = NULL;
61 static int errflg = 0;
62 static int vflag = 0;
63
64 static void print_entry(char *, char *);
65
66 static void
usage(void)67 usage(void)
68 {
69 char *prog = get_prog_name();
70
71 (void) fprintf(stderr, gettext(ERR_USAGE), prog, prog);
72 exit(1);
73 }
74
75 int
main(int argc,char * argv[])76 main(int argc, char *argv[])
77 {
78 char *value, *pkginst;
79 char *param, parambuf[128];
80 int c;
81
82 pkgfile = NULL;
83
84 /* initialize locale mechanism */
85
86 (void) setlocale(LC_ALL, "");
87
88 #if !defined(TEXT_DOMAIN) /* Should be defined by cc -D */
89 #define TEXT_DOMAIN "SYS_TEST"
90 #endif
91 (void) textdomain(TEXT_DOMAIN);
92
93 /* determine program name */
94
95 (void) set_prog_name(argv[0]);
96
97 /* establish installation root directory */
98
99 if (!set_inst_root(getenv("PKG_INSTALL_ROOT"))) {
100 progerr(gettext(ERR_ROOT_SET));
101 exit(1);
102 }
103
104 while ((c = getopt(argc, argv, "R:vd:f:?")) != EOF) {
105 switch (c) {
106 case 'v':
107 vflag++;
108 break;
109
110 case 'f':
111 /* -f could specify filename to get parameters from */
112 pkgfile = optarg;
113 break;
114
115 case 'd':
116 /* -d could specify stream or mountable device */
117 device = flex_device(optarg, 1);
118 break;
119
120 case 'R':
121 if (!set_inst_root(optarg)) {
122 progerr(gettext(ERR_ROOT_CMD));
123 exit(1);
124 }
125 break;
126
127 default:
128 case '?':
129 usage();
130 }
131 }
132
133 set_PKGpaths(get_inst_root());
134
135 if (pkgfile) {
136 if (device)
137 usage();
138 pkginst = pkgfile;
139 } else {
140 if ((optind+1) > argc)
141 usage();
142
143 if (pkghead(device))
144 return (1); /* couldn't obtain info about device */
145 pkginst = argv[optind++];
146 }
147
148 /* If a filename was specified or install db does not exist */
149 do {
150 param = argv[optind];
151 if (!param) {
152 param = parambuf;
153 *param = '\0';
154 }
155 value = pkgparam(pkginst, param);
156 if (value == NULL) {
157 if (errno == EFAULT) {
158 progerr(gettext(ERR_FLT));
159 errflg++;
160 break;
161 } else if (errno != EINVAL) {
162 /*
163 * some other error besides no value for this
164 * particular parameter
165 */
166 progerr(gettext(ERR_MESG), pkginst);
167 errflg++;
168 break;
169 }
170 if (!argv[optind])
171 break;
172 continue;
173 }
174
175 print_entry(param, value);
176
177 } while (!argv[optind] || (++optind < argc));
178 (void) pkgparam(NULL, NULL); /* close open FDs so umount won't fail */
179
180 (void) pkghead(NULL);
181 return (errflg ? 1 : 0);
182 }
183
184 static void
print_entry(char * param,char * value)185 print_entry(char *param, char *value)
186 {
187 if (vflag) {
188 (void) printf("%s='", param);
189 while (*value) {
190 if (*value == '\'') {
191 (void) printf("'\"'\"'");
192 value++;
193 } else
194 (void) putchar(*value++);
195 }
196 (void) printf("'\n");
197 } else
198 (void) printf("%s\n", value);
199 }
200
201 void
quit(int retval)202 quit(int retval)
203 {
204 exit(retval);
205 }
206