15c51f124SMoriah Waterland /*
25c51f124SMoriah Waterland * CDDL HEADER START
35c51f124SMoriah Waterland *
45c51f124SMoriah Waterland * The contents of this file are subject to the terms of the
55c51f124SMoriah Waterland * Common Development and Distribution License (the "License").
65c51f124SMoriah Waterland * You may not use this file except in compliance with the License.
75c51f124SMoriah Waterland *
85c51f124SMoriah Waterland * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
95c51f124SMoriah Waterland * or http://www.opensolaris.org/os/licensing.
105c51f124SMoriah Waterland * See the License for the specific language governing permissions
115c51f124SMoriah Waterland * and limitations under the License.
125c51f124SMoriah Waterland *
135c51f124SMoriah Waterland * When distributing Covered Code, include this CDDL HEADER in each
145c51f124SMoriah Waterland * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
155c51f124SMoriah Waterland * If applicable, add the following below this CDDL HEADER, with the
165c51f124SMoriah Waterland * fields enclosed by brackets "[]" replaced with your own identifying
175c51f124SMoriah Waterland * information: Portions Copyright [yyyy] [name of copyright owner]
185c51f124SMoriah Waterland *
195c51f124SMoriah Waterland * CDDL HEADER END
205c51f124SMoriah Waterland */
215c51f124SMoriah Waterland
225c51f124SMoriah Waterland /*
23*6e1ae2a3SGary Pennington * Copyright (c) 1989, 2010, Oracle and/or its affiliates. All rights reserved.
245c51f124SMoriah Waterland */
255c51f124SMoriah Waterland
265c51f124SMoriah Waterland /* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
275c51f124SMoriah Waterland /* All Rights Reserved */
285c51f124SMoriah Waterland
295c51f124SMoriah Waterland
305c51f124SMoriah Waterland #include <stdio.h>
315c51f124SMoriah Waterland #include <string.h>
325c51f124SMoriah Waterland #include <locale.h>
335c51f124SMoriah Waterland #include <libintl.h>
345c51f124SMoriah Waterland #include <dirent.h>
355c51f124SMoriah Waterland #include <pkgstrct.h>
365c51f124SMoriah Waterland #include <pkgdev.h>
375c51f124SMoriah Waterland #include <pkglocs.h>
385c51f124SMoriah Waterland #include <archives.h>
395c51f124SMoriah Waterland #include <errno.h>
405c51f124SMoriah Waterland #include <fcntl.h>
415c51f124SMoriah Waterland #include <sys/stat.h>
425c51f124SMoriah Waterland #include <sys/param.h>
435c51f124SMoriah Waterland #include <stdlib.h>
445c51f124SMoriah Waterland #include <unistd.h>
455c51f124SMoriah Waterland #include <assert.h>
465c51f124SMoriah Waterland #include <wait.h>
475c51f124SMoriah Waterland
485c51f124SMoriah Waterland /*
495c51f124SMoriah Waterland * libinstzones includes
505c51f124SMoriah Waterland */
515c51f124SMoriah Waterland
525c51f124SMoriah Waterland #include <instzones_api.h>
535c51f124SMoriah Waterland
545c51f124SMoriah Waterland /*
555c51f124SMoriah Waterland * consolidation pkg command library includes
565c51f124SMoriah Waterland */
575c51f124SMoriah Waterland
585c51f124SMoriah Waterland #include <pkglib.h>
595c51f124SMoriah Waterland #include <pkgweb.h>
605c51f124SMoriah Waterland
615c51f124SMoriah Waterland /*
625c51f124SMoriah Waterland * local pkg command library includes
635c51f124SMoriah Waterland */
645c51f124SMoriah Waterland
655c51f124SMoriah Waterland #include <install.h>
665c51f124SMoriah Waterland #include <libinst.h>
675c51f124SMoriah Waterland #include <libadm.h>
685c51f124SMoriah Waterland #include <dryrun.h>
695c51f124SMoriah Waterland #include <messages.h>
705c51f124SMoriah Waterland
715c51f124SMoriah Waterland /*
725c51f124SMoriah Waterland * pkginstall local includes
735c51f124SMoriah Waterland */
745c51f124SMoriah Waterland
755c51f124SMoriah Waterland #include "pkginstall.h"
765c51f124SMoriah Waterland
775c51f124SMoriah Waterland extern int pkgverbose;
785c51f124SMoriah Waterland extern fsblkcnt_t pkgmap_blks; /* main.c */
795c51f124SMoriah Waterland
805c51f124SMoriah Waterland extern struct pkgdev pkgdev;
815c51f124SMoriah Waterland
825c51f124SMoriah Waterland extern char tmpdir[];
835c51f124SMoriah Waterland extern char pkgbin[];
845c51f124SMoriah Waterland extern char instdir[];
855c51f124SMoriah Waterland extern char saveSpoolInstallDir[];
865c51f124SMoriah Waterland extern char *pkginst;
875c51f124SMoriah Waterland
885c51f124SMoriah Waterland extern int dbchg;
895c51f124SMoriah Waterland extern int nosetuid;
905c51f124SMoriah Waterland extern int nocnflct;
915c51f124SMoriah Waterland extern int warnflag;
925c51f124SMoriah Waterland
935c51f124SMoriah Waterland #define DMRG_DONE -1
945c51f124SMoriah Waterland
955c51f124SMoriah Waterland #define ck_efile(s, p) \
965c51f124SMoriah Waterland ((p->cinfo.modtime >= 0) && \
975c51f124SMoriah Waterland p->ainfo.local && \
985c51f124SMoriah Waterland cverify(0, &p->ftype, s, &p->cinfo, 1))
995c51f124SMoriah Waterland
1005c51f124SMoriah Waterland static int eocflag;
1015c51f124SMoriah Waterland
1025c51f124SMoriah Waterland /*
1035c51f124SMoriah Waterland * The variable below indicates that fix_attributes() will be inadequate
1045c51f124SMoriah Waterland * because a replacement was permitted.
1055c51f124SMoriah Waterland */
1065c51f124SMoriah Waterland static int repl_permitted = 0;
1075c51f124SMoriah Waterland
1085c51f124SMoriah Waterland static int domerg(struct cfextra **extlist, int part, int nparts,
1095c51f124SMoriah Waterland int myclass, char **srcp, char **dstp,
110*6e1ae2a3SGary Pennington char **r_updated);
1115c51f124SMoriah Waterland static void endofclass(struct cfextra **extlist, int myclass,
11262224350SCasper H.S. Dik int ckflag, PKGserver server, VFP_T **a_cfTmpVfp);
1135c51f124SMoriah Waterland static int fix_attributes(struct cfextra **, int);
1145c51f124SMoriah Waterland static int dir_is_populated(char *dirpath);
1155c51f124SMoriah Waterland static boolean_t absolutepath(char *path);
1165c51f124SMoriah Waterland static boolean_t parametricpath(char *path, char **relocpath);
1175c51f124SMoriah Waterland
1185c51f124SMoriah Waterland /* Used to keep track of the entries in extlist that are regular files. */
1195c51f124SMoriah Waterland struct reg_files {
1205c51f124SMoriah Waterland struct reg_files *next;
1215c51f124SMoriah Waterland int val;
1225c51f124SMoriah Waterland };
1235c51f124SMoriah Waterland static struct reg_files *regfiles_head = NULL;
1245c51f124SMoriah Waterland
1255c51f124SMoriah Waterland /*
1265c51f124SMoriah Waterland * This is the function that actually installs one volume (usually that's
1275c51f124SMoriah Waterland * all there is). Upon entry, the extlist is entirely correct:
1285c51f124SMoriah Waterland *
1295c51f124SMoriah Waterland * 1. It contains only those files which are to be installed
1305c51f124SMoriah Waterland * from all volumes.
1315c51f124SMoriah Waterland * 2. The mode bits in the ainfo structure for each file are set
1325c51f124SMoriah Waterland * correctly in accordance with administrative defaults.
1335c51f124SMoriah Waterland * 3. mstat.setuid/setgid reflect what the status *was* before
1345c51f124SMoriah Waterland * pkgdbmerg() processed compliance.
1355c51f124SMoriah Waterland */
1365c51f124SMoriah Waterland void
instvol(struct cfextra ** extlist,char * srcinst,int part,int nparts,PKGserver pkgserver,VFP_T ** a_cfTmpVfp,char ** r_updated,char * a_zoneName)1375c51f124SMoriah Waterland instvol(struct cfextra **extlist, char *srcinst, int part,
13862224350SCasper H.S. Dik int nparts, PKGserver pkgserver, VFP_T **a_cfTmpVfp,
139*6e1ae2a3SGary Pennington char **r_updated, char *a_zoneName)
1405c51f124SMoriah Waterland {
1415c51f124SMoriah Waterland FILE *listfp;
1425c51f124SMoriah Waterland char *updated = (char *)NULL;
1435c51f124SMoriah Waterland char *relocpath = (char *)NULL;
1445c51f124SMoriah Waterland char *dstp;
1455c51f124SMoriah Waterland char *listfile;
1465c51f124SMoriah Waterland char *srcp;
1475c51f124SMoriah Waterland char *pspool_loc;
1485c51f124SMoriah Waterland char scrpt_dst[PATH_MAX];
1495c51f124SMoriah Waterland int count;
1505c51f124SMoriah Waterland int entryidx; /* array of current package objects */
1515c51f124SMoriah Waterland int n;
1525c51f124SMoriah Waterland int nc = 0;
1535c51f124SMoriah Waterland int pass; /* pass count through the for loop. */
1545c51f124SMoriah Waterland int tcount;
1555c51f124SMoriah Waterland struct cfent *ept;
1565c51f124SMoriah Waterland struct cfextra *ext;
1575c51f124SMoriah Waterland struct mergstat *mstat;
1585c51f124SMoriah Waterland struct reg_files *rfp = NULL;
1595c51f124SMoriah Waterland
1605c51f124SMoriah Waterland /*
161*6e1ae2a3SGary Pennington * r_updated is an optional parameter that can be passed in
162*6e1ae2a3SGary Pennington * by the caller if the caller wants to know if any objects are
163*6e1ae2a3SGary Pennington * updated. Do not initialize r_updated; the call to instvol
164*6e1ae2a3SGary Pennington * could be cumulative and any previous update indication must not
165*6e1ae2a3SGary Pennington * be disturbed - this flag is only set, it must never be reset.
166*6e1ae2a3SGary Pennington * This flag is a "char *" pointer so that the object that was
167*6e1ae2a3SGary Pennington * updated can be displayed in debugging output.
1685c51f124SMoriah Waterland */
1695c51f124SMoriah Waterland
1705c51f124SMoriah Waterland if (part == 1) {
1715c51f124SMoriah Waterland pkgvolume(&pkgdev, srcinst, part, nparts);
1725c51f124SMoriah Waterland }
1735c51f124SMoriah Waterland
1745c51f124SMoriah Waterland tcount = 0;
1755c51f124SMoriah Waterland nc = cl_getn();
1765c51f124SMoriah Waterland
1775c51f124SMoriah Waterland /*
1785c51f124SMoriah Waterland * For each class in this volume, install those files.
1795c51f124SMoriah Waterland *
1805c51f124SMoriah Waterland * NOTE : This loop index may be decremented by code below forcing a
1815c51f124SMoriah Waterland * second trip through for the same class. This happens only when a
1825c51f124SMoriah Waterland * class is split between an archive and the tree. Examples would be
1835c51f124SMoriah Waterland * old WOS packages and the occasional class containing dynamic
1845c51f124SMoriah Waterland * libraries which require special treatment.
1855c51f124SMoriah Waterland */
1865c51f124SMoriah Waterland
1875c51f124SMoriah Waterland if (is_depend_pkginfo_DB() == B_FALSE) {
1885c51f124SMoriah Waterland int classidx; /* the current class */
1895c51f124SMoriah Waterland
1905c51f124SMoriah Waterland for (classidx = 0; classidx < nc; classidx++) {
1915c51f124SMoriah Waterland int pass_relative = 0;
1925c51f124SMoriah Waterland int rel_init = 0;
1935c51f124SMoriah Waterland
1945c51f124SMoriah Waterland eocflag = count = pass = 0;
1955c51f124SMoriah Waterland listfp = (FILE *)0;
1965c51f124SMoriah Waterland listfile = NULL;
1975c51f124SMoriah Waterland
1985c51f124SMoriah Waterland /* Now what do we pass to the class action script */
1995c51f124SMoriah Waterland
2005c51f124SMoriah Waterland if (cl_pthrel(classidx) == REL_2_CAS) {
2015c51f124SMoriah Waterland pass_relative = 1;
2025c51f124SMoriah Waterland }
2035c51f124SMoriah Waterland
2045c51f124SMoriah Waterland for (;;) {
2055c51f124SMoriah Waterland if (!tcount++) {
2065c51f124SMoriah Waterland /* first file to install */
2075c51f124SMoriah Waterland if (a_zoneName == (char *)NULL) {
2085c51f124SMoriah Waterland echo(MSG_INS_N_N, part, nparts);
2095c51f124SMoriah Waterland } else {
2105c51f124SMoriah Waterland echo(MSG_INS_N_N_LZ, part, nparts,
2115c51f124SMoriah Waterland a_zoneName);
2125c51f124SMoriah Waterland }
2135c51f124SMoriah Waterland }
2145c51f124SMoriah Waterland
2155c51f124SMoriah Waterland /*
2165c51f124SMoriah Waterland * If there's an install class action script and no
2175c51f124SMoriah Waterland * list file has been created yet, create that file
2185c51f124SMoriah Waterland * and provide the pointer in listfp.
2195c51f124SMoriah Waterland */
2205c51f124SMoriah Waterland if (cl_iscript(classidx) && !listfp) {
2215c51f124SMoriah Waterland /* create list file */
2225c51f124SMoriah Waterland putparam("TMPDIR", tmpdir);
2235c51f124SMoriah Waterland listfile = tempnam(tmpdir, "list");
2245c51f124SMoriah Waterland if ((listfp = fopen(listfile, "w")) == NULL) {
2255c51f124SMoriah Waterland progerr(ERR_WTMPFILE, listfile);
2265c51f124SMoriah Waterland quit(99);
2275c51f124SMoriah Waterland }
2285c51f124SMoriah Waterland }
2295c51f124SMoriah Waterland
2305c51f124SMoriah Waterland /*
2315c51f124SMoriah Waterland * The following function goes through the package
2325c51f124SMoriah Waterland * object list returning the array index of the next
2335c51f124SMoriah Waterland * regular file. If it encounters a directory,
2345c51f124SMoriah Waterland * symlink, named pipe or device, it just creates it.
2355c51f124SMoriah Waterland */
2365c51f124SMoriah Waterland
2375c51f124SMoriah Waterland entryidx = domerg(extlist, (pass++ ? 0 : part), nparts,
238*6e1ae2a3SGary Pennington classidx, &srcp, &dstp, &updated);
2395c51f124SMoriah Waterland
2405c51f124SMoriah Waterland /* Evaluate the return code */
2415c51f124SMoriah Waterland if (entryidx == DMRG_DONE) {
2425c51f124SMoriah Waterland /*
2435c51f124SMoriah Waterland * Set ept to the first entry in extlist
2445c51f124SMoriah Waterland * which is guaranteed to exist so
2455c51f124SMoriah Waterland * later checks against ept->ftype are
2465c51f124SMoriah Waterland * not compared to NULL.
2475c51f124SMoriah Waterland */
2485c51f124SMoriah Waterland ext = extlist[0];
2495c51f124SMoriah Waterland ept = &(ext->cf_ent);
2505c51f124SMoriah Waterland break; /* no more entries to process */
2515c51f124SMoriah Waterland }
2525c51f124SMoriah Waterland
2535c51f124SMoriah Waterland ext = extlist[entryidx];
2545c51f124SMoriah Waterland ept = &(ext->cf_ent);
2555c51f124SMoriah Waterland mstat = &(ext->mstat);
2565c51f124SMoriah Waterland
2575c51f124SMoriah Waterland /*
2585c51f124SMoriah Waterland * If not installing from a partially spooled package
2595c51f124SMoriah Waterland * (the "save/pspool" area), and the file contents can
2605c51f124SMoriah Waterland * be changed (type is 'e' or 'v'), and the class is not
2615c51f124SMoriah Waterland * "none": copy the file from the package (in pristine
2625c51f124SMoriah Waterland * state with no actions performed) into the appropriate
2635c51f124SMoriah Waterland * location in the packages destination "save/pspool"
2645c51f124SMoriah Waterland * area.
2655c51f124SMoriah Waterland */
2665c51f124SMoriah Waterland
2675c51f124SMoriah Waterland if ((!is_partial_inst()) &&
2685c51f124SMoriah Waterland ((ept->ftype == 'e') || (ept->ftype == 'v')) &&
2695c51f124SMoriah Waterland (strcmp(ept->pkg_class, "none") != 0)) {
2705c51f124SMoriah Waterland
2715c51f124SMoriah Waterland if (absolutepath(ext->map_path) == B_TRUE &&
2725c51f124SMoriah Waterland parametricpath(ext->cf_ent.ainfo.local,
2735c51f124SMoriah Waterland &relocpath) == B_FALSE) {
2745c51f124SMoriah Waterland pspool_loc = ROOT;
2755c51f124SMoriah Waterland } else {
2765c51f124SMoriah Waterland pspool_loc = RELOC;
2775c51f124SMoriah Waterland }
2785c51f124SMoriah Waterland
2795c51f124SMoriah Waterland n = snprintf(scrpt_dst, PATH_MAX, "%s/%s/%s",
2805c51f124SMoriah Waterland saveSpoolInstallDir, pspool_loc,
2815c51f124SMoriah Waterland relocpath ? relocpath : ext->map_path);
2825c51f124SMoriah Waterland
2835c51f124SMoriah Waterland if (n >= PATH_MAX) {
2845c51f124SMoriah Waterland progerr(ERR_CREATE_PATH_2,
2855c51f124SMoriah Waterland saveSpoolInstallDir,
2865c51f124SMoriah Waterland ext->map_path);
2875c51f124SMoriah Waterland quit(99);
2885c51f124SMoriah Waterland }
2895c51f124SMoriah Waterland
2905c51f124SMoriah Waterland /* copy, preserve source file mode */
2915c51f124SMoriah Waterland
2925c51f124SMoriah Waterland if (cppath(MODE_SRC, srcp, scrpt_dst, 0644)) {
2935c51f124SMoriah Waterland warnflag++;
2945c51f124SMoriah Waterland }
2955c51f124SMoriah Waterland }
2965c51f124SMoriah Waterland
2975c51f124SMoriah Waterland /*
2985c51f124SMoriah Waterland * If this isn't writeable anyway, it's not going
2995c51f124SMoriah Waterland * into the list file. Only count it if it's going
3005c51f124SMoriah Waterland * into the list file.
3015c51f124SMoriah Waterland */
3025c51f124SMoriah Waterland if (is_fs_writeable(ext->cf_ent.path,
3035c51f124SMoriah Waterland &(ext->fsys_value)))
3045c51f124SMoriah Waterland count++;
3055c51f124SMoriah Waterland
3065c51f124SMoriah Waterland pkgvolume(&pkgdev, srcinst, part, nparts);
3075c51f124SMoriah Waterland
3085c51f124SMoriah Waterland /*
3095c51f124SMoriah Waterland * If source verification is OK for this class, make
3105c51f124SMoriah Waterland * sure the source we're passing to the class action
3115c51f124SMoriah Waterland * script is useable.
3125c51f124SMoriah Waterland */
3135c51f124SMoriah Waterland if (cl_svfy(classidx) != NOVERIFY) {
3145c51f124SMoriah Waterland if (cl_iscript(classidx) ||
3155c51f124SMoriah Waterland ((ept->ftype == 'e') ||
3165c51f124SMoriah Waterland (ept->ftype == 'n'))) {
3175c51f124SMoriah Waterland if (ck_efile(srcp, ept)) {
3185c51f124SMoriah Waterland progerr(ERR_CORRUPT,
3195c51f124SMoriah Waterland srcp);
3205c51f124SMoriah Waterland logerr(getErrbufAddr());
3215c51f124SMoriah Waterland warnflag++;
3225c51f124SMoriah Waterland continue;
3235c51f124SMoriah Waterland }
3245c51f124SMoriah Waterland }
3255c51f124SMoriah Waterland }
3265c51f124SMoriah Waterland
3275c51f124SMoriah Waterland /*
3285c51f124SMoriah Waterland * If there's a class action script for this class,
3295c51f124SMoriah Waterland * just collect names in a temporary file
3305c51f124SMoriah Waterland * that will be used as the stdin when the
3315c51f124SMoriah Waterland * class action script is invoked.
3325c51f124SMoriah Waterland */
3335c51f124SMoriah Waterland
3345c51f124SMoriah Waterland if ((cl_iscript(classidx)) &&
3355c51f124SMoriah Waterland ((is_fs_writeable(ept->path,
3365c51f124SMoriah Waterland &(ext->fsys_value))))) {
3375c51f124SMoriah Waterland if (pass_relative) {
3385c51f124SMoriah Waterland if (!rel_init) {
3395c51f124SMoriah Waterland (void) fputs(instdir, listfp);
3405c51f124SMoriah Waterland (void) putc('\n', listfp);
3415c51f124SMoriah Waterland rel_init++;
3425c51f124SMoriah Waterland }
3435c51f124SMoriah Waterland (void) fputs(ext->map_path, listfp);
3445c51f124SMoriah Waterland (void) putc('\n', listfp);
3455c51f124SMoriah Waterland } else {
3465c51f124SMoriah Waterland (void) fputs(srcp ?
3475c51f124SMoriah Waterland srcp : "/dev/null", listfp);
3485c51f124SMoriah Waterland (void) putc(' ', listfp);
3495c51f124SMoriah Waterland (void) fputs(dstp, listfp);
3505c51f124SMoriah Waterland (void) putc('\n', listfp);
3515c51f124SMoriah Waterland }
3525c51f124SMoriah Waterland /*
3535c51f124SMoriah Waterland * Note which entries in extlist are regular
3545c51f124SMoriah Waterland * files to be installed via the class action
3555c51f124SMoriah Waterland * script.
3565c51f124SMoriah Waterland */
3575c51f124SMoriah Waterland if (regfiles_head == NULL) {
3585c51f124SMoriah Waterland assert(rfp == NULL);
3595c51f124SMoriah Waterland regfiles_head =
3605c51f124SMoriah Waterland malloc(sizeof (struct reg_files));
3615c51f124SMoriah Waterland if (regfiles_head == NULL) {
3625c51f124SMoriah Waterland progerr(ERR_MEMORY, errno);
3635c51f124SMoriah Waterland quit(99);
3645c51f124SMoriah Waterland }
3655c51f124SMoriah Waterland regfiles_head->next = NULL;
3665c51f124SMoriah Waterland regfiles_head->val = entryidx;
3675c51f124SMoriah Waterland rfp = regfiles_head;
3685c51f124SMoriah Waterland } else {
3695c51f124SMoriah Waterland assert(rfp != NULL);
3705c51f124SMoriah Waterland rfp->next =
3715c51f124SMoriah Waterland malloc(sizeof (struct reg_files));
3725c51f124SMoriah Waterland if (rfp->next == NULL) {
3735c51f124SMoriah Waterland progerr(ERR_MEMORY, errno);
3745c51f124SMoriah Waterland quit(99);
3755c51f124SMoriah Waterland }
3765c51f124SMoriah Waterland rfp = rfp->next;
3775c51f124SMoriah Waterland rfp->next = NULL;
3785c51f124SMoriah Waterland rfp->val = entryidx;
3795c51f124SMoriah Waterland }
3805c51f124SMoriah Waterland
3815c51f124SMoriah Waterland /*
3825c51f124SMoriah Waterland * A warning message about unwritable targets
3835c51f124SMoriah Waterland * in a class may be appropriate here.
3845c51f124SMoriah Waterland */
3855c51f124SMoriah Waterland continue;
3865c51f124SMoriah Waterland }
3875c51f124SMoriah Waterland
3885c51f124SMoriah Waterland /*
3895c51f124SMoriah Waterland * If not installing from a partially spooled package
3905c51f124SMoriah Waterland * (the "save/pspool" area), and the file contents can
3915c51f124SMoriah Waterland * be changed (type is 'e' or 'v') and the class
3925c51f124SMoriah Waterland * identifier is not "none": copy the file from the
3935c51f124SMoriah Waterland * package (in pristine state with no actions performed)
3945c51f124SMoriah Waterland * into the appropriate location in the packages
3955c51f124SMoriah Waterland * destination "save/pspool" area.
3965c51f124SMoriah Waterland */
3975c51f124SMoriah Waterland
3985c51f124SMoriah Waterland if ((!is_partial_inst()) &&
3995c51f124SMoriah Waterland ((ept->ftype == 'e') || (ept->ftype == 'v') &&
4005c51f124SMoriah Waterland (strcmp(ept->pkg_class, "none") != 0))) {
4015c51f124SMoriah Waterland
4025c51f124SMoriah Waterland if (absolutepath(ext->map_path) == B_TRUE &&
4035c51f124SMoriah Waterland parametricpath(ext->cf_ent.ainfo.local,
4045c51f124SMoriah Waterland &relocpath) == B_FALSE) {
4055c51f124SMoriah Waterland pspool_loc = ROOT;
4065c51f124SMoriah Waterland } else {
4075c51f124SMoriah Waterland pspool_loc = RELOC;
4085c51f124SMoriah Waterland }
4095c51f124SMoriah Waterland
4105c51f124SMoriah Waterland n = snprintf(scrpt_dst, PATH_MAX, "%s/%s/%s",
4115c51f124SMoriah Waterland saveSpoolInstallDir, pspool_loc,
4125c51f124SMoriah Waterland relocpath ? relocpath : ext->map_path);
4135c51f124SMoriah Waterland
4145c51f124SMoriah Waterland if (n >= PATH_MAX) {
4155c51f124SMoriah Waterland progerr(ERR_CREATE_PATH_2,
4165c51f124SMoriah Waterland saveSpoolInstallDir,
4175c51f124SMoriah Waterland ext->map_path);
4185c51f124SMoriah Waterland quit(99);
4195c51f124SMoriah Waterland }
4205c51f124SMoriah Waterland
4215c51f124SMoriah Waterland /* copy, preserve source file mode */
4225c51f124SMoriah Waterland
4235c51f124SMoriah Waterland if (cppath(MODE_SRC, srcp, scrpt_dst, 0644)) {
4245c51f124SMoriah Waterland warnflag++;
4255c51f124SMoriah Waterland }
4265c51f124SMoriah Waterland }
4275c51f124SMoriah Waterland
4285c51f124SMoriah Waterland /*
4295c51f124SMoriah Waterland * There are several tests here to determine
4305c51f124SMoriah Waterland * how we're going to deal with objects
4315c51f124SMoriah Waterland * intended for remote read-only filesystems.
4325c51f124SMoriah Waterland * We don't use is_served() because this may be
4335c51f124SMoriah Waterland * a server. We're actually interested in if
4345c51f124SMoriah Waterland * it's *really* remote and *really* not
4355c51f124SMoriah Waterland * writeable.
4365c51f124SMoriah Waterland */
4375c51f124SMoriah Waterland
4385c51f124SMoriah Waterland n = is_remote_fs(ept->path, &(ext->fsys_value));
4395c51f124SMoriah Waterland if ((n != 0) &&
4405c51f124SMoriah Waterland !is_fs_writeable(ept->path,
4415c51f124SMoriah Waterland &(ext->fsys_value))) {
4425c51f124SMoriah Waterland
4435c51f124SMoriah Waterland /*
4445c51f124SMoriah Waterland * Don't change the file, we can't write
4455c51f124SMoriah Waterland * to it anyway.
4465c51f124SMoriah Waterland */
4475c51f124SMoriah Waterland
4485c51f124SMoriah Waterland mstat->attrchg = 0;
4495c51f124SMoriah Waterland mstat->contchg = 0;
4505c51f124SMoriah Waterland
4515c51f124SMoriah Waterland /*
4525c51f124SMoriah Waterland * If it's currently mounted, we can
4535c51f124SMoriah Waterland * at least test it for existence.
4545c51f124SMoriah Waterland */
4555c51f124SMoriah Waterland
4565c51f124SMoriah Waterland if (is_mounted(ept->path, &(ext->fsys_value))) {
4575c51f124SMoriah Waterland if (!isfile(NULL, dstp)) {
4585c51f124SMoriah Waterland echo(MSG_IS_PRESENT, dstp);
4595c51f124SMoriah Waterland } else {
4605c51f124SMoriah Waterland echo(WRN_INSTVOL_NONE, dstp);
4615c51f124SMoriah Waterland }
4625c51f124SMoriah Waterland } else {
4635c51f124SMoriah Waterland char *server_host;
4645c51f124SMoriah Waterland
4655c51f124SMoriah Waterland server_host = get_server_host(
4665c51f124SMoriah Waterland ext->fsys_value);
4675c51f124SMoriah Waterland
4685c51f124SMoriah Waterland /* If not, we're just stuck. */
4695c51f124SMoriah Waterland echo(WRN_INSTVOL_NOVERIFY,
4705c51f124SMoriah Waterland dstp, server_host);
4715c51f124SMoriah Waterland }
4725c51f124SMoriah Waterland
4735c51f124SMoriah Waterland continue;
4745c51f124SMoriah Waterland }
4755c51f124SMoriah Waterland
4765c51f124SMoriah Waterland /* echo output destination name */
4775c51f124SMoriah Waterland
4785c51f124SMoriah Waterland echo("%s", dstp);
4795c51f124SMoriah Waterland
4805c51f124SMoriah Waterland /*
4815c51f124SMoriah Waterland * if no source then no need to copy/verify
4825c51f124SMoriah Waterland */
4835c51f124SMoriah Waterland
4845c51f124SMoriah Waterland if (srcp == (char *)NULL) {
4855c51f124SMoriah Waterland continue;
4865c51f124SMoriah Waterland }
4875c51f124SMoriah Waterland
4885c51f124SMoriah Waterland /*
4895c51f124SMoriah Waterland * If doing a partial installation (creating a
4905c51f124SMoriah Waterland * non-global zone), extra steps need to be taken:
4915c51f124SMoriah Waterland *
492*6e1ae2a3SGary Pennington * If the file is not type 'e' and not type 'v' and
4935c51f124SMoriah Waterland * the class is "none": then the file must already
4945c51f124SMoriah Waterland * exist (as a result of the initial non-global zone
4955c51f124SMoriah Waterland * installation which caused all non-e/v files to be
4965c51f124SMoriah Waterland * copied from the global zone to the non-global
4975c51f124SMoriah Waterland * zone). If this is the case, verify that the file
4985c51f124SMoriah Waterland * exists and has the correct attributes.
4995c51f124SMoriah Waterland */
5005c51f124SMoriah Waterland
5015c51f124SMoriah Waterland if (is_partial_inst() != 0) {
5025c51f124SMoriah Waterland
5035c51f124SMoriah Waterland /*
5045c51f124SMoriah Waterland * if not type 'e|v' and class 'none', then the
5055c51f124SMoriah Waterland * file must already exist.
5065c51f124SMoriah Waterland */
5075c51f124SMoriah Waterland
5085c51f124SMoriah Waterland if ((ept->ftype != 'e') &&
5095c51f124SMoriah Waterland (ept->ftype != 'v') &&
5105c51f124SMoriah Waterland (strcmp(cl_nam(ept->pkg_class_idx),
5115c51f124SMoriah Waterland "none") == 0)) {
5125c51f124SMoriah Waterland
5135c51f124SMoriah Waterland /* is file changed? */
5145c51f124SMoriah Waterland n = finalck(ept, 1, 1, B_TRUE);
5155c51f124SMoriah Waterland
516*6e1ae2a3SGary Pennington /* not - ok - warn */
517*6e1ae2a3SGary Pennington if (n != 0) {
5185c51f124SMoriah Waterland /* output warning message */
5195c51f124SMoriah Waterland logerr(NOTE_INSTVOL_FINALCKFAIL,
520*6e1ae2a3SGary Pennington pkginst, ext->map_path);
5215c51f124SMoriah Waterland }
5225c51f124SMoriah Waterland continue;
5235c51f124SMoriah Waterland }
5245c51f124SMoriah Waterland }
5255c51f124SMoriah Waterland
5265c51f124SMoriah Waterland /*
5275c51f124SMoriah Waterland * Copy from source media to target path and fix file
5285c51f124SMoriah Waterland * mode and permission now in case installation halted.
5295c51f124SMoriah Waterland */
5305c51f124SMoriah Waterland
5315c51f124SMoriah Waterland /*
5325c51f124SMoriah Waterland * If the filesystem is read-only don't attempt
5335c51f124SMoriah Waterland * to copy a file. Just check that the content
5345c51f124SMoriah Waterland * and attributes of the file are correct.
5355c51f124SMoriah Waterland *
5365c51f124SMoriah Waterland * Normally this doesn't happen, because files,
5375c51f124SMoriah Waterland * which don't change, are not returned by
538*6e1ae2a3SGary Pennington * domerg().
5395c51f124SMoriah Waterland */
5405c51f124SMoriah Waterland n = 0;
5415c51f124SMoriah Waterland if (is_fs_writeable(ept->path,
5425c51f124SMoriah Waterland &(ext->fsys_value)))
5435c51f124SMoriah Waterland n = cppath(MODE_SET|DIR_DISPLAY, srcp,
5445c51f124SMoriah Waterland dstp, ept->ainfo.mode);
5455c51f124SMoriah Waterland
5465c51f124SMoriah Waterland if (n != 0) {
5475c51f124SMoriah Waterland warnflag++;
5485c51f124SMoriah Waterland } else if (!finalck(ept, 1, 1, B_FALSE)) {
5495c51f124SMoriah Waterland /*
5505c51f124SMoriah Waterland * everything checks here
5515c51f124SMoriah Waterland */
5525c51f124SMoriah Waterland mstat->attrchg = 0;
5535c51f124SMoriah Waterland mstat->contchg = 0;
5545c51f124SMoriah Waterland }
5555c51f124SMoriah Waterland
5565c51f124SMoriah Waterland /* NOTE: a package object was updated */
5575c51f124SMoriah Waterland
5585c51f124SMoriah Waterland if (updated == (char *)NULL) {
5595c51f124SMoriah Waterland echoDebug(DBG_INSTVOL_OBJ_UPDATED, dstp);
5605c51f124SMoriah Waterland updated = dstp;
5615c51f124SMoriah Waterland }
5625c51f124SMoriah Waterland }
5635c51f124SMoriah Waterland
5645c51f124SMoriah Waterland /*
5655c51f124SMoriah Waterland * We have now completed processing of all pathnames
5665c51f124SMoriah Waterland * associated with this volume and class.
5675c51f124SMoriah Waterland */
5685c51f124SMoriah Waterland if (cl_iscript(classidx)) {
5695c51f124SMoriah Waterland /*
5705c51f124SMoriah Waterland * Execute appropriate class action script
5715c51f124SMoriah Waterland * with list of source/destination pathnames
5725c51f124SMoriah Waterland * as the input to the script.
5735c51f124SMoriah Waterland */
5745c51f124SMoriah Waterland
5755c51f124SMoriah Waterland if (chdir(pkgbin)) {
5765c51f124SMoriah Waterland progerr(ERR_CHGDIR, pkgbin);
5775c51f124SMoriah Waterland quit(99);
5785c51f124SMoriah Waterland }
5795c51f124SMoriah Waterland
5805c51f124SMoriah Waterland if (listfp) {
5815c51f124SMoriah Waterland (void) fclose(listfp);
5825c51f124SMoriah Waterland }
5835c51f124SMoriah Waterland
584*6e1ae2a3SGary Pennington /* nothing updated */
5855c51f124SMoriah Waterland
5865c51f124SMoriah Waterland echoDebug(DBG_INSTVOL_CAS_INFO, is_partial_inst(),
587*6e1ae2a3SGary Pennington updated ? updated : "");
5885c51f124SMoriah Waterland
5895c51f124SMoriah Waterland if ((is_partial_inst() != 0) &&
590*6e1ae2a3SGary Pennington (updated == (char *)NULL)) {
5915c51f124SMoriah Waterland
5925c51f124SMoriah Waterland /*
5935c51f124SMoriah Waterland * installing in non-global zone, and no object
594*6e1ae2a3SGary Pennington * has been updated (installed/verified):
595*6e1ae2a3SGary Pennington * do not run the class action script.
5965c51f124SMoriah Waterland */
5975c51f124SMoriah Waterland
5985c51f124SMoriah Waterland echoDebug(DBG_INSTVOL_NOT_RUNNING_CAS,
5995c51f124SMoriah Waterland a_zoneName ? a_zoneName : "?",
6005c51f124SMoriah Waterland eocflag ? "ENDOFCLASS" :
6015c51f124SMoriah Waterland cl_iscript(classidx),
6025c51f124SMoriah Waterland cl_nam(classidx),
6035c51f124SMoriah Waterland cl_iscript(classidx));
6045c51f124SMoriah Waterland
6055c51f124SMoriah Waterland } else {
6065c51f124SMoriah Waterland /* run the class action script */
6075c51f124SMoriah Waterland
6085c51f124SMoriah Waterland echoDebug(DBG_INSTVOL_RUNNING_CAS,
6095c51f124SMoriah Waterland a_zoneName ? a_zoneName : "?",
6105c51f124SMoriah Waterland eocflag ? "ENDOFCLASS" :
6115c51f124SMoriah Waterland cl_iscript(classidx),
6125c51f124SMoriah Waterland cl_nam(classidx),
6135c51f124SMoriah Waterland cl_iscript(classidx));
6145c51f124SMoriah Waterland
6155c51f124SMoriah Waterland /* Use ULIMIT if supplied. */
6165c51f124SMoriah Waterland set_ulimit(cl_iscript(classidx), ERR_CASFAIL);
6175c51f124SMoriah Waterland
6185c51f124SMoriah Waterland if (eocflag) {
6195c51f124SMoriah Waterland /*
6205c51f124SMoriah Waterland * end of class detected.
6215c51f124SMoriah Waterland * Since there are no more volumes which
6225c51f124SMoriah Waterland * contain pathnames associated with
6235c51f124SMoriah Waterland * this class, execute class action
6245c51f124SMoriah Waterland * script with the ENDOFCLASS argument;
6255c51f124SMoriah Waterland * we do this even if none of the path
6265c51f124SMoriah Waterland * names associated with this class and
6275c51f124SMoriah Waterland * volume needed installation to
6285c51f124SMoriah Waterland * guarantee the class action script is
6295c51f124SMoriah Waterland * executed at least once during package
6305c51f124SMoriah Waterland * installation.
6315c51f124SMoriah Waterland */
6325c51f124SMoriah Waterland if (pkgverbose) {
6335c51f124SMoriah Waterland n = pkgexecl((listfp ?
6345c51f124SMoriah Waterland listfile : CAS_STDIN),
6355c51f124SMoriah Waterland CAS_STDOUT,
6365c51f124SMoriah Waterland CAS_USER, CAS_GRP,
6375c51f124SMoriah Waterland SHELL, "-x",
6385c51f124SMoriah Waterland cl_iscript(classidx),
6395c51f124SMoriah Waterland "ENDOFCLASS", NULL);
6405c51f124SMoriah Waterland } else {
6415c51f124SMoriah Waterland n = pkgexecl(
6425c51f124SMoriah Waterland (listfp ?
6435c51f124SMoriah Waterland listfile : CAS_STDIN),
6445c51f124SMoriah Waterland CAS_STDOUT, CAS_USER,
6455c51f124SMoriah Waterland CAS_GRP, SHELL,
6465c51f124SMoriah Waterland cl_iscript(classidx),
6475c51f124SMoriah Waterland "ENDOFCLASS", NULL);
6485c51f124SMoriah Waterland }
6495c51f124SMoriah Waterland ckreturn(n, ERR_CASFAIL);
6505c51f124SMoriah Waterland } else if (count) {
6515c51f124SMoriah Waterland /* execute class action script */
6525c51f124SMoriah Waterland if (pkgverbose) {
6535c51f124SMoriah Waterland n = pkgexecl(listfile,
6545c51f124SMoriah Waterland CAS_STDOUT, CAS_USER,
6555c51f124SMoriah Waterland CAS_GRP, SHELL, "-x",
6565c51f124SMoriah Waterland cl_iscript(classidx),
6575c51f124SMoriah Waterland NULL);
6585c51f124SMoriah Waterland } else {
6595c51f124SMoriah Waterland n = pkgexecl(listfile,
6605c51f124SMoriah Waterland CAS_STDOUT, CAS_USER,
6615c51f124SMoriah Waterland CAS_GRP, SHELL,
6625c51f124SMoriah Waterland cl_iscript(classidx),
6635c51f124SMoriah Waterland NULL);
6645c51f124SMoriah Waterland }
6655c51f124SMoriah Waterland ckreturn(n, ERR_CASFAIL);
6665c51f124SMoriah Waterland }
6675c51f124SMoriah Waterland
6685c51f124SMoriah Waterland /*
6695c51f124SMoriah Waterland * Ensure the mod times on disk match those
6705c51f124SMoriah Waterland * in the pkgmap. In this case, call cverify
6715c51f124SMoriah Waterland * with checksumming disabled, since the only
6725c51f124SMoriah Waterland * action that needs to be done is to verify
6735c51f124SMoriah Waterland * that the attributes are correct.
6745c51f124SMoriah Waterland */
6755c51f124SMoriah Waterland
6765c51f124SMoriah Waterland if ((rfp = regfiles_head) != NULL) {
6775c51f124SMoriah Waterland while (rfp != NULL) {
6785c51f124SMoriah Waterland ept = &(extlist[rfp->val]->cf_ent);
6795c51f124SMoriah Waterland cverify(1, &ept->ftype, ept->path,
6805c51f124SMoriah Waterland &ept->cinfo, 0);
6815c51f124SMoriah Waterland rfp = rfp->next;
6825c51f124SMoriah Waterland }
6835c51f124SMoriah Waterland regfiles_free();
6845c51f124SMoriah Waterland }
6855c51f124SMoriah Waterland
6865c51f124SMoriah Waterland clr_ulimit();
6875c51f124SMoriah Waterland
6885c51f124SMoriah Waterland if ((r_updated != (char **)NULL) &&
6895c51f124SMoriah Waterland (*r_updated == (char *)NULL) &&
6905c51f124SMoriah Waterland (updated == (char *)NULL)) {
6915c51f124SMoriah Waterland updated = "postinstall";
6925c51f124SMoriah Waterland echoDebug(DBG_INSTVOL_OBJ_UPDATED,
6935c51f124SMoriah Waterland updated);
6945c51f124SMoriah Waterland }
6955c51f124SMoriah Waterland }
6965c51f124SMoriah Waterland if (listfile) {
6975c51f124SMoriah Waterland (void) remove(listfile);
6985c51f124SMoriah Waterland }
6995c51f124SMoriah Waterland }
7005c51f124SMoriah Waterland
7015c51f124SMoriah Waterland if (eocflag && (!is_partial_inst() || (is_partial_inst() &&
7025c51f124SMoriah Waterland strcmp(cl_nam(classidx), "none") != 0))) {
7035c51f124SMoriah Waterland if (cl_dvfy(classidx) == QKVERIFY && !repl_permitted) {
7045c51f124SMoriah Waterland /*
7055c51f124SMoriah Waterland * The quick verify just fixes everything.
7065c51f124SMoriah Waterland * If it returns 0, all is well. If it
7075c51f124SMoriah Waterland * returns 1, then the class installation
7085c51f124SMoriah Waterland * was incomplete and we retry on the
7095c51f124SMoriah Waterland * stuff that failed in the conventional
7105c51f124SMoriah Waterland * way (without a CAS). this is primarily
7115c51f124SMoriah Waterland * to accomodate old archives such as are
7125c51f124SMoriah Waterland * found in pre-2.5 WOS; but, it is also
7135c51f124SMoriah Waterland * used when a critical dynamic library
7145c51f124SMoriah Waterland * is not archived with its class.
7155c51f124SMoriah Waterland */
7165c51f124SMoriah Waterland if (!fix_attributes(extlist, classidx)) {
7175c51f124SMoriah Waterland /*
7185c51f124SMoriah Waterland * Reset the CAS pointer. If the
7195c51f124SMoriah Waterland * function returns 0 then there
7205c51f124SMoriah Waterland * was no script there in the first
7215c51f124SMoriah Waterland * place and we'll just have to
7225c51f124SMoriah Waterland * call this a miss.
7235c51f124SMoriah Waterland */
7245c51f124SMoriah Waterland if (cl_deliscript(classidx))
7255c51f124SMoriah Waterland /*
7265c51f124SMoriah Waterland * Decrement classidx for
7275c51f124SMoriah Waterland * next pass.
7285c51f124SMoriah Waterland */
7295c51f124SMoriah Waterland classidx--;
7305c51f124SMoriah Waterland }
7315c51f124SMoriah Waterland } else {
7325c51f124SMoriah Waterland /*
7335c51f124SMoriah Waterland * Finalize merge. This checks to make sure
7345c51f124SMoriah Waterland * file attributes are correct and any links
7355c51f124SMoriah Waterland * specified are created.
7365c51f124SMoriah Waterland */
7375c51f124SMoriah Waterland (void) endofclass(extlist, classidx,
7385c51f124SMoriah Waterland (cl_iscript(classidx) ? 0 : 1),
73962224350SCasper H.S. Dik pkgserver, a_cfTmpVfp);
7405c51f124SMoriah Waterland }
7415c51f124SMoriah Waterland }
7425c51f124SMoriah Waterland }
7435c51f124SMoriah Waterland }
7445c51f124SMoriah Waterland
7455c51f124SMoriah Waterland /*
7465c51f124SMoriah Waterland * Instead of creating links back to the GZ files the logic is
7475c51f124SMoriah Waterland * to let zdo recreate the files from the GZ then invoke pkgadd to
7485c51f124SMoriah Waterland * install the editable files and skip over any 'f'type files.
7495c51f124SMoriah Waterland * The commented out block is to create the links which should be
7505c51f124SMoriah Waterland * removed once the current code is tested to be correct.
7515c51f124SMoriah Waterland */
7525c51f124SMoriah Waterland
7535c51f124SMoriah Waterland /*
7545c51f124SMoriah Waterland * Go through extlist creating links for 'f'type files
7555c51f124SMoriah Waterland * if we're in a global zone. Note that this code lies
7565c51f124SMoriah Waterland * here instead of in the main loop to support CAF packages.
7575c51f124SMoriah Waterland * In a CAF package the files are installed by the i.none script
7585c51f124SMoriah Waterland * and don't exist until all files are done being processed, thus
7595c51f124SMoriah Waterland * the additional loop through extlist.
7605c51f124SMoriah Waterland */
7615c51f124SMoriah Waterland
7625c51f124SMoriah Waterland /*
7635c51f124SMoriah Waterland * output appropriate completion message
7645c51f124SMoriah Waterland */
7655c51f124SMoriah Waterland
7665c51f124SMoriah Waterland if (is_depend_pkginfo_DB() == B_TRUE) {
7675c51f124SMoriah Waterland /* updating database only (hollow package) */
7685c51f124SMoriah Waterland if (a_zoneName == (char *)NULL) {
7695c51f124SMoriah Waterland echo(MSG_DBUPD_N_N, part, nparts);
7705c51f124SMoriah Waterland } else {
7715c51f124SMoriah Waterland echo(MSG_DBUPD_N_N_LZ, part, nparts, a_zoneName);
7725c51f124SMoriah Waterland }
7735c51f124SMoriah Waterland } else if (tcount == 0) {
7745c51f124SMoriah Waterland /* updating package (non-hollow package) */
7755c51f124SMoriah Waterland if (a_zoneName == (char *)NULL) {
7765c51f124SMoriah Waterland echo(MSG_INST_N_N, part, nparts);
7775c51f124SMoriah Waterland } else {
7785c51f124SMoriah Waterland echo(MSG_INST_N_N_LZ, part, nparts, a_zoneName);
7795c51f124SMoriah Waterland }
7805c51f124SMoriah Waterland }
7815c51f124SMoriah Waterland
7825c51f124SMoriah Waterland /*
783*6e1ae2a3SGary Pennington * if any package objects were updated (not otherwise already in
784*6e1ae2a3SGary Pennington * existence), set the updated flag as appropriate
7855c51f124SMoriah Waterland */
7865c51f124SMoriah Waterland
7875c51f124SMoriah Waterland if (updated != (char *)NULL) {
7885c51f124SMoriah Waterland echoDebug(DBG_INSTVOL_OBJ_UPDATED, updated);
7895c51f124SMoriah Waterland if (r_updated != (char **)NULL) {
7905c51f124SMoriah Waterland *r_updated = updated;
7915c51f124SMoriah Waterland }
7925c51f124SMoriah Waterland }
7935c51f124SMoriah Waterland
7945c51f124SMoriah Waterland }
7955c51f124SMoriah Waterland
7965c51f124SMoriah Waterland /*
7975c51f124SMoriah Waterland * Name: domerg
7985c51f124SMoriah Waterland * Description: For the specified class, review each entry and return the array
7995c51f124SMoriah Waterland * index number of the next regular file to process. Hard links are
8005c51f124SMoriah Waterland * skipped (they are created in endofclass() and directories,
8015c51f124SMoriah Waterland * symlinks, pipes and devices are created here, as well as any
8025c51f124SMoriah Waterland * file that already exists and has the correct attributes.
8035c51f124SMoriah Waterland * Arguments: struct cfextra **extlist - [RO, *RW]
8045c51f124SMoriah Waterland * - Pointer to list of cfextra structures representing
8055c51f124SMoriah Waterland * the pkgmap of the package to be installed
8065c51f124SMoriah Waterland * int part - [RO, *RO]
8075c51f124SMoriah Waterland * - the part of the package currently being processed;
8085c51f124SMoriah Waterland * packages begin with part "1" and proceed for the
8095c51f124SMoriah Waterland * number (nparts) that comprise the package (volume).
8105c51f124SMoriah Waterland * int nparts - [RO, *RO]
8115c51f124SMoriah Waterland * - the number of parts the package is divided into
8125c51f124SMoriah Waterland * int myclass - [RO, *RO]
8135c51f124SMoriah Waterland * - index into class array of the current class
8145c51f124SMoriah Waterland * char **srcp - [RW, *RW]
8155c51f124SMoriah Waterland * - pointer to pointer to string representing the source
8165c51f124SMoriah Waterland * path for the next package to process - if this
8175c51f124SMoriah Waterland * function returns != DMRG_DONE then this pointer is
8185c51f124SMoriah Waterland * set to a pointer to a string representing the source
8195c51f124SMoriah Waterland * path for the next object from the package to process
8205c51f124SMoriah Waterland * char **dstp - [RW, *RW]
8215c51f124SMoriah Waterland * - pointer to pointer to string representing the target
8225c51f124SMoriah Waterland * path for the next package to process - if this
8235c51f124SMoriah Waterland * function returns != DMRG_DONE then this pointer is
8245c51f124SMoriah Waterland * set to a pointer to a string representing the target
8255c51f124SMoriah Waterland * path for the next object from the package to process
8265c51f124SMoriah Waterland * char **r_updated - [RO, *RW]
8275c51f124SMoriah Waterland * - pointer to pointer to string - set if the last path
828*6e1ae2a3SGary Pennington * returned exists or does not need updating. This is
829*6e1ae2a3SGary Pennington * always set when a path to be installed exists and
830*6e1ae2a3SGary Pennington * has the correct contents.
8315c51f124SMoriah Waterland * Returns: int
8325c51f124SMoriah Waterland * != DMRG_DONE - index into extlist of the next path to
8335c51f124SMoriah Waterland * be processed - that needs to be installed/copied
8345c51f124SMoriah Waterland * == DMRG_DONE - all entries processed
8355c51f124SMoriah Waterland */
8365c51f124SMoriah Waterland
8375c51f124SMoriah Waterland static int
domerg(struct cfextra ** extlist,int part,int nparts,int myclass,char ** srcp,char ** dstp,char ** r_updated)8385c51f124SMoriah Waterland domerg(struct cfextra **extlist, int part, int nparts,
8395c51f124SMoriah Waterland int myclass, char **srcp, char **dstp,
840*6e1ae2a3SGary Pennington char **r_updated)
8415c51f124SMoriah Waterland {
8425c51f124SMoriah Waterland boolean_t stateFlag = B_FALSE;
8435c51f124SMoriah Waterland int i;
8445c51f124SMoriah Waterland int msg_ugid;
8455c51f124SMoriah Waterland static int maxvol = 0;
8465c51f124SMoriah Waterland static int svindx = 0;
8475c51f124SMoriah Waterland static int svpart = 0;
8485c51f124SMoriah Waterland struct cfent *ept = (struct cfent *)NULL;
8495c51f124SMoriah Waterland struct mergstat *mstat = (struct mergstat *)NULL;
8505c51f124SMoriah Waterland
8515c51f124SMoriah Waterland /* reset returned path pointers */
8525c51f124SMoriah Waterland
8535c51f124SMoriah Waterland *dstp = (char *)NULL;
8545c51f124SMoriah Waterland *srcp = (char *)NULL;
8555c51f124SMoriah Waterland
8565c51f124SMoriah Waterland /* set to start or continue based on which part being processed */
8575c51f124SMoriah Waterland
8585c51f124SMoriah Waterland if (part != 0) {
8595c51f124SMoriah Waterland maxvol = 0;
8605c51f124SMoriah Waterland svindx = 0;
8615c51f124SMoriah Waterland svpart = part;
8625c51f124SMoriah Waterland } else {
8635c51f124SMoriah Waterland i = svindx;
8645c51f124SMoriah Waterland part = svpart;
8655c51f124SMoriah Waterland }
8665c51f124SMoriah Waterland
8675c51f124SMoriah Waterland /*
8685c51f124SMoriah Waterland * This goes through the pkgmap entries one by one testing them
8695c51f124SMoriah Waterland * for inclusion in the package database as well as for validity
8705c51f124SMoriah Waterland * against existing files.
8715c51f124SMoriah Waterland */
8725c51f124SMoriah Waterland for (i = svindx; extlist[i]; i++) {
8735c51f124SMoriah Waterland ept = &(extlist[i]->cf_ent);
8745c51f124SMoriah Waterland mstat = &(extlist[i]->mstat);
8755c51f124SMoriah Waterland
8765c51f124SMoriah Waterland /* if this isn't the class of current interest, skip it */
8775c51f124SMoriah Waterland
8785c51f124SMoriah Waterland if (myclass != ept->pkg_class_idx) {
8795c51f124SMoriah Waterland continue;
8805c51f124SMoriah Waterland }
8815c51f124SMoriah Waterland
8825c51f124SMoriah Waterland /* if the class is invalid, announce it & exit */
8835c51f124SMoriah Waterland if (ept->pkg_class_idx == -1) {
8845c51f124SMoriah Waterland progerr(ERR_CLIDX, ept->pkg_class_idx,
8855c51f124SMoriah Waterland (ept->path && *ept->path) ? ept->path : "unknown");
88662224350SCasper H.S. Dik logerr(gettext("pathname=%s"),
8875c51f124SMoriah Waterland (ept->path && *ept->path) ? ept->path : "unknown");
88862224350SCasper H.S. Dik logerr(gettext("class=<%s>"),
8895c51f124SMoriah Waterland (ept->pkg_class && *ept->pkg_class) ?
8905c51f124SMoriah Waterland ept->pkg_class : "Unknown");
89162224350SCasper H.S. Dik logerr(gettext("CLASSES=<%s>"),
8925c51f124SMoriah Waterland getenv("CLASSES") ? getenv("CLASSES") : "Not Set");
8935c51f124SMoriah Waterland quit(99);
8945c51f124SMoriah Waterland }
8955c51f124SMoriah Waterland
8965c51f124SMoriah Waterland /*
8975c51f124SMoriah Waterland * Next check to see if we are going to try to delete a
8985c51f124SMoriah Waterland * populated directory in some distressing way.
8995c51f124SMoriah Waterland */
9005c51f124SMoriah Waterland if (mstat->dir2nondir)
9015c51f124SMoriah Waterland if (dir_is_populated(ept->path)) {
9025c51f124SMoriah Waterland logerr(WRN_INSTVOL_NOTDIR, ept->path);
9035c51f124SMoriah Waterland warnflag++;
9045c51f124SMoriah Waterland mstat->denied = 1; /* install denied! */
9055c51f124SMoriah Waterland continue;
9065c51f124SMoriah Waterland } else { /* Replace is OK. */
9075c51f124SMoriah Waterland /*
9085c51f124SMoriah Waterland * Remove this directory, so it won't
9095c51f124SMoriah Waterland * interfere with creation of the new object.
9105c51f124SMoriah Waterland */
9115c51f124SMoriah Waterland if (rmdir(ept->path)) {
9125c51f124SMoriah Waterland /*
9135c51f124SMoriah Waterland * If it didn't work, there's nothing
9145c51f124SMoriah Waterland * we can do. To continue would
9155c51f124SMoriah Waterland * likely corrupt the filesystem
9165c51f124SMoriah Waterland * which is unacceptable.
9175c51f124SMoriah Waterland */
9185c51f124SMoriah Waterland progerr(ERR_RMDIR, ept->path);
9195c51f124SMoriah Waterland quit(99);
9205c51f124SMoriah Waterland }
9215c51f124SMoriah Waterland
9225c51f124SMoriah Waterland repl_permitted = 1; /* flag it */
9235c51f124SMoriah Waterland }
9245c51f124SMoriah Waterland
9255c51f124SMoriah Waterland /* adjust the max volume number appropriately */
9265c51f124SMoriah Waterland
9275c51f124SMoriah Waterland if (ept->volno > maxvol) {
9285c51f124SMoriah Waterland maxvol = ept->volno;
9295c51f124SMoriah Waterland }
9305c51f124SMoriah Waterland
9315c51f124SMoriah Waterland /* if this part goes into another volume, skip it */
9325c51f124SMoriah Waterland
9335c51f124SMoriah Waterland if (part != ept->volno) {
9345c51f124SMoriah Waterland continue;
9355c51f124SMoriah Waterland }
9365c51f124SMoriah Waterland
9375c51f124SMoriah Waterland /*
9385c51f124SMoriah Waterland * If it's a conflicting file and it's not supposed to be
9395c51f124SMoriah Waterland * installed, note it and skip.
9405c51f124SMoriah Waterland */
9415c51f124SMoriah Waterland if (nocnflct && mstat->shared && ept->ftype != 'e') {
9425c51f124SMoriah Waterland if (mstat->contchg || mstat->attrchg) {
9435c51f124SMoriah Waterland echo(MSG_SHIGN, ept->path);
9445c51f124SMoriah Waterland }
9455c51f124SMoriah Waterland continue;
9465c51f124SMoriah Waterland }
9475c51f124SMoriah Waterland
9485c51f124SMoriah Waterland /*
9495c51f124SMoriah Waterland * If we want to set uid or gid but user says no, note it.
9505c51f124SMoriah Waterland * Remember that the actual mode bits in the structure have
9515c51f124SMoriah Waterland * already been adjusted and the mstat flag is telling us
9525c51f124SMoriah Waterland * about the original mode.
9535c51f124SMoriah Waterland */
9545c51f124SMoriah Waterland if (nosetuid && (mstat->setuid || mstat->setgid)) {
9555c51f124SMoriah Waterland msg_ugid = 1; /* don't repeat attribute message. */
9565c51f124SMoriah Waterland if (is_fs_writeable(ept->path,
9575c51f124SMoriah Waterland &(extlist[i]->fsys_value))) {
9585c51f124SMoriah Waterland if (!(mstat->contchg) && mstat->attrchg) {
9595c51f124SMoriah Waterland echo(MSG_UGMOD, ept->path);
9605c51f124SMoriah Waterland } else {
9615c51f124SMoriah Waterland echo(MSG_UGID, ept->path);
9625c51f124SMoriah Waterland }
9635c51f124SMoriah Waterland }
9645c51f124SMoriah Waterland } else {
9655c51f124SMoriah Waterland msg_ugid = 0;
9665c51f124SMoriah Waterland }
9675c51f124SMoriah Waterland
9685c51f124SMoriah Waterland switch (ept->ftype) {
9695c51f124SMoriah Waterland case 'l': /* hard link */
9705c51f124SMoriah Waterland /* links treated as object "update/skip" */
9715c51f124SMoriah Waterland stateFlag = B_TRUE;
9725c51f124SMoriah Waterland continue; /* defer to final proc */
9735c51f124SMoriah Waterland
9745c51f124SMoriah Waterland case 's': /* for symlink, verify without fix first */
9755c51f124SMoriah Waterland /* links treated as object "update/skip" */
9765c51f124SMoriah Waterland stateFlag = B_TRUE;
9775c51f124SMoriah Waterland
9785c51f124SMoriah Waterland /* Do this only for default verify */
9795c51f124SMoriah Waterland if (cl_dvfy(myclass) == DEFAULT) {
9805c51f124SMoriah Waterland if (averify(0, &ept->ftype,
9815c51f124SMoriah Waterland ept->path, &ept->ainfo))
9825c51f124SMoriah Waterland echo(MSG_SLINK, ept->path);
9835c51f124SMoriah Waterland }
9845c51f124SMoriah Waterland
9855c51f124SMoriah Waterland /*FALLTHRU*/
9865c51f124SMoriah Waterland
9875c51f124SMoriah Waterland case 'd': /* directory */
9885c51f124SMoriah Waterland case 'x': /* exclusive directory */
9895c51f124SMoriah Waterland case 'c': /* character special device */
9905c51f124SMoriah Waterland case 'b': /* block special device */
9915c51f124SMoriah Waterland case 'p': /* named pipe */
9925c51f124SMoriah Waterland /* these NOT treated as object "update/skip" */
9935c51f124SMoriah Waterland stateFlag = B_FALSE;
9945c51f124SMoriah Waterland
9955c51f124SMoriah Waterland /*
9965c51f124SMoriah Waterland * If we can't get to it for legitimate reasons,
9975c51f124SMoriah Waterland * don't try to verify it.
9985c51f124SMoriah Waterland */
999*6e1ae2a3SGary Pennington if (is_remote_fs(ept->path,
10005c51f124SMoriah Waterland &(extlist[i]->fsys_value)) &&
10015c51f124SMoriah Waterland !is_fs_writeable(ept->path,
10025c51f124SMoriah Waterland &(extlist[i]->fsys_value))) {
10035c51f124SMoriah Waterland mstat->attrchg = 0;
10045c51f124SMoriah Waterland mstat->contchg = 0;
10055c51f124SMoriah Waterland break;
10065c51f124SMoriah Waterland }
10075c51f124SMoriah Waterland
10085c51f124SMoriah Waterland if (averify(1, &ept->ftype, ept->path,
10095c51f124SMoriah Waterland &ept->ainfo) == 0) {
10105c51f124SMoriah Waterland mstat->contchg = mstat->attrchg = 0;
10115c51f124SMoriah Waterland } else {
10125c51f124SMoriah Waterland progerr(ERR_CREATE_PKGOBJ, ept->path);
10135c51f124SMoriah Waterland logerr(getErrbufAddr());
10145c51f124SMoriah Waterland warnflag++;
10155c51f124SMoriah Waterland }
10165c51f124SMoriah Waterland
10175c51f124SMoriah Waterland break;
10185c51f124SMoriah Waterland
10195c51f124SMoriah Waterland case 'i': /* information file */
10205c51f124SMoriah Waterland /* not treated as object "update/skip" */
10215c51f124SMoriah Waterland stateFlag = B_FALSE;
10225c51f124SMoriah Waterland break;
10235c51f124SMoriah Waterland
10245c51f124SMoriah Waterland default:
10255c51f124SMoriah Waterland /* all files treated as object "update/skip" */
10265c51f124SMoriah Waterland stateFlag = B_TRUE;
10275c51f124SMoriah Waterland break;
10285c51f124SMoriah Waterland }
10295c51f124SMoriah Waterland
10305c51f124SMoriah Waterland /*
10315c51f124SMoriah Waterland * Both contchg and shared flags have to be taken into
10325c51f124SMoriah Waterland * account. contchg is set if the file is already present
10335c51f124SMoriah Waterland * in the package database, if it does not exist or if it
10345c51f124SMoriah Waterland * exists and is modified.
10355c51f124SMoriah Waterland * The shared flag is set when 'e' or 'v' file is not
10365c51f124SMoriah Waterland * present in the package database, exists and is not
10375c51f124SMoriah Waterland * modified. It also has to be checked here.
10385c51f124SMoriah Waterland * Shared flag is also set when file is present in package
10395c51f124SMoriah Waterland * database and owned by more than one package, but for
10405c51f124SMoriah Waterland * this case contchg has already been set.
10415c51f124SMoriah Waterland */
10425c51f124SMoriah Waterland if (mstat->contchg || (mstat->shared &&
10435c51f124SMoriah Waterland ((ept->ftype == 'e') || (ept->ftype == 'v')))) {
10445c51f124SMoriah Waterland *dstp = ept->path;
10455c51f124SMoriah Waterland if ((ept->ftype == 'f') || (ept->ftype == 'e') ||
10465c51f124SMoriah Waterland (ept->ftype == 'v')) {
10475c51f124SMoriah Waterland *srcp = ept->ainfo.local;
10485c51f124SMoriah Waterland if (is_partial_inst() != 0) {
10495c51f124SMoriah Waterland if (*srcp[0] == '~') {
1050d676c667Sphaniram rampura krishnamurthy - Sun Microsystems - Bangalore India /* Done only for C style */
1051d676c667Sphaniram rampura krishnamurthy - Sun Microsystems - Bangalore India char *tmp_ptr;
1052d676c667Sphaniram rampura krishnamurthy - Sun Microsystems - Bangalore India tmp_ptr = extlist[i]->map_path;
1053d676c667Sphaniram rampura krishnamurthy - Sun Microsystems - Bangalore India if (ept->ftype != 'f') {
1054d676c667Sphaniram rampura krishnamurthy - Sun Microsystems - Bangalore India /*
1055d676c667Sphaniram rampura krishnamurthy - Sun Microsystems - Bangalore India * translate source
1056d676c667Sphaniram rampura krishnamurthy - Sun Microsystems - Bangalore India * pathname
1057d676c667Sphaniram rampura krishnamurthy - Sun Microsystems - Bangalore India */
1058d676c667Sphaniram rampura krishnamurthy - Sun Microsystems - Bangalore India *srcp =
1059d676c667Sphaniram rampura krishnamurthy - Sun Microsystems - Bangalore India srcpath(instdir,
1060d676c667Sphaniram rampura krishnamurthy - Sun Microsystems - Bangalore India tmp_ptr,
1061d676c667Sphaniram rampura krishnamurthy - Sun Microsystems - Bangalore India part,
1062d676c667Sphaniram rampura krishnamurthy - Sun Microsystems - Bangalore India nparts);
1063d676c667Sphaniram rampura krishnamurthy - Sun Microsystems - Bangalore India } else {
1064d676c667Sphaniram rampura krishnamurthy - Sun Microsystems - Bangalore India /*
1065d676c667Sphaniram rampura krishnamurthy - Sun Microsystems - Bangalore India * instdir has the absolute path
1066d676c667Sphaniram rampura krishnamurthy - Sun Microsystems - Bangalore India * to saveSpoolInstallDir for
1067d676c667Sphaniram rampura krishnamurthy - Sun Microsystems - Bangalore India * the package. This is only
1068d676c667Sphaniram rampura krishnamurthy - Sun Microsystems - Bangalore India * useful for 'e','v' types.
1069d676c667Sphaniram rampura krishnamurthy - Sun Microsystems - Bangalore India *
1070d676c667Sphaniram rampura krishnamurthy - Sun Microsystems - Bangalore India * For 'f', we generate the
1071d676c667Sphaniram rampura krishnamurthy - Sun Microsystems - Bangalore India * absolute src path with the
1072d676c667Sphaniram rampura krishnamurthy - Sun Microsystems - Bangalore India * help of install root and the
1073d676c667Sphaniram rampura krishnamurthy - Sun Microsystems - Bangalore India * basedir.
1074d676c667Sphaniram rampura krishnamurthy - Sun Microsystems - Bangalore India */
1075d676c667Sphaniram rampura krishnamurthy - Sun Microsystems - Bangalore India *srcp = trans_srcp_pi(
1076d676c667Sphaniram rampura krishnamurthy - Sun Microsystems - Bangalore India ept->ainfo.local);
1077d676c667Sphaniram rampura krishnamurthy - Sun Microsystems - Bangalore India }
10785c51f124SMoriah Waterland } else {
10795c51f124SMoriah Waterland *srcp = extlist[i]->map_path;
10805c51f124SMoriah Waterland }
10815c51f124SMoriah Waterland } else {
10825c51f124SMoriah Waterland if (*srcp[0] == '~') {
10835c51f124SMoriah Waterland /* translate source pathname */
10845c51f124SMoriah Waterland *srcp = srcpath(instdir,
10855c51f124SMoriah Waterland &(ept->ainfo.local[1]),
10865c51f124SMoriah Waterland part, nparts);
10875c51f124SMoriah Waterland }
10885c51f124SMoriah Waterland }
10895c51f124SMoriah Waterland
10905c51f124SMoriah Waterland echoDebug(DBG_DOMERG_NO_SUCH_FILE,
10915c51f124SMoriah Waterland ept->ftype, cl_nam(ept->pkg_class_idx),
10925c51f124SMoriah Waterland ept->path);
10935c51f124SMoriah Waterland } else {
10945c51f124SMoriah Waterland /*
10955c51f124SMoriah Waterland * At this point, we're returning a non-file
10965c51f124SMoriah Waterland * that couldn't be created in the standard
10975c51f124SMoriah Waterland * way. If it refers to a filesystem that is
10985c51f124SMoriah Waterland * not writeable by us, don't waste the
10995c51f124SMoriah Waterland * calling process's time.
11005c51f124SMoriah Waterland */
11015c51f124SMoriah Waterland if (!is_fs_writeable(ept->path,
11025c51f124SMoriah Waterland &(extlist[i]->fsys_value))) {
11035c51f124SMoriah Waterland echoDebug(DBG_DOMERG_NOT_WRITABLE,
11045c51f124SMoriah Waterland ept->ftype,
11055c51f124SMoriah Waterland cl_nam(ept->pkg_class_idx),
11065c51f124SMoriah Waterland ept->path);
11075c51f124SMoriah Waterland continue;
11085c51f124SMoriah Waterland }
11095c51f124SMoriah Waterland
11105c51f124SMoriah Waterland *srcp = NULL;
11115c51f124SMoriah Waterland echoDebug(DBG_DOMERG_NOT_THERE,
11125c51f124SMoriah Waterland ept->ftype, cl_nam(ept->pkg_class_idx),
11135c51f124SMoriah Waterland ept->path);
11145c51f124SMoriah Waterland }
11155c51f124SMoriah Waterland
11165c51f124SMoriah Waterland svindx = i+1;
11175c51f124SMoriah Waterland backup(*dstp, 1);
11185c51f124SMoriah Waterland return (i);
11195c51f124SMoriah Waterland }
11205c51f124SMoriah Waterland
11215c51f124SMoriah Waterland if (mstat->attrchg) {
11225c51f124SMoriah Waterland backup(ept->path, 0);
11235c51f124SMoriah Waterland if (!msg_ugid)
11245c51f124SMoriah Waterland echo(MSG_ATTRIB, ept->path);
11255c51f124SMoriah Waterland
11265c51f124SMoriah Waterland /* fix the attributes now for robustness sake */
11275c51f124SMoriah Waterland if (averify(1, &ept->ftype,
11285c51f124SMoriah Waterland ept->path,
11295c51f124SMoriah Waterland &ept->ainfo) == 0) {
11305c51f124SMoriah Waterland mstat->attrchg = 0;
11315c51f124SMoriah Waterland }
11325c51f124SMoriah Waterland }
11335c51f124SMoriah Waterland
11345c51f124SMoriah Waterland /*
1135*6e1ae2a3SGary Pennington * package object exists, or does not need updating:
1136*6e1ae2a3SGary Pennington * treat the object as if it were "updated"
11375c51f124SMoriah Waterland */
11385c51f124SMoriah Waterland
11395c51f124SMoriah Waterland /* LINTED warning: statement has no consequent: if */
11405c51f124SMoriah Waterland if ((stateFlag == B_FALSE) || (ept == (struct cfent *)NULL)) {
11415c51f124SMoriah Waterland /*
11425c51f124SMoriah Waterland * the object in question is a directory or special
11435c51f124SMoriah Waterland * file - the fact that this type of object already
11445c51f124SMoriah Waterland * exists or does not need updating must not trigger
1145*6e1ae2a3SGary Pennington * the object updated indication - that would cause
1146*6e1ae2a3SGary Pennington * class action scripts to be run when installing a
1147*6e1ae2a3SGary Pennington * new non-global zone
11485c51f124SMoriah Waterland */
11495c51f124SMoriah Waterland } else {
11505c51f124SMoriah Waterland if (r_updated != (char **)NULL) {
11515c51f124SMoriah Waterland if (*r_updated == (char *)NULL) {
11525c51f124SMoriah Waterland echoDebug(DBG_INSTVOL_OBJ_UPDATED,
11535c51f124SMoriah Waterland ept->path);
11545c51f124SMoriah Waterland }
11555c51f124SMoriah Waterland *r_updated = ept->path;
11565c51f124SMoriah Waterland }
11575c51f124SMoriah Waterland }
11585c51f124SMoriah Waterland }
11595c51f124SMoriah Waterland
11605c51f124SMoriah Waterland if (maxvol == part) {
11615c51f124SMoriah Waterland eocflag++; /* endofclass */
11625c51f124SMoriah Waterland }
11635c51f124SMoriah Waterland
11645c51f124SMoriah Waterland return (DMRG_DONE); /* no remaining entries on this volume */
11655c51f124SMoriah Waterland }
11665c51f124SMoriah Waterland
11675c51f124SMoriah Waterland /*
11685c51f124SMoriah Waterland * Determine if the provided directory is populated. Return 0 if so and 1 if
11695c51f124SMoriah Waterland * not. This also returns 0 if the dirpath is not a directory or if it does
11705c51f124SMoriah Waterland * not exist.
11715c51f124SMoriah Waterland */
11725c51f124SMoriah Waterland static int
dir_is_populated(char * dirpath)11735c51f124SMoriah Waterland dir_is_populated(char *dirpath) {
11745c51f124SMoriah Waterland DIR *dirfp;
11755c51f124SMoriah Waterland struct dirent *drp;
11765c51f124SMoriah Waterland int retcode = 0;
11775c51f124SMoriah Waterland
11785c51f124SMoriah Waterland if ((dirfp = opendir(dirpath)) != NULL) {
11795c51f124SMoriah Waterland while ((drp = readdir(dirfp)) != NULL) {
11805c51f124SMoriah Waterland if (strcmp(drp->d_name, ".") == 0) {
11815c51f124SMoriah Waterland continue;
11825c51f124SMoriah Waterland }
11835c51f124SMoriah Waterland if (strcmp(drp->d_name, "..") == 0) {
11845c51f124SMoriah Waterland continue;
11855c51f124SMoriah Waterland }
11865c51f124SMoriah Waterland /*
11875c51f124SMoriah Waterland * If we get here, there's a real file in the
11885c51f124SMoriah Waterland * directory
11895c51f124SMoriah Waterland */
11905c51f124SMoriah Waterland retcode = 1;
11915c51f124SMoriah Waterland break;
11925c51f124SMoriah Waterland }
11935c51f124SMoriah Waterland (void) closedir(dirfp);
11945c51f124SMoriah Waterland }
11955c51f124SMoriah Waterland
11965c51f124SMoriah Waterland return (retcode);
11975c51f124SMoriah Waterland }
11985c51f124SMoriah Waterland
11995c51f124SMoriah Waterland /*
12005c51f124SMoriah Waterland * This is the function that cleans up the installation of this class.
12015c51f124SMoriah Waterland * This is where hard links get put in since the stuff they're linking
12025c51f124SMoriah Waterland * probably exists by now.
12035c51f124SMoriah Waterland */
12045c51f124SMoriah Waterland static void
endofclass(struct cfextra ** extlist,int myclass,int ckflag,PKGserver pkgserver,VFP_T ** a_cfTmpVfp)12055c51f124SMoriah Waterland endofclass(struct cfextra **extlist, int myclass, int ckflag,
120662224350SCasper H.S. Dik PKGserver pkgserver, VFP_T **a_cfTmpVfp)
12075c51f124SMoriah Waterland {
12085c51f124SMoriah Waterland char *temppath;
12095c51f124SMoriah Waterland char *pspool_loc;
12105c51f124SMoriah Waterland char *relocpath = (char *)NULL;
12115c51f124SMoriah Waterland char scrpt_dst[PATH_MAX];
12125c51f124SMoriah Waterland int flag;
12135c51f124SMoriah Waterland int idx;
12145c51f124SMoriah Waterland int n;
12155c51f124SMoriah Waterland struct cfent *ept; /* entry from the internal list */
12165c51f124SMoriah Waterland struct cfextra entry; /* entry from the package database */
12175c51f124SMoriah Waterland struct mergstat *mstat; /* merge status */
12185c51f124SMoriah Waterland struct pinfo *pinfo;
12195c51f124SMoriah Waterland
12205c51f124SMoriah Waterland /* open the package database (contents) file */
12215c51f124SMoriah Waterland
122262224350SCasper H.S. Dik if (!ocfile(&pkgserver, a_cfTmpVfp, pkgmap_blks)) {
12235c51f124SMoriah Waterland quit(99);
12245c51f124SMoriah Waterland }
12255c51f124SMoriah Waterland
12265c51f124SMoriah Waterland echo(MSG_VERIFYING_CLASS, cl_nam(myclass));
12275c51f124SMoriah Waterland
12285c51f124SMoriah Waterland for (idx = 0; /* void */; idx++) {
12295c51f124SMoriah Waterland /* find next package object in this class */
12305c51f124SMoriah Waterland while (extlist[idx]) {
12315c51f124SMoriah Waterland if ((extlist[idx]->cf_ent.ftype != 'i') &&
12325c51f124SMoriah Waterland extlist[idx]->cf_ent.pkg_class_idx == myclass) {
12335c51f124SMoriah Waterland break;
12345c51f124SMoriah Waterland }
12355c51f124SMoriah Waterland idx++;
12365c51f124SMoriah Waterland }
12375c51f124SMoriah Waterland
123862224350SCasper H.S. Dik if (extlist[idx] == NULL)
12395c51f124SMoriah Waterland break;
124062224350SCasper H.S. Dik
12415c51f124SMoriah Waterland
12425c51f124SMoriah Waterland ept = &(extlist[idx]->cf_ent);
12435c51f124SMoriah Waterland mstat = &(extlist[idx]->mstat);
12445c51f124SMoriah Waterland
124562224350SCasper H.S. Dik temppath = extlist[idx]->client_path;
12465c51f124SMoriah Waterland
12475c51f124SMoriah Waterland /*
12485c51f124SMoriah Waterland * At this point the only difference between the entry
12495c51f124SMoriah Waterland * in the contents file and the entry in extlist[] is
12505c51f124SMoriah Waterland * that the status indicator contains CONFIRM_CONT.
125162224350SCasper H.S. Dik * This function should return one or something is wrong.
12525c51f124SMoriah Waterland */
12535c51f124SMoriah Waterland
125462224350SCasper H.S. Dik n = srchcfile(&(entry.cf_ent), temppath, pkgserver);
12555c51f124SMoriah Waterland
125662224350SCasper H.S. Dik if (n < 0) {
12575c51f124SMoriah Waterland char *errstr = getErrstr();
12585c51f124SMoriah Waterland progerr(ERR_CFBAD);
125962224350SCasper H.S. Dik logerr(gettext("pathname=%s"),
12605c51f124SMoriah Waterland entry.cf_ent.path && *entry.cf_ent.path ?
12615c51f124SMoriah Waterland entry.cf_ent.path : "Unknown");
126262224350SCasper H.S. Dik logerr(gettext("problem=%s"),
12635c51f124SMoriah Waterland (errstr && *errstr) ? errstr : "Unknown");
12645c51f124SMoriah Waterland quit(99);
12655c51f124SMoriah Waterland } else if (n != 1) {
12665c51f124SMoriah Waterland /*
12675c51f124SMoriah Waterland * Check if path should be in the package
12685c51f124SMoriah Waterland * database.
12695c51f124SMoriah Waterland */
12705c51f124SMoriah Waterland if ((mstat->shared && nocnflct)) {
12715c51f124SMoriah Waterland continue;
12725c51f124SMoriah Waterland }
12735c51f124SMoriah Waterland progerr(ERR_CFMISSING, ept->path);
12745c51f124SMoriah Waterland quit(99);
12755c51f124SMoriah Waterland }
12765c51f124SMoriah Waterland
12775c51f124SMoriah Waterland /*
12785c51f124SMoriah Waterland * If merge was not appropriate for this object, now is the
12795c51f124SMoriah Waterland * time to choose one or the other.
12805c51f124SMoriah Waterland */
12815c51f124SMoriah Waterland if (mstat->denied) {
12825c51f124SMoriah Waterland /*
12835c51f124SMoriah Waterland * If installation was denied AFTER the package
12845c51f124SMoriah Waterland * database was updated, skip this. We've already
12855c51f124SMoriah Waterland * announced the discrepancy and the verifications
12865c51f124SMoriah Waterland * that follow will make faulty decisions based on
12875c51f124SMoriah Waterland * the ftype, which may not be correct.
12885c51f124SMoriah Waterland */
12895c51f124SMoriah Waterland progerr(ERR_COULD_NOT_INSTALL, ept->path);
12905c51f124SMoriah Waterland warnflag++;
12915c51f124SMoriah Waterland } else {
12925c51f124SMoriah Waterland if (mstat->replace)
12935c51f124SMoriah Waterland /*
12945c51f124SMoriah Waterland * This replaces the old entry with the new
12955c51f124SMoriah Waterland * one. This should never happen in the new
12965c51f124SMoriah Waterland * DB since the entries are already identical.
12975c51f124SMoriah Waterland */
12985c51f124SMoriah Waterland repl_cfent(ept, &(entry.cf_ent));
12995c51f124SMoriah Waterland
13005c51f124SMoriah Waterland /*
13015c51f124SMoriah Waterland * Validate this entry and change the status flag in
13025c51f124SMoriah Waterland * the package database.
13035c51f124SMoriah Waterland */
13045c51f124SMoriah Waterland if (ept->ftype == RM_RDY) {
13055c51f124SMoriah Waterland (void) eptstat(&(entry.cf_ent), pkginst,
13065c51f124SMoriah Waterland STAT_NEXT);
13075c51f124SMoriah Waterland } else {
13085c51f124SMoriah Waterland /* check the hard link now. */
13095c51f124SMoriah Waterland if (ept->ftype == 'l') {
13105c51f124SMoriah Waterland if (averify(0, &ept->ftype,
13115c51f124SMoriah Waterland ept->path, &ept->ainfo)) {
13125c51f124SMoriah Waterland echo(MSG_HRDLINK,
13135c51f124SMoriah Waterland ept->path);
13145c51f124SMoriah Waterland mstat->attrchg++;
13155c51f124SMoriah Waterland }
13165c51f124SMoriah Waterland }
13175c51f124SMoriah Waterland
13185c51f124SMoriah Waterland /*
13195c51f124SMoriah Waterland * Don't install or verify objects for
13205c51f124SMoriah Waterland * remote, read-only filesystems. We need
13215c51f124SMoriah Waterland * only flag them as shared from some server.
13225c51f124SMoriah Waterland * Otherwise, ok to do final check.
13235c51f124SMoriah Waterland */
13245c51f124SMoriah Waterland if (is_remote_fs(ept->path,
13255c51f124SMoriah Waterland &(extlist[idx]->fsys_value)) &&
13265c51f124SMoriah Waterland !is_fs_writeable(ept->path,
13275c51f124SMoriah Waterland &(extlist[idx]->fsys_value))) {
13285c51f124SMoriah Waterland flag = -1;
13295c51f124SMoriah Waterland } else {
13305c51f124SMoriah Waterland flag = finalck(ept, mstat->attrchg,
13315c51f124SMoriah Waterland (ckflag ? mstat->contchg :
1332*6e1ae2a3SGary Pennington (-1)), B_FALSE);
13335c51f124SMoriah Waterland }
13345c51f124SMoriah Waterland
13355c51f124SMoriah Waterland pinfo = entry.cf_ent.pinfo;
13365c51f124SMoriah Waterland
13375c51f124SMoriah Waterland /* Find this package in the list. */
13385c51f124SMoriah Waterland while (pinfo) {
13395c51f124SMoriah Waterland if (strcmp(pkginst, pinfo->pkg) == 0) {
13405c51f124SMoriah Waterland break;
13415c51f124SMoriah Waterland }
13425c51f124SMoriah Waterland pinfo = pinfo->next;
13435c51f124SMoriah Waterland }
13445c51f124SMoriah Waterland
13455c51f124SMoriah Waterland /*
13465c51f124SMoriah Waterland * If this package owns this file, then store
13475c51f124SMoriah Waterland * it in the database with the appropriate
13485c51f124SMoriah Waterland * status. Need to check pinfo in case it
13495c51f124SMoriah Waterland * points to NULL which could happen if
13505c51f124SMoriah Waterland * pinfo->next = NULL above.
13515c51f124SMoriah Waterland */
13525c51f124SMoriah Waterland if (pinfo) {
13535c51f124SMoriah Waterland if (flag < 0 || is_served(ept->path,
13545c51f124SMoriah Waterland &(extlist[idx]->fsys_value))) {
13555c51f124SMoriah Waterland /*
13565c51f124SMoriah Waterland * This is provided to
13575c51f124SMoriah Waterland * clients by a server.
13585c51f124SMoriah Waterland */
13595c51f124SMoriah Waterland pinfo->status = SERVED_FILE;
13605c51f124SMoriah Waterland } else {
13615c51f124SMoriah Waterland /*
13625c51f124SMoriah Waterland * It's either there or it's
13635c51f124SMoriah Waterland * not.
13645c51f124SMoriah Waterland */
13655c51f124SMoriah Waterland pinfo->status = (flag ?
13665c51f124SMoriah Waterland NOT_FND : ENTRY_OK);
13675c51f124SMoriah Waterland }
13685c51f124SMoriah Waterland }
13695c51f124SMoriah Waterland }
13705c51f124SMoriah Waterland }
13715c51f124SMoriah Waterland
13725c51f124SMoriah Waterland /*
13735c51f124SMoriah Waterland * If not installing from a partially spooled package, the
13745c51f124SMoriah Waterland * "save/pspool" area, and the file contents can be
13755c51f124SMoriah Waterland * changed (type is 'e' or 'v'), and the class IS "none":
13765c51f124SMoriah Waterland * copy the installed volatile file into the appropriate
13775c51f124SMoriah Waterland * location in the packages destination "save/pspool" area.
13785c51f124SMoriah Waterland */
13795c51f124SMoriah Waterland
13805c51f124SMoriah Waterland if ((!is_partial_inst()) &&
13815c51f124SMoriah Waterland ((ept->ftype == 'e') || (ept->ftype == 'v')) &&
13825c51f124SMoriah Waterland (strcmp(ept->pkg_class, "none") == 0)) {
13835c51f124SMoriah Waterland
13845c51f124SMoriah Waterland if (absolutepath(extlist[idx]->map_path) == B_TRUE &&
13855c51f124SMoriah Waterland parametricpath(extlist[idx]->cf_ent.ainfo.local,
13865c51f124SMoriah Waterland &relocpath) == B_FALSE) {
13875c51f124SMoriah Waterland pspool_loc = ROOT;
13885c51f124SMoriah Waterland } else {
13895c51f124SMoriah Waterland pspool_loc = RELOC;
13905c51f124SMoriah Waterland }
13915c51f124SMoriah Waterland
13925c51f124SMoriah Waterland n = snprintf(scrpt_dst, PATH_MAX, "%s/%s/%s",
13935c51f124SMoriah Waterland saveSpoolInstallDir, pspool_loc,
13945c51f124SMoriah Waterland relocpath ? relocpath : extlist[idx]->map_path);
13955c51f124SMoriah Waterland
13965c51f124SMoriah Waterland if (n >= PATH_MAX) {
13975c51f124SMoriah Waterland progerr(ERR_CREATE_PATH_2,
13985c51f124SMoriah Waterland saveSpoolInstallDir,
13995c51f124SMoriah Waterland extlist[idx]->map_path);
14005c51f124SMoriah Waterland quit(99);
14015c51f124SMoriah Waterland }
14025c51f124SMoriah Waterland
14035c51f124SMoriah Waterland /* copy, preserve source file mode */
14045c51f124SMoriah Waterland
14055c51f124SMoriah Waterland if (cppath(MODE_SRC, ept->path, scrpt_dst, 0644)) {
14065c51f124SMoriah Waterland warnflag++;
14075c51f124SMoriah Waterland }
14085c51f124SMoriah Waterland }
14095c51f124SMoriah Waterland
14105c51f124SMoriah Waterland /*
14115c51f124SMoriah Waterland * Now insert this potentially changed package database
14125c51f124SMoriah Waterland * entry.
14135c51f124SMoriah Waterland */
14145c51f124SMoriah Waterland if (entry.cf_ent.npkgs) {
14155c51f124SMoriah Waterland if (putcvfpfile(&(entry.cf_ent), *a_cfTmpVfp)) {
14165c51f124SMoriah Waterland quit(99);
14175c51f124SMoriah Waterland }
14185c51f124SMoriah Waterland }
14195c51f124SMoriah Waterland }
14205c51f124SMoriah Waterland
142162224350SCasper H.S. Dik n = swapcfile(pkgserver, a_cfTmpVfp, pkginst, dbchg);
14225c51f124SMoriah Waterland if (n == RESULT_WRN) {
14235c51f124SMoriah Waterland warnflag++;
14245c51f124SMoriah Waterland } else if (n == RESULT_ERR) {
14255c51f124SMoriah Waterland quit(99);
14265c51f124SMoriah Waterland }
14275c51f124SMoriah Waterland }
14285c51f124SMoriah Waterland
14295c51f124SMoriah Waterland /*
14305c51f124SMoriah Waterland * This function goes through and fixes all the attributes. This is called
14315c51f124SMoriah Waterland * out by using DST_QKVERIFY=this_class in the pkginfo file. The primary
14325c51f124SMoriah Waterland * use for this is to fix up files installed by a class action script
14335c51f124SMoriah Waterland * which is time-critical and reliable enough to assume likely success.
14345c51f124SMoriah Waterland * The first such format was for WOS compressed-cpio'd file sets.
14355c51f124SMoriah Waterland * The second format is the Class Archive Format.
14365c51f124SMoriah Waterland */
14375c51f124SMoriah Waterland static int
fix_attributes(struct cfextra ** extlist,int idx)14385c51f124SMoriah Waterland fix_attributes(struct cfextra **extlist, int idx)
14395c51f124SMoriah Waterland {
14405c51f124SMoriah Waterland struct cfextra *ext;
14415c51f124SMoriah Waterland int i, retval = 1;
14425c51f124SMoriah Waterland int nc = cl_getn();
14435c51f124SMoriah Waterland int n;
14445c51f124SMoriah Waterland struct cfent *ept;
14455c51f124SMoriah Waterland struct mergstat *mstat;
14465c51f124SMoriah Waterland char scrpt_dst[PATH_MAX];
14475c51f124SMoriah Waterland char *pspool_loc;
14485c51f124SMoriah Waterland char *relocpath = (char *)NULL;
14495c51f124SMoriah Waterland
14505c51f124SMoriah Waterland for (i = 0; extlist[i]; i++) {
14515c51f124SMoriah Waterland ext = extlist[i];
14525c51f124SMoriah Waterland ept = &(extlist[i]->cf_ent);
14535c51f124SMoriah Waterland mstat = &(extlist[i]->mstat);
14545c51f124SMoriah Waterland
14555c51f124SMoriah Waterland /*
14565c51f124SMoriah Waterland * We don't care about 'i'nfo files because, they
14575c51f124SMoriah Waterland * aren't laid down, 'e'ditable files can change
14585c51f124SMoriah Waterland * anyway, so who cares and 's'ymlinks were already
14595c51f124SMoriah Waterland * fixed in domerg(); however, certain old WOS
14605c51f124SMoriah Waterland * package symlinks depend on a bug in the old
14615c51f124SMoriah Waterland * pkgadd which has recently been expunged. For
14625c51f124SMoriah Waterland * those packages in 2.2, we repeat the verification
14635c51f124SMoriah Waterland * of symlinks.
14645c51f124SMoriah Waterland *
14655c51f124SMoriah Waterland * By 2.6 or so, ftype == 's' should be added to this.
14665c51f124SMoriah Waterland */
14675c51f124SMoriah Waterland if (ept->ftype == 'i' || ept->ftype == 'e' ||
14685c51f124SMoriah Waterland (mstat->shared && nocnflct))
14695c51f124SMoriah Waterland continue;
14705c51f124SMoriah Waterland
14715c51f124SMoriah Waterland if (mstat->denied) {
14725c51f124SMoriah Waterland progerr(ERR_COULD_NOT_INSTALL, ept->path);
14735c51f124SMoriah Waterland warnflag++;
14745c51f124SMoriah Waterland continue;
14755c51f124SMoriah Waterland }
14765c51f124SMoriah Waterland
14775c51f124SMoriah Waterland if (ept->pkg_class_idx < 0 || ept->pkg_class_idx > nc) {
14785c51f124SMoriah Waterland progerr(ERR_CLIDX, ept->pkg_class_idx,
14795c51f124SMoriah Waterland (ept->path && *ept->path) ? ept->path : "unknown");
14805c51f124SMoriah Waterland continue;
14815c51f124SMoriah Waterland }
14825c51f124SMoriah Waterland
14835c51f124SMoriah Waterland /* If this is the right class, do the fast verify. */
14845c51f124SMoriah Waterland if (ept->pkg_class_idx == idx) {
14855c51f124SMoriah Waterland if (fverify(1, &ept->ftype, ept->path,
14865c51f124SMoriah Waterland &ept->ainfo, &ept->cinfo) == 0) {
14875c51f124SMoriah Waterland mstat->attrchg = 0;
14885c51f124SMoriah Waterland mstat->contchg = 0;
14895c51f124SMoriah Waterland } else /* We'll try full verify later */
14905c51f124SMoriah Waterland retval = 0;
14915c51f124SMoriah Waterland }
14925c51f124SMoriah Waterland /*
14935c51f124SMoriah Waterland * Need to copy the installed volitale file back to the
14945c51f124SMoriah Waterland * partial spooled area if we are installing to a local zone
14955c51f124SMoriah Waterland * or similar installation method.
14965c51f124SMoriah Waterland */
14975c51f124SMoriah Waterland
14985c51f124SMoriah Waterland if ((!is_partial_inst()) &&
14995c51f124SMoriah Waterland ((ept->ftype == 'e') || (ept->ftype == 'v')) &&
15005c51f124SMoriah Waterland (strcmp(ept->pkg_class, "none") == 0)) {
15015c51f124SMoriah Waterland
15025c51f124SMoriah Waterland if (absolutepath(ext->map_path) == B_TRUE &&
15035c51f124SMoriah Waterland parametricpath(ext->cf_ent.ainfo.local,
15045c51f124SMoriah Waterland &relocpath) == B_FALSE) {
15055c51f124SMoriah Waterland pspool_loc = ROOT;
15065c51f124SMoriah Waterland } else {
15075c51f124SMoriah Waterland pspool_loc = RELOC;
15085c51f124SMoriah Waterland }
15095c51f124SMoriah Waterland
15105c51f124SMoriah Waterland n = snprintf(scrpt_dst, PATH_MAX, "%s/%s/%s",
15115c51f124SMoriah Waterland saveSpoolInstallDir, pspool_loc,
15125c51f124SMoriah Waterland relocpath ? relocpath : ext->map_path);
15135c51f124SMoriah Waterland
15145c51f124SMoriah Waterland if (n >= PATH_MAX) {
15155c51f124SMoriah Waterland progerr(ERR_CREATE_PATH_2,
15165c51f124SMoriah Waterland saveSpoolInstallDir,
15175c51f124SMoriah Waterland ext->map_path);
15185c51f124SMoriah Waterland quit(99);
15195c51f124SMoriah Waterland }
15205c51f124SMoriah Waterland
15215c51f124SMoriah Waterland /* copy, preserve source file mode */
15225c51f124SMoriah Waterland
15235c51f124SMoriah Waterland if (cppath(MODE_SRC, ept->path, scrpt_dst, 0644)) {
15245c51f124SMoriah Waterland warnflag++;
15255c51f124SMoriah Waterland }
15265c51f124SMoriah Waterland }
15275c51f124SMoriah Waterland }
15285c51f124SMoriah Waterland
15295c51f124SMoriah Waterland return (retval);
15305c51f124SMoriah Waterland }
15315c51f124SMoriah Waterland
15325c51f124SMoriah Waterland /*
15335c51f124SMoriah Waterland * Check to see if first charcter in path is a '/'.
15345c51f124SMoriah Waterland *
15355c51f124SMoriah Waterland * Return:
15365c51f124SMoriah Waterland * B_TRUE - if path is prepended with '/'
15375c51f124SMoriah Waterland * B_FALSE - if not
15385c51f124SMoriah Waterland */
15395c51f124SMoriah Waterland static boolean_t
absolutepath(char * path)15405c51f124SMoriah Waterland absolutepath(char *path)
15415c51f124SMoriah Waterland {
15425c51f124SMoriah Waterland assert(path != NULL);
15435c51f124SMoriah Waterland assert(path[0] != '\0');
15445c51f124SMoriah Waterland
15455c51f124SMoriah Waterland return (path[0] == '/' ? B_TRUE : B_FALSE);
15465c51f124SMoriah Waterland }
15475c51f124SMoriah Waterland
15485c51f124SMoriah Waterland /*
15495c51f124SMoriah Waterland * Check to see if path contains a '$' which makes it
15505c51f124SMoriah Waterland * a parametric path and therefore relocatable.
15515c51f124SMoriah Waterland *
15525c51f124SMoriah Waterland * Parameters:
15535c51f124SMoriah Waterland * path - The path to determine if it is absolute
15545c51f124SMoriah Waterland * relocpath - The value of the unconditioned path
15555c51f124SMoriah Waterland * i.e. $OPTDIR/usr/ls
15565c51f124SMoriah Waterland * Return:
15575c51f124SMoriah Waterland * B_TRUE - if path is a parametric path
15585c51f124SMoriah Waterland * B_FALSE - if not
15595c51f124SMoriah Waterland */
15605c51f124SMoriah Waterland static boolean_t
parametricpath(char * path,char ** relocpath)15615c51f124SMoriah Waterland parametricpath(char *path, char **relocpath)
15625c51f124SMoriah Waterland {
15635c51f124SMoriah Waterland assert(path != NULL);
15645c51f124SMoriah Waterland assert(path[0] != '\0');
15655c51f124SMoriah Waterland
15665c51f124SMoriah Waterland /*
15675c51f124SMoriah Waterland * If this is a valid parametric path then a '$' MUST occur at the
15685c51f124SMoriah Waterland * first or second character.
15695c51f124SMoriah Waterland */
15705c51f124SMoriah Waterland
15715c51f124SMoriah Waterland if (path[0] == '$' || path[1] == '$') {
15725c51f124SMoriah Waterland /*
15735c51f124SMoriah Waterland * If a parametric path exists then when copying the
15745c51f124SMoriah Waterland * path to the pspool directoy from the installing
15755c51f124SMoriah Waterland * pkgs reloc directory we want to use the uncononditional
15765c51f124SMoriah Waterland * varaiable path.
15775c51f124SMoriah Waterland */
15785c51f124SMoriah Waterland *relocpath = (path + 1);
15795c51f124SMoriah Waterland return (B_TRUE);
15805c51f124SMoriah Waterland }
15815c51f124SMoriah Waterland return (B_FALSE);
15825c51f124SMoriah Waterland }
15835c51f124SMoriah Waterland
15845c51f124SMoriah Waterland void
regfiles_free()15855c51f124SMoriah Waterland regfiles_free()
15865c51f124SMoriah Waterland {
15875c51f124SMoriah Waterland if (regfiles_head != NULL) {
15885c51f124SMoriah Waterland struct reg_files *rfp = regfiles_head->next;
15895c51f124SMoriah Waterland
15905c51f124SMoriah Waterland while (rfp != NULL) {
15915c51f124SMoriah Waterland free(regfiles_head);
15925c51f124SMoriah Waterland regfiles_head = rfp;
15935c51f124SMoriah Waterland rfp = regfiles_head->next;
15945c51f124SMoriah Waterland }
15955c51f124SMoriah Waterland free(regfiles_head);
15965c51f124SMoriah Waterland regfiles_head = NULL;
15975c51f124SMoriah Waterland }
15985c51f124SMoriah Waterland }
1599