1*5c51f124SMoriah Waterland /* 2*5c51f124SMoriah Waterland * CDDL HEADER START 3*5c51f124SMoriah Waterland * 4*5c51f124SMoriah Waterland * The contents of this file are subject to the terms of the 5*5c51f124SMoriah Waterland * Common Development and Distribution License (the "License"). 6*5c51f124SMoriah Waterland * You may not use this file except in compliance with the License. 7*5c51f124SMoriah Waterland * 8*5c51f124SMoriah Waterland * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9*5c51f124SMoriah Waterland * or http://www.opensolaris.org/os/licensing. 10*5c51f124SMoriah Waterland * See the License for the specific language governing permissions 11*5c51f124SMoriah Waterland * and limitations under the License. 12*5c51f124SMoriah Waterland * 13*5c51f124SMoriah Waterland * When distributing Covered Code, include this CDDL HEADER in each 14*5c51f124SMoriah Waterland * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15*5c51f124SMoriah Waterland * If applicable, add the following below this CDDL HEADER, with the 16*5c51f124SMoriah Waterland * fields enclosed by brackets "[]" replaced with your own identifying 17*5c51f124SMoriah Waterland * information: Portions Copyright [yyyy] [name of copyright owner] 18*5c51f124SMoriah Waterland * 19*5c51f124SMoriah Waterland * CDDL HEADER END 20*5c51f124SMoriah Waterland */ 21*5c51f124SMoriah Waterland 22*5c51f124SMoriah Waterland /* 23*5c51f124SMoriah Waterland * Copyright 2006 Sun Microsystems, Inc. All rights reserved. 24*5c51f124SMoriah Waterland * Use is subject to license terms. 25*5c51f124SMoriah Waterland */ 26*5c51f124SMoriah Waterland 27*5c51f124SMoriah Waterland /* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */ 28*5c51f124SMoriah Waterland /* All Rights Reserved */ 29*5c51f124SMoriah Waterland 30*5c51f124SMoriah Waterland 31*5c51f124SMoriah Waterland #include <stdio.h> 32*5c51f124SMoriah Waterland #include <errno.h> 33*5c51f124SMoriah Waterland #include <string.h> 34*5c51f124SMoriah Waterland #include <limits.h> 35*5c51f124SMoriah Waterland #include <stdlib.h> 36*5c51f124SMoriah Waterland #include <unistd.h> 37*5c51f124SMoriah Waterland #include <sys/types.h> 38*5c51f124SMoriah Waterland #include <pkgstrct.h> 39*5c51f124SMoriah Waterland #include <locale.h> 40*5c51f124SMoriah Waterland #include <libintl.h> 41*5c51f124SMoriah Waterland #include <pkglib.h> 42*5c51f124SMoriah Waterland #include "install.h" 43*5c51f124SMoriah Waterland #include "libinst.h" 44*5c51f124SMoriah Waterland #include "libadm.h" 45*5c51f124SMoriah Waterland 46*5c51f124SMoriah Waterland extern struct cfextra **extlist; 47*5c51f124SMoriah Waterland extern struct cfent **eptlist; 48*5c51f124SMoriah Waterland 49*5c51f124SMoriah Waterland extern char *pkginst; 50*5c51f124SMoriah Waterland 51*5c51f124SMoriah Waterland #define ERR_WRITE "write of intermediate contents file failed" 52*5c51f124SMoriah Waterland 53*5c51f124SMoriah Waterland static char *check_db_entry(VFP_T *, struct cfextra *, int, char *, int *); 54*5c51f124SMoriah Waterland 55*5c51f124SMoriah Waterland /*ARGSUSED*/ 56*5c51f124SMoriah Waterland int 57*5c51f124SMoriah Waterland dofinal(VFP_T *vfp, VFP_T *vfpo, int rmflag, char *myclass, char *prog) 58*5c51f124SMoriah Waterland { 59*5c51f124SMoriah Waterland struct cfextra entry; 60*5c51f124SMoriah Waterland int n, indx, dbchg; 61*5c51f124SMoriah Waterland char *save_path = NULL; 62*5c51f124SMoriah Waterland 63*5c51f124SMoriah Waterland entry.cf_ent.pinfo = NULL; 64*5c51f124SMoriah Waterland entry.fsys_value = BADFSYS; 65*5c51f124SMoriah Waterland entry.fsys_base = BADFSYS; 66*5c51f124SMoriah Waterland indx = 0; 67*5c51f124SMoriah Waterland 68*5c51f124SMoriah Waterland while (extlist && extlist[indx] && (extlist[indx]->cf_ent.ftype == 'i')) 69*5c51f124SMoriah Waterland indx++; 70*5c51f124SMoriah Waterland 71*5c51f124SMoriah Waterland dbchg = 0; 72*5c51f124SMoriah Waterland 73*5c51f124SMoriah Waterland while (n = srchcfile(&(entry.cf_ent), "*", vfp, vfpo)) { 74*5c51f124SMoriah Waterland if (n < 0) { 75*5c51f124SMoriah Waterland char *errstr = getErrstr(); 76*5c51f124SMoriah Waterland progerr(gettext 77*5c51f124SMoriah Waterland ("bad entry read in contents file")); 78*5c51f124SMoriah Waterland logerr(gettext("pathname=%s"), 79*5c51f124SMoriah Waterland (entry.cf_ent.path && 80*5c51f124SMoriah Waterland *(entry.cf_ent.path)) ? 81*5c51f124SMoriah Waterland entry.cf_ent.path : "Unknown"); 82*5c51f124SMoriah Waterland logerr(gettext("problem=%s"), 83*5c51f124SMoriah Waterland (errstr && *errstr) ? errstr : 84*5c51f124SMoriah Waterland "Unknown"); 85*5c51f124SMoriah Waterland quit(99); 86*5c51f124SMoriah Waterland } 87*5c51f124SMoriah Waterland save_path = check_db_entry( 88*5c51f124SMoriah Waterland vfpo, &entry, rmflag, myclass, &dbchg); 89*5c51f124SMoriah Waterland 90*5c51f124SMoriah Waterland /* Restore original server-relative path, if needed */ 91*5c51f124SMoriah Waterland if (save_path != NULL) { 92*5c51f124SMoriah Waterland entry.cf_ent.path = save_path; 93*5c51f124SMoriah Waterland save_path = NULL; 94*5c51f124SMoriah Waterland } 95*5c51f124SMoriah Waterland } 96*5c51f124SMoriah Waterland 97*5c51f124SMoriah Waterland return (dbchg); 98*5c51f124SMoriah Waterland } 99*5c51f124SMoriah Waterland 100*5c51f124SMoriah Waterland static char * 101*5c51f124SMoriah Waterland check_db_entry(VFP_T *vfpo, struct cfextra *entry, int rmflag, char *myclass, 102*5c51f124SMoriah Waterland int *dbchg) 103*5c51f124SMoriah Waterland { 104*5c51f124SMoriah Waterland struct pinfo *pinfo; 105*5c51f124SMoriah Waterland int fs_entry; 106*5c51f124SMoriah Waterland char *save_path = NULL; 107*5c51f124SMoriah Waterland char *tp; 108*5c51f124SMoriah Waterland 109*5c51f124SMoriah Waterland /* write this entry to the contents file */ 110*5c51f124SMoriah Waterland 111*5c51f124SMoriah Waterland if (myclass && strcmp(myclass, entry->cf_ent.pkg_class)) { 112*5c51f124SMoriah Waterland if (putcvfpfile(&entry->cf_ent, vfpo)) { 113*5c51f124SMoriah Waterland progerr(gettext(ERR_WRITE)); 114*5c51f124SMoriah Waterland quit(99); 115*5c51f124SMoriah Waterland } 116*5c51f124SMoriah Waterland return (NULL); 117*5c51f124SMoriah Waterland } 118*5c51f124SMoriah Waterland 119*5c51f124SMoriah Waterland /* 120*5c51f124SMoriah Waterland * Now scan each package instance holding this file or 121*5c51f124SMoriah Waterland * directory and see if it matches the package we are 122*5c51f124SMoriah Waterland * updating here. 123*5c51f124SMoriah Waterland */ 124*5c51f124SMoriah Waterland pinfo = entry->cf_ent.pinfo; 125*5c51f124SMoriah Waterland while (pinfo) { 126*5c51f124SMoriah Waterland if (strcmp(pkginst, pinfo->pkg) == 0) 127*5c51f124SMoriah Waterland break; 128*5c51f124SMoriah Waterland pinfo = pinfo->next; 129*5c51f124SMoriah Waterland } 130*5c51f124SMoriah Waterland 131*5c51f124SMoriah Waterland /* 132*5c51f124SMoriah Waterland * If pinfo == NULL at this point, then this file or 133*5c51f124SMoriah Waterland * directory isn't part of the package of interest. 134*5c51f124SMoriah Waterland * So the loop below executes only on files in the package 135*5c51f124SMoriah Waterland * of interest. 136*5c51f124SMoriah Waterland */ 137*5c51f124SMoriah Waterland 138*5c51f124SMoriah Waterland save_path = NULL; 139*5c51f124SMoriah Waterland 140*5c51f124SMoriah Waterland if (pinfo) { 141*5c51f124SMoriah Waterland if (rmflag && (pinfo->status == RM_RDY)) { 142*5c51f124SMoriah Waterland *dbchg = 1; 143*5c51f124SMoriah Waterland 144*5c51f124SMoriah Waterland (void) eptstat(&(entry->cf_ent), pkginst, '@'); 145*5c51f124SMoriah Waterland 146*5c51f124SMoriah Waterland if (entry->cf_ent.npkgs) { 147*5c51f124SMoriah Waterland if (putcvfpfile(&(entry->cf_ent), vfpo)) { 148*5c51f124SMoriah Waterland progerr(gettext(ERR_WRITE)); 149*5c51f124SMoriah Waterland quit(99); 150*5c51f124SMoriah Waterland } 151*5c51f124SMoriah Waterland } 152*5c51f124SMoriah Waterland return (NULL); 153*5c51f124SMoriah Waterland 154*5c51f124SMoriah Waterland } else if (!rmflag && (pinfo->status == INST_RDY)) { 155*5c51f124SMoriah Waterland *dbchg = 1; 156*5c51f124SMoriah Waterland 157*5c51f124SMoriah Waterland /* tp is the server-relative path */ 158*5c51f124SMoriah Waterland tp = fixpath(entry->cf_ent.path); 159*5c51f124SMoriah Waterland /* save_path is the cmd line path */ 160*5c51f124SMoriah Waterland save_path = entry->cf_ent.path; 161*5c51f124SMoriah Waterland /* entry has the server-relative path */ 162*5c51f124SMoriah Waterland entry->cf_ent.path = tp; 163*5c51f124SMoriah Waterland 164*5c51f124SMoriah Waterland /* 165*5c51f124SMoriah Waterland * The next if statement figures out how 166*5c51f124SMoriah Waterland * the contents file entry should be 167*5c51f124SMoriah Waterland * annotated. 168*5c51f124SMoriah Waterland * 169*5c51f124SMoriah Waterland * Don't install or verify objects for 170*5c51f124SMoriah Waterland * remote, read-only filesystems. We 171*5c51f124SMoriah Waterland * need only verify their presence and 172*5c51f124SMoriah Waterland * flag them appropriately from some 173*5c51f124SMoriah Waterland * server. Otherwise, ok to do final 174*5c51f124SMoriah Waterland * check. 175*5c51f124SMoriah Waterland */ 176*5c51f124SMoriah Waterland fs_entry = fsys(entry->cf_ent.path); 177*5c51f124SMoriah Waterland 178*5c51f124SMoriah Waterland if (is_remote_fs_n(fs_entry) && 179*5c51f124SMoriah Waterland !is_fs_writeable_n(fs_entry)) { 180*5c51f124SMoriah Waterland /* 181*5c51f124SMoriah Waterland * Mark it shared whether it's present 182*5c51f124SMoriah Waterland * or not. life's too funny for me 183*5c51f124SMoriah Waterland * to explain. 184*5c51f124SMoriah Waterland */ 185*5c51f124SMoriah Waterland pinfo->status = SERVED_FILE; 186*5c51f124SMoriah Waterland 187*5c51f124SMoriah Waterland /* 188*5c51f124SMoriah Waterland * restore for now. This may 189*5c51f124SMoriah Waterland * chg soon. 190*5c51f124SMoriah Waterland */ 191*5c51f124SMoriah Waterland entry->cf_ent.path = save_path; 192*5c51f124SMoriah Waterland } else { 193*5c51f124SMoriah Waterland /* 194*5c51f124SMoriah Waterland * If the object is accessible, check 195*5c51f124SMoriah Waterland * the new entry for existence and 196*5c51f124SMoriah Waterland * attributes. If there's a problem, 197*5c51f124SMoriah Waterland * mark it NOT_FND; otherwise, 198*5c51f124SMoriah Waterland * ENTRY_OK. 199*5c51f124SMoriah Waterland */ 200*5c51f124SMoriah Waterland if (is_mounted_n(fs_entry)) { 201*5c51f124SMoriah Waterland int n; 202*5c51f124SMoriah Waterland 203*5c51f124SMoriah Waterland n = finalck((&entry->cf_ent), 1, 1, 204*5c51f124SMoriah Waterland B_FALSE); 205*5c51f124SMoriah Waterland 206*5c51f124SMoriah Waterland pinfo->status = ENTRY_OK; 207*5c51f124SMoriah Waterland if (n != 0) { 208*5c51f124SMoriah Waterland pinfo->status = NOT_FND; 209*5c51f124SMoriah Waterland } 210*5c51f124SMoriah Waterland } 211*5c51f124SMoriah Waterland 212*5c51f124SMoriah Waterland /* 213*5c51f124SMoriah Waterland * It's not remote, read-only but it 214*5c51f124SMoriah Waterland * may look that way to the client. 215*5c51f124SMoriah Waterland * If it does, overwrite the above 216*5c51f124SMoriah Waterland * result - mark it shared. 217*5c51f124SMoriah Waterland */ 218*5c51f124SMoriah Waterland if (is_served_n(fs_entry)) 219*5c51f124SMoriah Waterland pinfo->status = SERVED_FILE; 220*5c51f124SMoriah Waterland 221*5c51f124SMoriah Waterland /* restore original path */ 222*5c51f124SMoriah Waterland entry->cf_ent.path = save_path; 223*5c51f124SMoriah Waterland /* and clear save_path */ 224*5c51f124SMoriah Waterland save_path = NULL; 225*5c51f124SMoriah Waterland } 226*5c51f124SMoriah Waterland } 227*5c51f124SMoriah Waterland } 228*5c51f124SMoriah Waterland 229*5c51f124SMoriah Waterland /* Output entry to contents file. */ 230*5c51f124SMoriah Waterland if (putcvfpfile(&(entry->cf_ent), vfpo)) { 231*5c51f124SMoriah Waterland progerr(gettext(ERR_WRITE)); 232*5c51f124SMoriah Waterland quit(99); 233*5c51f124SMoriah Waterland } 234*5c51f124SMoriah Waterland 235*5c51f124SMoriah Waterland return (save_path); 236*5c51f124SMoriah Waterland } 237