19781SMoriah.Waterland@Sun.COM /*
29781SMoriah.Waterland@Sun.COM * CDDL HEADER START
39781SMoriah.Waterland@Sun.COM *
49781SMoriah.Waterland@Sun.COM * The contents of this file are subject to the terms of the
59781SMoriah.Waterland@Sun.COM * Common Development and Distribution License (the "License").
69781SMoriah.Waterland@Sun.COM * You may not use this file except in compliance with the License.
79781SMoriah.Waterland@Sun.COM *
89781SMoriah.Waterland@Sun.COM * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
99781SMoriah.Waterland@Sun.COM * or http://www.opensolaris.org/os/licensing.
109781SMoriah.Waterland@Sun.COM * See the License for the specific language governing permissions
119781SMoriah.Waterland@Sun.COM * and limitations under the License.
129781SMoriah.Waterland@Sun.COM *
139781SMoriah.Waterland@Sun.COM * When distributing Covered Code, include this CDDL HEADER in each
149781SMoriah.Waterland@Sun.COM * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
159781SMoriah.Waterland@Sun.COM * If applicable, add the following below this CDDL HEADER, with the
169781SMoriah.Waterland@Sun.COM * fields enclosed by brackets "[]" replaced with your own identifying
179781SMoriah.Waterland@Sun.COM * information: Portions Copyright [yyyy] [name of copyright owner]
189781SMoriah.Waterland@Sun.COM *
199781SMoriah.Waterland@Sun.COM * CDDL HEADER END
209781SMoriah.Waterland@Sun.COM */
219781SMoriah.Waterland@Sun.COM
229781SMoriah.Waterland@Sun.COM /*
239781SMoriah.Waterland@Sun.COM * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
249781SMoriah.Waterland@Sun.COM * Use is subject to license terms.
259781SMoriah.Waterland@Sun.COM */
269781SMoriah.Waterland@Sun.COM
279781SMoriah.Waterland@Sun.COM /* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
289781SMoriah.Waterland@Sun.COM /* All Rights Reserved */
299781SMoriah.Waterland@Sun.COM
309781SMoriah.Waterland@Sun.COM
319781SMoriah.Waterland@Sun.COM #include <stdio.h>
329781SMoriah.Waterland@Sun.COM #include <limits.h>
339781SMoriah.Waterland@Sun.COM #include <unistd.h>
349781SMoriah.Waterland@Sun.COM #include <stdlib.h>
359781SMoriah.Waterland@Sun.COM #include <string.h>
369781SMoriah.Waterland@Sun.COM #include <ctype.h>
379781SMoriah.Waterland@Sun.COM #include <dirent.h>
389781SMoriah.Waterland@Sun.COM #include <sys/stat.h>
399781SMoriah.Waterland@Sun.COM #include <pkginfo.h>
409781SMoriah.Waterland@Sun.COM #include <pkglocs.h>
419781SMoriah.Waterland@Sun.COM #include <sys/types.h>
429781SMoriah.Waterland@Sun.COM #include <pkgstrct.h>
439781SMoriah.Waterland@Sun.COM #include <pkgtrans.h>
449781SMoriah.Waterland@Sun.COM #include <locale.h>
459781SMoriah.Waterland@Sun.COM #include <libintl.h>
469781SMoriah.Waterland@Sun.COM #include <pkglib.h>
479781SMoriah.Waterland@Sun.COM #include <libadm.h>
489781SMoriah.Waterland@Sun.COM #include <libinst.h>
499781SMoriah.Waterland@Sun.COM
509781SMoriah.Waterland@Sun.COM #define MAXPATHS 1024
519781SMoriah.Waterland@Sun.COM
529781SMoriah.Waterland@Sun.COM #define MSG_CHK_STRM "Checking uninstalled stream format package " \
539781SMoriah.Waterland@Sun.COM "<%s> from <%s>\n"
549781SMoriah.Waterland@Sun.COM #define MSG_CHK_DIR "Checking uninstalled directory format package " \
559781SMoriah.Waterland@Sun.COM "<%s> from <%s>\n"
569781SMoriah.Waterland@Sun.COM #define MSG_NOTROOT "NOTE: \"root\" permission may be required to " \
579781SMoriah.Waterland@Sun.COM "validate all objects in the client filesystem."
589781SMoriah.Waterland@Sun.COM #define MSG_CONT "Continuing."
599781SMoriah.Waterland@Sun.COM
609781SMoriah.Waterland@Sun.COM #define WRN_F_SPOOL "WARNING: %s is spooled. Ignoring \"f\" argument"
619781SMoriah.Waterland@Sun.COM
629781SMoriah.Waterland@Sun.COM #define ERR_ROOT_SET "Could not set install root from the environment."
639781SMoriah.Waterland@Sun.COM #define ERR_ROOT_CMD "Command line install root contends with environment."
649781SMoriah.Waterland@Sun.COM #define ERR_IOPEN "unable to open input file <%s>"
659781SMoriah.Waterland@Sun.COM #define ERR_IEMPTY "no pathnames in file specified by -i option"
669781SMoriah.Waterland@Sun.COM #define ERR_POPTION "no pathname included with -p option"
679781SMoriah.Waterland@Sun.COM #define ERR_PARTIAL_POPTION "no pathname included with -P option"
689781SMoriah.Waterland@Sun.COM #define ERR_MAXPATHS "too many pathnames in option list (limit is %d)"
699781SMoriah.Waterland@Sun.COM #define ERR_NOTROOT "You must be \"root\" for \"%s -f\" to" \
709781SMoriah.Waterland@Sun.COM "execute properly."
719781SMoriah.Waterland@Sun.COM #define ERR_SEL_PKG "No packages selected for verification."
729781SMoriah.Waterland@Sun.COM #define ERR_CAT_LNGTH "The category argument exceeds the SVr4 ABI\n" \
739781SMoriah.Waterland@Sun.COM " defined maximum supported length of 16 characters."
749781SMoriah.Waterland@Sun.COM #define ERR_CAT_FND "Category argument <%s> cannot be found."
759781SMoriah.Waterland@Sun.COM #define ERR_CAT_INV "Category argument <%s> is invalid."
769781SMoriah.Waterland@Sun.COM #define ERR_TOO_MANY "too many pathnames in list, limit is %d"
779781SMoriah.Waterland@Sun.COM #define ERR_PATHS_INVALID "Pathnames in %s are not valid."
789781SMoriah.Waterland@Sun.COM #define ERR_MKDIR "unable to make directory <%s>"
799781SMoriah.Waterland@Sun.COM #define ERR_USAGE "usage:\n" \
809781SMoriah.Waterland@Sun.COM "\t%s [-l|vqacnxf] [-R rootdir] [-p path[, ...] | " \
819781SMoriah.Waterland@Sun.COM "-P path[, ...]]\n" \
829781SMoriah.Waterland@Sun.COM "\t\t[-i file] [options]\n" \
839781SMoriah.Waterland@Sun.COM "\t%s -d device [-f][-l|v] [-p path[, ...] | " \
849781SMoriah.Waterland@Sun.COM "-P path[, ...]]\n" \
859781SMoriah.Waterland@Sun.COM "\t\t[-V ...] [-M] [-i file] [-Y category[, ...] | " \
869781SMoriah.Waterland@Sun.COM "pkginst [...]]\n" \
879781SMoriah.Waterland@Sun.COM "\twhere options may include ONE of the " \
889781SMoriah.Waterland@Sun.COM "following:\n " \
899781SMoriah.Waterland@Sun.COM "\t\t-m pkgmap [-e envfile]\n" \
909781SMoriah.Waterland@Sun.COM "\t\tpkginst [...]\n" \
919781SMoriah.Waterland@Sun.COM "\t\t-Y category[, ...]\n"
929781SMoriah.Waterland@Sun.COM
939781SMoriah.Waterland@Sun.COM #define LINK 1
949781SMoriah.Waterland@Sun.COM
959781SMoriah.Waterland@Sun.COM char **pkg = NULL;
969781SMoriah.Waterland@Sun.COM int pkgcnt = 0;
979781SMoriah.Waterland@Sun.COM char *basedir;
989781SMoriah.Waterland@Sun.COM char *pathlist[MAXPATHS], *ppathlist[MAXPATHS], pkgspool[PATH_MAX];
999781SMoriah.Waterland@Sun.COM short used[MAXPATHS];
1009781SMoriah.Waterland@Sun.COM short npaths;
1019781SMoriah.Waterland@Sun.COM struct cfent **eptlist;
1029781SMoriah.Waterland@Sun.COM
1039781SMoriah.Waterland@Sun.COM int aflag = (-1);
1049781SMoriah.Waterland@Sun.COM int cflag = (-1);
1059781SMoriah.Waterland@Sun.COM int vflag = 0;
1069781SMoriah.Waterland@Sun.COM int nflag = 0;
1079781SMoriah.Waterland@Sun.COM int lflag = 0;
1089781SMoriah.Waterland@Sun.COM int Lflag = 0;
1099781SMoriah.Waterland@Sun.COM int fflag = 0;
1109781SMoriah.Waterland@Sun.COM int xflag = 0;
1119781SMoriah.Waterland@Sun.COM int qflag = 0;
1129781SMoriah.Waterland@Sun.COM int Rflag = 0;
1139781SMoriah.Waterland@Sun.COM int dflag = 0;
1149781SMoriah.Waterland@Sun.COM char *device;
1159781SMoriah.Waterland@Sun.COM
1169781SMoriah.Waterland@Sun.COM char *uniTmp;
1179781SMoriah.Waterland@Sun.COM
1189781SMoriah.Waterland@Sun.COM static char *mapfile,
1199781SMoriah.Waterland@Sun.COM *spooldir,
1209781SMoriah.Waterland@Sun.COM *tmpdir,
1219781SMoriah.Waterland@Sun.COM *envfile;
1229781SMoriah.Waterland@Sun.COM static int errflg = 0;
1239781SMoriah.Waterland@Sun.COM static int map_client = 1;
1249781SMoriah.Waterland@Sun.COM
1259781SMoriah.Waterland@Sun.COM void quit(int);
1269781SMoriah.Waterland@Sun.COM static void setpathlist(char *);
1279781SMoriah.Waterland@Sun.COM static void usage(void);
1289781SMoriah.Waterland@Sun.COM
1299781SMoriah.Waterland@Sun.COM extern char **environ;
1309781SMoriah.Waterland@Sun.COM extern char *pkgdir;
1319781SMoriah.Waterland@Sun.COM
1329781SMoriah.Waterland@Sun.COM /* checkmap.c */
1339781SMoriah.Waterland@Sun.COM extern int checkmap(int, int, char *, char *, char *, char *, int);
1349781SMoriah.Waterland@Sun.COM /* scriptvfy.c */
1359781SMoriah.Waterland@Sun.COM extern int checkscripts(char *inst_dir, int silent);
1369781SMoriah.Waterland@Sun.COM
1379781SMoriah.Waterland@Sun.COM int
main(int argc,char * argv[])1389781SMoriah.Waterland@Sun.COM main(int argc, char *argv[])
1399781SMoriah.Waterland@Sun.COM {
1409781SMoriah.Waterland@Sun.COM int pkgfmt = 0; /* Makes more sense as a pointer, but */
1419781SMoriah.Waterland@Sun.COM /* 18N is compromised. */
1429781SMoriah.Waterland@Sun.COM char file[PATH_MAX+1],
1439781SMoriah.Waterland@Sun.COM *abi_sym_ptr,
1449781SMoriah.Waterland@Sun.COM *vfstab_file = NULL;
1459781SMoriah.Waterland@Sun.COM char *all_pkgs[4] = {"all", NULL};
1469781SMoriah.Waterland@Sun.COM char **category = NULL;
1479781SMoriah.Waterland@Sun.COM char *catg_arg = NULL;
1489781SMoriah.Waterland@Sun.COM int c;
1499781SMoriah.Waterland@Sun.COM int n = 0;
1509781SMoriah.Waterland@Sun.COM char *prog,
1519781SMoriah.Waterland@Sun.COM *Rvalue,
1529781SMoriah.Waterland@Sun.COM *dvalue;
1539781SMoriah.Waterland@Sun.COM int dbcreate = 0;
1549781SMoriah.Waterland@Sun.COM int pathtype;
1559781SMoriah.Waterland@Sun.COM
1569781SMoriah.Waterland@Sun.COM /* initialize locale mechanism */
1579781SMoriah.Waterland@Sun.COM
1589781SMoriah.Waterland@Sun.COM (void) setlocale(LC_ALL, "");
1599781SMoriah.Waterland@Sun.COM
1609781SMoriah.Waterland@Sun.COM #if !defined(TEXT_DOMAIN) /* Should be defined by cc -D */
1619781SMoriah.Waterland@Sun.COM #define TEXT_DOMAIN "SYS_TEST"
1629781SMoriah.Waterland@Sun.COM #endif
1639781SMoriah.Waterland@Sun.COM (void) textdomain(TEXT_DOMAIN);
1649781SMoriah.Waterland@Sun.COM
1659781SMoriah.Waterland@Sun.COM /* determine program name */
1669781SMoriah.Waterland@Sun.COM
1679781SMoriah.Waterland@Sun.COM prog = set_prog_name(argv[0]);
1689781SMoriah.Waterland@Sun.COM
1699781SMoriah.Waterland@Sun.COM /* establish installation root directory */
1709781SMoriah.Waterland@Sun.COM
1719781SMoriah.Waterland@Sun.COM if (!set_inst_root(getenv("PKG_INSTALL_ROOT"))) {
1729781SMoriah.Waterland@Sun.COM progerr(gettext(ERR_ROOT_SET));
1739781SMoriah.Waterland@Sun.COM quit(1);
1749781SMoriah.Waterland@Sun.COM }
1759781SMoriah.Waterland@Sun.COM
1769781SMoriah.Waterland@Sun.COM /* check if not ABI compliant mode */
1779781SMoriah.Waterland@Sun.COM abi_sym_ptr = getenv("PKG_NONABI_SYMLINKS");
1789781SMoriah.Waterland@Sun.COM if (abi_sym_ptr && strncasecmp(abi_sym_ptr, "TRUE", 4) == 0) {
1799781SMoriah.Waterland@Sun.COM set_nonABI_symlinks();
1809781SMoriah.Waterland@Sun.COM }
1819781SMoriah.Waterland@Sun.COM
1829781SMoriah.Waterland@Sun.COM /* bugId 4012147 */
1839781SMoriah.Waterland@Sun.COM if ((uniTmp = getenv("PKG_NO_UNIFIED")) != NULL)
1849781SMoriah.Waterland@Sun.COM map_client = 0;
1859781SMoriah.Waterland@Sun.COM
1869781SMoriah.Waterland@Sun.COM while ((c = getopt(argc, argv, "Y:R:e:p:d:nLli:vaV:Mm:cqxfQP:?"))
1879781SMoriah.Waterland@Sun.COM != EOF) {
1889781SMoriah.Waterland@Sun.COM switch (c) {
1899781SMoriah.Waterland@Sun.COM case 'p':
1909781SMoriah.Waterland@Sun.COM pathlist[npaths] = strtok(optarg, " , ");
1919781SMoriah.Waterland@Sun.COM if (pathlist[npaths++] == NULL) {
1929781SMoriah.Waterland@Sun.COM progerr(gettext(ERR_POPTION));
1939781SMoriah.Waterland@Sun.COM quit(1);
1949781SMoriah.Waterland@Sun.COM }
1959781SMoriah.Waterland@Sun.COM while (pathlist[npaths] = strtok(NULL, " , ")) {
1969781SMoriah.Waterland@Sun.COM if (npaths++ >= MAXPATHS) {
1979781SMoriah.Waterland@Sun.COM progerr(gettext(ERR_MAXPATHS),
1989781SMoriah.Waterland@Sun.COM MAXPATHS);
1999781SMoriah.Waterland@Sun.COM quit(1);
2009781SMoriah.Waterland@Sun.COM }
2019781SMoriah.Waterland@Sun.COM }
2029781SMoriah.Waterland@Sun.COM break;
2039781SMoriah.Waterland@Sun.COM
2049781SMoriah.Waterland@Sun.COM case 'd':
2059781SMoriah.Waterland@Sun.COM dvalue = optarg;
2069781SMoriah.Waterland@Sun.COM dflag = 1;
2079781SMoriah.Waterland@Sun.COM break;
2089781SMoriah.Waterland@Sun.COM
2099781SMoriah.Waterland@Sun.COM case 'n':
2109781SMoriah.Waterland@Sun.COM nflag++;
2119781SMoriah.Waterland@Sun.COM break;
2129781SMoriah.Waterland@Sun.COM
2139781SMoriah.Waterland@Sun.COM case 'M':
2149781SMoriah.Waterland@Sun.COM map_client = 0;
2159781SMoriah.Waterland@Sun.COM break;
2169781SMoriah.Waterland@Sun.COM
2179781SMoriah.Waterland@Sun.COM /*
2189781SMoriah.Waterland@Sun.COM * Allow admin to establish the client filesystem using a
2199781SMoriah.Waterland@Sun.COM * vfstab-like file of stable format.
2209781SMoriah.Waterland@Sun.COM */
2219781SMoriah.Waterland@Sun.COM case 'V':
2229781SMoriah.Waterland@Sun.COM vfstab_file = flex_device(optarg, 2);
2239781SMoriah.Waterland@Sun.COM map_client = 1;
2249781SMoriah.Waterland@Sun.COM break;
2259781SMoriah.Waterland@Sun.COM
2269781SMoriah.Waterland@Sun.COM case 'f':
2279781SMoriah.Waterland@Sun.COM if (getuid()) {
2289781SMoriah.Waterland@Sun.COM progerr(gettext(ERR_NOTROOT), prog);
2299781SMoriah.Waterland@Sun.COM quit(1);
2309781SMoriah.Waterland@Sun.COM }
2319781SMoriah.Waterland@Sun.COM fflag++;
2329781SMoriah.Waterland@Sun.COM break;
2339781SMoriah.Waterland@Sun.COM
2349781SMoriah.Waterland@Sun.COM case 'i':
2359781SMoriah.Waterland@Sun.COM setpathlist(optarg);
2369781SMoriah.Waterland@Sun.COM break;
2379781SMoriah.Waterland@Sun.COM
2389781SMoriah.Waterland@Sun.COM case 'v':
2399781SMoriah.Waterland@Sun.COM vflag++;
2409781SMoriah.Waterland@Sun.COM break;
2419781SMoriah.Waterland@Sun.COM
2429781SMoriah.Waterland@Sun.COM case 'l':
2439781SMoriah.Waterland@Sun.COM lflag++;
2449781SMoriah.Waterland@Sun.COM break;
2459781SMoriah.Waterland@Sun.COM
2469781SMoriah.Waterland@Sun.COM case 'L':
2479781SMoriah.Waterland@Sun.COM Lflag++;
2489781SMoriah.Waterland@Sun.COM break;
2499781SMoriah.Waterland@Sun.COM
2509781SMoriah.Waterland@Sun.COM case 'x':
2519781SMoriah.Waterland@Sun.COM if (aflag < 0)
2529781SMoriah.Waterland@Sun.COM aflag = 0;
2539781SMoriah.Waterland@Sun.COM if (cflag < 0)
2549781SMoriah.Waterland@Sun.COM cflag = 0;
2559781SMoriah.Waterland@Sun.COM xflag++;
2569781SMoriah.Waterland@Sun.COM break;
2579781SMoriah.Waterland@Sun.COM
2589781SMoriah.Waterland@Sun.COM case 'q':
2599781SMoriah.Waterland@Sun.COM qflag++;
2609781SMoriah.Waterland@Sun.COM break;
2619781SMoriah.Waterland@Sun.COM
2629781SMoriah.Waterland@Sun.COM case 'a':
2639781SMoriah.Waterland@Sun.COM if (cflag < 0)
2649781SMoriah.Waterland@Sun.COM cflag = 0;
2659781SMoriah.Waterland@Sun.COM aflag = 1;
2669781SMoriah.Waterland@Sun.COM break;
2679781SMoriah.Waterland@Sun.COM
2689781SMoriah.Waterland@Sun.COM case 'c':
2699781SMoriah.Waterland@Sun.COM if (aflag < 0)
2709781SMoriah.Waterland@Sun.COM aflag = 0;
2719781SMoriah.Waterland@Sun.COM cflag = 1;
2729781SMoriah.Waterland@Sun.COM break;
2739781SMoriah.Waterland@Sun.COM
2749781SMoriah.Waterland@Sun.COM case 'e':
2759781SMoriah.Waterland@Sun.COM envfile = optarg;
2769781SMoriah.Waterland@Sun.COM break;
2779781SMoriah.Waterland@Sun.COM
2789781SMoriah.Waterland@Sun.COM case 'm':
2799781SMoriah.Waterland@Sun.COM mapfile = optarg;
2809781SMoriah.Waterland@Sun.COM break;
2819781SMoriah.Waterland@Sun.COM
2829781SMoriah.Waterland@Sun.COM case 'R':
2839781SMoriah.Waterland@Sun.COM Rvalue = optarg;
2849781SMoriah.Waterland@Sun.COM Rflag = 1;
2859781SMoriah.Waterland@Sun.COM break;
2869781SMoriah.Waterland@Sun.COM
2879781SMoriah.Waterland@Sun.COM case 'Y':
2889781SMoriah.Waterland@Sun.COM catg_arg = strdup(optarg);
2899781SMoriah.Waterland@Sun.COM
2909781SMoriah.Waterland@Sun.COM if ((category = get_categories(catg_arg)) == NULL) {
2919781SMoriah.Waterland@Sun.COM progerr(gettext(ERR_CAT_INV), catg_arg);
2929781SMoriah.Waterland@Sun.COM quit(1);
2939781SMoriah.Waterland@Sun.COM } else if (is_not_valid_length(category)) {
2949781SMoriah.Waterland@Sun.COM progerr(gettext(ERR_CAT_LNGTH));
2959781SMoriah.Waterland@Sun.COM quit(1);
2969781SMoriah.Waterland@Sun.COM }
2979781SMoriah.Waterland@Sun.COM break;
2989781SMoriah.Waterland@Sun.COM
2999781SMoriah.Waterland@Sun.COM case 'Q':
3009781SMoriah.Waterland@Sun.COM dbcreate++;
3019781SMoriah.Waterland@Sun.COM break;
3029781SMoriah.Waterland@Sun.COM
3039781SMoriah.Waterland@Sun.COM case 'P':
3049781SMoriah.Waterland@Sun.COM ppathlist[npaths] = strtok(optarg, " , ");
3059781SMoriah.Waterland@Sun.COM if ((ppathlist[npaths] == NULL) ||
3069781SMoriah.Waterland@Sun.COM (ppathlist[npaths][0] == '-')) {
3079781SMoriah.Waterland@Sun.COM progerr(gettext(ERR_PARTIAL_POPTION));
3089781SMoriah.Waterland@Sun.COM quit(1);
3099781SMoriah.Waterland@Sun.COM }
3109781SMoriah.Waterland@Sun.COM npaths++;
3119781SMoriah.Waterland@Sun.COM while (ppathlist[npaths] = strtok(NULL, " , ")) {
3129781SMoriah.Waterland@Sun.COM if (npaths++ >= MAXPATHS) {
3139781SMoriah.Waterland@Sun.COM progerr(gettext(ERR_MAXPATHS),
3149781SMoriah.Waterland@Sun.COM MAXPATHS);
3159781SMoriah.Waterland@Sun.COM quit(1);
3169781SMoriah.Waterland@Sun.COM }
3179781SMoriah.Waterland@Sun.COM }
3189781SMoriah.Waterland@Sun.COM break;
3199781SMoriah.Waterland@Sun.COM
3209781SMoriah.Waterland@Sun.COM default:
3219781SMoriah.Waterland@Sun.COM usage();
3229781SMoriah.Waterland@Sun.COM /*NOTREACHED*/
3239781SMoriah.Waterland@Sun.COM /*
3249781SMoriah.Waterland@Sun.COM * Although usage() calls a noreturn function,
3259781SMoriah.Waterland@Sun.COM * needed to add return (1); so that main() would
3269781SMoriah.Waterland@Sun.COM * pass compilation checks. The statement below
3279781SMoriah.Waterland@Sun.COM * should never be executed.
3289781SMoriah.Waterland@Sun.COM */
3299781SMoriah.Waterland@Sun.COM return (1);
3309781SMoriah.Waterland@Sun.COM }
3319781SMoriah.Waterland@Sun.COM }
3329781SMoriah.Waterland@Sun.COM
3339781SMoriah.Waterland@Sun.COM /* Check for incompatible options */
3349781SMoriah.Waterland@Sun.COM if (dflag && Rflag)
3359781SMoriah.Waterland@Sun.COM usage();
3369781SMoriah.Waterland@Sun.COM
3379781SMoriah.Waterland@Sun.COM /* Check for root dir and device dir if set */
3389781SMoriah.Waterland@Sun.COM if (Rflag) {
3399781SMoriah.Waterland@Sun.COM if (!set_inst_root(Rvalue)) {
3409781SMoriah.Waterland@Sun.COM progerr(gettext(ERR_ROOT_CMD));
3419781SMoriah.Waterland@Sun.COM quit(1);
3429781SMoriah.Waterland@Sun.COM }
3439781SMoriah.Waterland@Sun.COM }
3449781SMoriah.Waterland@Sun.COM
3459781SMoriah.Waterland@Sun.COM if (dflag)
3469781SMoriah.Waterland@Sun.COM device = flex_device(dvalue, 1);
3479781SMoriah.Waterland@Sun.COM
3489781SMoriah.Waterland@Sun.COM if (lflag || Lflag) {
3499781SMoriah.Waterland@Sun.COM /* we're only supposed to list information */
3509781SMoriah.Waterland@Sun.COM if ((cflag >= 0) || (aflag >= 0) ||
3519781SMoriah.Waterland@Sun.COM qflag || xflag || fflag || nflag || vflag)
3529781SMoriah.Waterland@Sun.COM usage();
3539781SMoriah.Waterland@Sun.COM }
3549781SMoriah.Waterland@Sun.COM
3559781SMoriah.Waterland@Sun.COM set_PKGpaths(get_inst_root());
3569781SMoriah.Waterland@Sun.COM
3579781SMoriah.Waterland@Sun.COM if (catg_arg != NULL && device == NULL) {
3589781SMoriah.Waterland@Sun.COM if (argc - optind) {
3599781SMoriah.Waterland@Sun.COM usage();
3609781SMoriah.Waterland@Sun.COM }
3619781SMoriah.Waterland@Sun.COM pkg = gpkglist(pkgdir, all_pkgs, category);
3629781SMoriah.Waterland@Sun.COM if (pkg == NULL) {
3639781SMoriah.Waterland@Sun.COM progerr(gettext(ERR_CAT_FND), catg_arg);
3649781SMoriah.Waterland@Sun.COM quit(1);
3659781SMoriah.Waterland@Sun.COM } else {
3669781SMoriah.Waterland@Sun.COM for (pkgcnt = 0; pkg[pkgcnt] != NULL; pkgcnt++);
3679781SMoriah.Waterland@Sun.COM }
3689781SMoriah.Waterland@Sun.COM } else if (catg_arg != NULL && optind < argc) {
3699781SMoriah.Waterland@Sun.COM usage();
3709781SMoriah.Waterland@Sun.COM } else {
3719781SMoriah.Waterland@Sun.COM pkg = &argv[optind];
3729781SMoriah.Waterland@Sun.COM pkgcnt = (argc - optind);
3739781SMoriah.Waterland@Sun.COM }
3749781SMoriah.Waterland@Sun.COM
375*9869SCasper.Dik@Sun.COM /* read the environment for the pkgserver */
376*9869SCasper.Dik@Sun.COM pkgserversetmode(DEFAULTMODE);
377*9869SCasper.Dik@Sun.COM
3789781SMoriah.Waterland@Sun.COM environ = NULL; /* Sever the parent environment. */
3799781SMoriah.Waterland@Sun.COM
3809781SMoriah.Waterland@Sun.COM if (vcfile() == 0) {
3819781SMoriah.Waterland@Sun.COM quit(99);
3829781SMoriah.Waterland@Sun.COM }
3839781SMoriah.Waterland@Sun.COM
3849781SMoriah.Waterland@Sun.COM errflg = 0;
3859781SMoriah.Waterland@Sun.COM if (mapfile) {
3869781SMoriah.Waterland@Sun.COM /* check for incompatible options */
3879781SMoriah.Waterland@Sun.COM if (device || pkgcnt)
3889781SMoriah.Waterland@Sun.COM usage();
3899781SMoriah.Waterland@Sun.COM put_path_params(); /* Restore what's needed. */
3909781SMoriah.Waterland@Sun.COM
3919781SMoriah.Waterland@Sun.COM /* send pathtype if partial path */
3929781SMoriah.Waterland@Sun.COM pathtype = (ppathlist[0] != NULL) ? 1 : 0;
3939781SMoriah.Waterland@Sun.COM if (checkmap(0, (device != NULL), mapfile, envfile, NULL,
3949781SMoriah.Waterland@Sun.COM NULL, pathtype))
3959781SMoriah.Waterland@Sun.COM errflg++;
3969781SMoriah.Waterland@Sun.COM } else if (device) {
3979781SMoriah.Waterland@Sun.COM /* check for incompatible options */
3989781SMoriah.Waterland@Sun.COM if ((cflag >= 0) || (aflag >= 0))
3999781SMoriah.Waterland@Sun.COM usage();
4009781SMoriah.Waterland@Sun.COM if (qflag || xflag || nflag || envfile)
4019781SMoriah.Waterland@Sun.COM usage();
4029781SMoriah.Waterland@Sun.COM tmpdir = NULL;
4039781SMoriah.Waterland@Sun.COM if ((spooldir = devattr(device, "pathname")) == NULL)
4049781SMoriah.Waterland@Sun.COM spooldir = device;
4059781SMoriah.Waterland@Sun.COM if (isdir(spooldir)) {
4069781SMoriah.Waterland@Sun.COM tmpdir = spooldir = qstrdup(tmpnam(NULL));
4079781SMoriah.Waterland@Sun.COM if (fflag) {
4089781SMoriah.Waterland@Sun.COM logerr(gettext(WRN_F_SPOOL), *pkg);
4099781SMoriah.Waterland@Sun.COM fflag = 0;
4109781SMoriah.Waterland@Sun.COM }
4119781SMoriah.Waterland@Sun.COM if (mkdir(spooldir, 0755)) {
4129781SMoriah.Waterland@Sun.COM progerr(gettext(ERR_MKDIR), spooldir);
4139781SMoriah.Waterland@Sun.COM quit(99);
4149781SMoriah.Waterland@Sun.COM }
4159781SMoriah.Waterland@Sun.COM if (n = pkgtrans(device, spooldir, pkg, PT_SILENT,
4169781SMoriah.Waterland@Sun.COM NULL, NULL))
4179781SMoriah.Waterland@Sun.COM quit(n);
4189781SMoriah.Waterland@Sun.COM if (catg_arg != NULL)
4199781SMoriah.Waterland@Sun.COM pkg = gpkglist(spooldir, all_pkgs, category);
4209781SMoriah.Waterland@Sun.COM else
4219781SMoriah.Waterland@Sun.COM pkg = gpkglist(spooldir, all_pkgs, NULL);
4229781SMoriah.Waterland@Sun.COM pkgfmt = 0;
4239781SMoriah.Waterland@Sun.COM } else {
4249781SMoriah.Waterland@Sun.COM if (catg_arg != NULL)
4259781SMoriah.Waterland@Sun.COM pkg = gpkglist(spooldir,
4269781SMoriah.Waterland@Sun.COM pkgcnt ? pkg : all_pkgs, category);
4279781SMoriah.Waterland@Sun.COM else
4289781SMoriah.Waterland@Sun.COM pkg = gpkglist(spooldir,
4299781SMoriah.Waterland@Sun.COM pkgcnt ? pkg : all_pkgs, NULL);
4309781SMoriah.Waterland@Sun.COM pkgfmt = 1;
4319781SMoriah.Waterland@Sun.COM }
4329781SMoriah.Waterland@Sun.COM
4339781SMoriah.Waterland@Sun.COM /*
4349781SMoriah.Waterland@Sun.COM * At this point pkg[] is the list of packages to check. They
4359781SMoriah.Waterland@Sun.COM * are in directory format in spooldir.
4369781SMoriah.Waterland@Sun.COM */
4379781SMoriah.Waterland@Sun.COM if (pkg == NULL) {
4389781SMoriah.Waterland@Sun.COM if (catg_arg != NULL) {
4399781SMoriah.Waterland@Sun.COM progerr(gettext(ERR_CAT_FND), catg_arg);
4409781SMoriah.Waterland@Sun.COM quit(1);
4419781SMoriah.Waterland@Sun.COM } else {
4429781SMoriah.Waterland@Sun.COM progerr(gettext(ERR_SEL_PKG));
4439781SMoriah.Waterland@Sun.COM quit(1);
4449781SMoriah.Waterland@Sun.COM }
4459781SMoriah.Waterland@Sun.COM }
4469781SMoriah.Waterland@Sun.COM
4479781SMoriah.Waterland@Sun.COM aflag = 0;
4489781SMoriah.Waterland@Sun.COM
4499781SMoriah.Waterland@Sun.COM for (n = 0; pkg[n]; n++) {
4509781SMoriah.Waterland@Sun.COM char locenv[PATH_MAX];
4519781SMoriah.Waterland@Sun.COM
4529781SMoriah.Waterland@Sun.COM /*
4539781SMoriah.Waterland@Sun.COM * *********************************************************************
4549781SMoriah.Waterland@Sun.COM * this feature is removed starting with Solaris 10 - there is no built
4559781SMoriah.Waterland@Sun.COM * in list of packages that should be run "the old way"
4569781SMoriah.Waterland@Sun.COM * *********************************************************************
4579781SMoriah.Waterland@Sun.COM */
4589781SMoriah.Waterland@Sun.COM #ifdef ALLOW_EXCEPTION_PKG_LIST
4599781SMoriah.Waterland@Sun.COM /* Until 2.9, set it from the execption list */
4609781SMoriah.Waterland@Sun.COM if (exception_pkg(pkg[n], LINK))
4619781SMoriah.Waterland@Sun.COM set_nonABI_symlinks();
4629781SMoriah.Waterland@Sun.COM #endif
4639781SMoriah.Waterland@Sun.COM
4649781SMoriah.Waterland@Sun.COM if (pkgfmt)
4659781SMoriah.Waterland@Sun.COM (void) printf(
4669781SMoriah.Waterland@Sun.COM gettext(MSG_CHK_DIR), pkg[n], device);
4679781SMoriah.Waterland@Sun.COM else
4689781SMoriah.Waterland@Sun.COM (void) printf(
4699781SMoriah.Waterland@Sun.COM gettext(MSG_CHK_STRM), pkg[n], device);
4709781SMoriah.Waterland@Sun.COM
4719781SMoriah.Waterland@Sun.COM (void) snprintf(pkgspool, sizeof (pkgspool),
4729781SMoriah.Waterland@Sun.COM "%s/%s", spooldir, pkg[n]);
4739781SMoriah.Waterland@Sun.COM (void) snprintf(file, sizeof (file),
4749781SMoriah.Waterland@Sun.COM "%s/install", pkgspool);
4759781SMoriah.Waterland@Sun.COM /* Here we check the install scripts. */
4769781SMoriah.Waterland@Sun.COM (void) printf(
4779781SMoriah.Waterland@Sun.COM gettext("## Checking control scripts.\n"));
4789781SMoriah.Waterland@Sun.COM (void) checkscripts(file, 0);
4799781SMoriah.Waterland@Sun.COM /* Verify consistency with the pkgmap. */
4809781SMoriah.Waterland@Sun.COM (void) printf(
4819781SMoriah.Waterland@Sun.COM gettext("## Checking package objects.\n"));
4829781SMoriah.Waterland@Sun.COM (void) snprintf(file, sizeof (file),
4839781SMoriah.Waterland@Sun.COM "%s/pkgmap", pkgspool);
4849781SMoriah.Waterland@Sun.COM (void) snprintf(locenv, sizeof (locenv),
4859781SMoriah.Waterland@Sun.COM "%s/pkginfo", pkgspool);
4869781SMoriah.Waterland@Sun.COM envfile = locenv;
4879781SMoriah.Waterland@Sun.COM
4889781SMoriah.Waterland@Sun.COM /*
4899781SMoriah.Waterland@Sun.COM * NOTE : checkmap() frees the environ data and
4909781SMoriah.Waterland@Sun.COM * pointer when it's through with them.
4919781SMoriah.Waterland@Sun.COM */
4929781SMoriah.Waterland@Sun.COM if (checkmap(0, (device != NULL), file, envfile,
4939781SMoriah.Waterland@Sun.COM pkg[n], NULL, 0))
4949781SMoriah.Waterland@Sun.COM errflg++;
4959781SMoriah.Waterland@Sun.COM (void) printf(
4969781SMoriah.Waterland@Sun.COM gettext("## Checking is complete.\n"));
4979781SMoriah.Waterland@Sun.COM }
4989781SMoriah.Waterland@Sun.COM } else {
4999781SMoriah.Waterland@Sun.COM if (envfile)
5009781SMoriah.Waterland@Sun.COM usage();
5019781SMoriah.Waterland@Sun.COM
5029781SMoriah.Waterland@Sun.COM put_path_params(); /* Restore what's needed. */
5039781SMoriah.Waterland@Sun.COM
5049781SMoriah.Waterland@Sun.COM /*
5059781SMoriah.Waterland@Sun.COM * If this is a check of a client of some sort, we'll need to
5069781SMoriah.Waterland@Sun.COM * mount up the client's filesystems. If the caller isn't
5079781SMoriah.Waterland@Sun.COM * root, this may not be possible.
5089781SMoriah.Waterland@Sun.COM */
5099781SMoriah.Waterland@Sun.COM if (is_an_inst_root()) {
5109781SMoriah.Waterland@Sun.COM if (getuid()) {
5119781SMoriah.Waterland@Sun.COM logerr(gettext(MSG_NOTROOT));
5129781SMoriah.Waterland@Sun.COM logerr(gettext(MSG_CONT));
5139781SMoriah.Waterland@Sun.COM } else {
5149781SMoriah.Waterland@Sun.COM if (get_mntinfo(map_client, vfstab_file))
5159781SMoriah.Waterland@Sun.COM map_client = 0;
5169781SMoriah.Waterland@Sun.COM if (map_client)
5179781SMoriah.Waterland@Sun.COM mount_client();
5189781SMoriah.Waterland@Sun.COM }
5199781SMoriah.Waterland@Sun.COM }
5209781SMoriah.Waterland@Sun.COM
5219781SMoriah.Waterland@Sun.COM (void) snprintf(file, sizeof (file),
5229781SMoriah.Waterland@Sun.COM "%s/contents", get_PKGADM());
5239781SMoriah.Waterland@Sun.COM if (ppathlist[0] != NULL) {
5249781SMoriah.Waterland@Sun.COM for (n = 0; ppathlist[n]; n++) {
5259781SMoriah.Waterland@Sun.COM if (checkmap(1, (device != NULL), file, NULL,
5269781SMoriah.Waterland@Sun.COM NULL, ppathlist[n], 1))
5279781SMoriah.Waterland@Sun.COM errflg++;
5289781SMoriah.Waterland@Sun.COM }
5299781SMoriah.Waterland@Sun.COM } else if (pkg[0] != NULL) {
5309781SMoriah.Waterland@Sun.COM if (checkmap(1, (device != NULL), file, NULL,
5319781SMoriah.Waterland@Sun.COM pkg[0], NULL, 0)) {
5329781SMoriah.Waterland@Sun.COM errflg++;
5339781SMoriah.Waterland@Sun.COM }
5349781SMoriah.Waterland@Sun.COM } else {
5359781SMoriah.Waterland@Sun.COM if (checkmap(1, (device != NULL), file, NULL,
5369781SMoriah.Waterland@Sun.COM NULL, NULL, 0)) {
5379781SMoriah.Waterland@Sun.COM errflg++;
5389781SMoriah.Waterland@Sun.COM }
5399781SMoriah.Waterland@Sun.COM }
5409781SMoriah.Waterland@Sun.COM
5419781SMoriah.Waterland@Sun.COM if (map_client) {
5429781SMoriah.Waterland@Sun.COM unmount_client();
5439781SMoriah.Waterland@Sun.COM }
5449781SMoriah.Waterland@Sun.COM }
5459781SMoriah.Waterland@Sun.COM quit(errflg ? 1 : 0);
5469781SMoriah.Waterland@Sun.COM /* LINTED: no return */
5479781SMoriah.Waterland@Sun.COM }
5489781SMoriah.Waterland@Sun.COM
5499781SMoriah.Waterland@Sun.COM static void
setpathlist(char * file)5509781SMoriah.Waterland@Sun.COM setpathlist(char *file)
5519781SMoriah.Waterland@Sun.COM {
5529781SMoriah.Waterland@Sun.COM int fd;
5539781SMoriah.Waterland@Sun.COM struct stat st;
5549781SMoriah.Waterland@Sun.COM FILE *fplist;
5559781SMoriah.Waterland@Sun.COM char pathname[PATH_MAX];
5569781SMoriah.Waterland@Sun.COM /*
5579781SMoriah.Waterland@Sun.COM * This trap laid to catch a mismatch between the declaration above and
5589781SMoriah.Waterland@Sun.COM * the hard-coded constant in the fscanf below
5599781SMoriah.Waterland@Sun.COM */
5609781SMoriah.Waterland@Sun.COM #if PATH_MAX != 1024
5619781SMoriah.Waterland@Sun.COM #error "PATH_MAX changed, so we have a bug to fix"
5629781SMoriah.Waterland@Sun.COM #endif
5639781SMoriah.Waterland@Sun.COM
5649781SMoriah.Waterland@Sun.COM if (strcmp(file, "-") == 0) {
5659781SMoriah.Waterland@Sun.COM fplist = stdin;
5669781SMoriah.Waterland@Sun.COM } else {
5679781SMoriah.Waterland@Sun.COM if ((fd = open(file, O_RDONLY)) == -1) {
5689781SMoriah.Waterland@Sun.COM progerr(gettext(ERR_IOPEN), file);
5699781SMoriah.Waterland@Sun.COM quit(1);
5709781SMoriah.Waterland@Sun.COM }
5719781SMoriah.Waterland@Sun.COM if (fstat(fd, &st) == -1) {
5729781SMoriah.Waterland@Sun.COM progerr(gettext(ERR_IOPEN), file);
5739781SMoriah.Waterland@Sun.COM quit(1);
5749781SMoriah.Waterland@Sun.COM }
5759781SMoriah.Waterland@Sun.COM if (S_ISDIR(st.st_mode) || S_ISBLK(st.st_mode)) {
5769781SMoriah.Waterland@Sun.COM progerr(gettext(ERR_PATHS_INVALID), file);
5779781SMoriah.Waterland@Sun.COM quit(1);
5789781SMoriah.Waterland@Sun.COM }
5799781SMoriah.Waterland@Sun.COM if ((fplist = fdopen(fd, "r")) == NULL) {
5809781SMoriah.Waterland@Sun.COM progerr(gettext(ERR_IOPEN), file);
5819781SMoriah.Waterland@Sun.COM quit(1);
5829781SMoriah.Waterland@Sun.COM }
5839781SMoriah.Waterland@Sun.COM }
5849781SMoriah.Waterland@Sun.COM while (fscanf(fplist, "%1024s", pathname) == 1) {
5859781SMoriah.Waterland@Sun.COM if (*pathname == '\0') {
5869781SMoriah.Waterland@Sun.COM progerr(gettext(ERR_PATHS_INVALID), file);
5879781SMoriah.Waterland@Sun.COM quit(1);
5889781SMoriah.Waterland@Sun.COM }
5899781SMoriah.Waterland@Sun.COM pathlist[npaths] = qstrdup(pathname);
5909781SMoriah.Waterland@Sun.COM if (npaths++ > MAXPATHS) {
5919781SMoriah.Waterland@Sun.COM progerr(gettext(ERR_TOO_MANY), MAXPATHS);
5929781SMoriah.Waterland@Sun.COM quit(1);
5939781SMoriah.Waterland@Sun.COM }
5949781SMoriah.Waterland@Sun.COM }
5959781SMoriah.Waterland@Sun.COM if (npaths == 0) {
5969781SMoriah.Waterland@Sun.COM progerr(gettext(ERR_IEMPTY));
5979781SMoriah.Waterland@Sun.COM quit(1);
5989781SMoriah.Waterland@Sun.COM }
5999781SMoriah.Waterland@Sun.COM (void) fclose(fplist);
6009781SMoriah.Waterland@Sun.COM }
6019781SMoriah.Waterland@Sun.COM
6029781SMoriah.Waterland@Sun.COM void
quit(int n)6039781SMoriah.Waterland@Sun.COM quit(int n)
6049781SMoriah.Waterland@Sun.COM {
6059781SMoriah.Waterland@Sun.COM /* cleanup any temporary directories */
6069781SMoriah.Waterland@Sun.COM (void) chdir("/");
6079781SMoriah.Waterland@Sun.COM if (tmpdir != NULL) {
6089781SMoriah.Waterland@Sun.COM (void) rrmdir(tmpdir);
6099781SMoriah.Waterland@Sun.COM free(tmpdir);
6109781SMoriah.Waterland@Sun.COM tmpdir = NULL;
6119781SMoriah.Waterland@Sun.COM }
6129781SMoriah.Waterland@Sun.COM (void) pkghead(NULL);
6139781SMoriah.Waterland@Sun.COM exit(n);
6149781SMoriah.Waterland@Sun.COM /*NOTREACHED*/
6159781SMoriah.Waterland@Sun.COM }
6169781SMoriah.Waterland@Sun.COM
6179781SMoriah.Waterland@Sun.COM static void
usage(void)6189781SMoriah.Waterland@Sun.COM usage(void)
6199781SMoriah.Waterland@Sun.COM {
6209781SMoriah.Waterland@Sun.COM char *prog = get_prog_name();
6219781SMoriah.Waterland@Sun.COM
6229781SMoriah.Waterland@Sun.COM (void) fprintf(stderr, gettext(ERR_USAGE), prog, prog);
6239781SMoriah.Waterland@Sun.COM quit(1);
6249781SMoriah.Waterland@Sun.COM /*NOTREACHED*/
6259781SMoriah.Waterland@Sun.COM }
626