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 32*5c51f124SMoriah Waterland #include <stdio.h> 33*5c51f124SMoriah Waterland #include <errno.h> 34*5c51f124SMoriah Waterland #include <limits.h> 35*5c51f124SMoriah Waterland #include <stdlib.h> 36*5c51f124SMoriah Waterland #include <unistd.h> 37*5c51f124SMoriah Waterland #include <string.h> 38*5c51f124SMoriah Waterland #include <ctype.h> 39*5c51f124SMoriah Waterland #include <dirent.h> 40*5c51f124SMoriah Waterland #include <sys/types.h> 41*5c51f124SMoriah Waterland #include <pkgstrct.h> 42*5c51f124SMoriah Waterland #include <pkginfo.h> 43*5c51f124SMoriah Waterland #include <locale.h> 44*5c51f124SMoriah Waterland #include <libintl.h> 45*5c51f124SMoriah Waterland #include <pkglib.h> 46*5c51f124SMoriah Waterland #include "libinst.h" 47*5c51f124SMoriah Waterland #include "libadm.h" 48*5c51f124SMoriah Waterland #include "messages.h" 49*5c51f124SMoriah Waterland 50*5c51f124SMoriah Waterland #define LSIZE 256 51*5c51f124SMoriah Waterland #define NVERS 50 52*5c51f124SMoriah Waterland 53*5c51f124SMoriah Waterland /* 54*5c51f124SMoriah Waterland * internal global variables 55*5c51f124SMoriah Waterland */ 56*5c51f124SMoriah Waterland 57*5c51f124SMoriah Waterland static struct pkginfo info; 58*5c51f124SMoriah Waterland 59*5c51f124SMoriah Waterland static char type; 60*5c51f124SMoriah Waterland static char *alist[NVERS]; 61*5c51f124SMoriah Waterland static char *rmpkginst; 62*5c51f124SMoriah Waterland static char *vlist[NVERS]; 63*5c51f124SMoriah Waterland static char file[128]; 64*5c51f124SMoriah Waterland static char name[128]; 65*5c51f124SMoriah Waterland static char rmpkg[PKGSIZ+1]; 66*5c51f124SMoriah Waterland static char wabbrev[128]; 67*5c51f124SMoriah Waterland 68*5c51f124SMoriah Waterland static int errflg = 0; 69*5c51f124SMoriah Waterland static int nlist; 70*5c51f124SMoriah Waterland static int pkgexist; 71*5c51f124SMoriah Waterland static int pkgokay; 72*5c51f124SMoriah Waterland static int is_update; 73*5c51f124SMoriah Waterland static int is_patch_update; 74*5c51f124SMoriah Waterland 75*5c51f124SMoriah Waterland /* 76*5c51f124SMoriah Waterland * IMPORTANT NOTE: THE SIZE OF 'abbrev' IS HARD CODED INTO THE CHARACTER 77*5c51f124SMoriah Waterland * ARRAY SSCANF_FORMAT -- YOU MUST UPDATE BOTH VALUES AT THE SAME TIME!! 78*5c51f124SMoriah Waterland */ 79*5c51f124SMoriah Waterland 80*5c51f124SMoriah Waterland static char abbrev[128+1]; 81*5c51f124SMoriah Waterland static char *SSCANF_FORMAT = "%c %128s %[^\n]"; 82*5c51f124SMoriah Waterland 83*5c51f124SMoriah Waterland /* 84*5c51f124SMoriah Waterland * forward declarations 85*5c51f124SMoriah Waterland */ 86*5c51f124SMoriah Waterland 87*5c51f124SMoriah Waterland static void ckrdeps(boolean_t a_preinstallCheck); 88*5c51f124SMoriah Waterland static void ckpreq(FILE *fp, char *dname, boolean_t a_preinstallCheck); 89*5c51f124SMoriah Waterland static void deponme(char *pkginst, char *pkgname, 90*5c51f124SMoriah Waterland boolean_t a_preinstallCheck); 91*5c51f124SMoriah Waterland static void prereq(char *pkginst, char *pkgname, 92*5c51f124SMoriah Waterland boolean_t a_preinstallCheck); 93*5c51f124SMoriah Waterland static void incompat(char *pkginst, char *pkgname, 94*5c51f124SMoriah Waterland boolean_t a_preinstallCheck); 95*5c51f124SMoriah Waterland static int getline(FILE *fp); 96*5c51f124SMoriah Waterland 97*5c51f124SMoriah Waterland /* 98*5c51f124SMoriah Waterland * ***************************************************************************** 99*5c51f124SMoriah Waterland * global external (public) functions 100*5c51f124SMoriah Waterland * ***************************************************************************** 101*5c51f124SMoriah Waterland */ 102*5c51f124SMoriah Waterland 103*5c51f124SMoriah Waterland int 104*5c51f124SMoriah Waterland dockdeps(char *a_depfile, int a_removeFlag, boolean_t a_preinstallCheck) 105*5c51f124SMoriah Waterland { 106*5c51f124SMoriah Waterland FILE *fp; 107*5c51f124SMoriah Waterland int i; 108*5c51f124SMoriah Waterland char *inst; 109*5c51f124SMoriah Waterland 110*5c51f124SMoriah Waterland if (a_removeFlag) { 111*5c51f124SMoriah Waterland /* check removal dependencies */ 112*5c51f124SMoriah Waterland rmpkginst = a_depfile; 113*5c51f124SMoriah Waterland (void) strncpy(rmpkg, rmpkginst, PKGSIZ); 114*5c51f124SMoriah Waterland (void) strtok(rmpkg, "."); 115*5c51f124SMoriah Waterland (void) snprintf(file, sizeof (file), 116*5c51f124SMoriah Waterland "%s/%s/%s", pkgdir, rmpkginst, DEPEND_FILE); 117*5c51f124SMoriah Waterland if ((fp = fopen(file, "r")) == NULL) 118*5c51f124SMoriah Waterland goto done; 119*5c51f124SMoriah Waterland } else { 120*5c51f124SMoriah Waterland if ((fp = fopen(a_depfile, "r")) == NULL) { 121*5c51f124SMoriah Waterland progerr(ERR_CANNOT_OPEN_DEPEND_FILE, a_depfile, 122*5c51f124SMoriah Waterland strerror(errno)); 123*5c51f124SMoriah Waterland quit(99); 124*5c51f124SMoriah Waterland } 125*5c51f124SMoriah Waterland } 126*5c51f124SMoriah Waterland 127*5c51f124SMoriah Waterland while (getline(fp)) { 128*5c51f124SMoriah Waterland switch (type) { 129*5c51f124SMoriah Waterland case 'I': 130*5c51f124SMoriah Waterland case 'P': 131*5c51f124SMoriah Waterland if (a_removeFlag) { 132*5c51f124SMoriah Waterland continue; 133*5c51f124SMoriah Waterland } 134*5c51f124SMoriah Waterland break; 135*5c51f124SMoriah Waterland 136*5c51f124SMoriah Waterland case 'R': 137*5c51f124SMoriah Waterland if (!a_removeFlag) { 138*5c51f124SMoriah Waterland continue; 139*5c51f124SMoriah Waterland } 140*5c51f124SMoriah Waterland break; 141*5c51f124SMoriah Waterland 142*5c51f124SMoriah Waterland default: 143*5c51f124SMoriah Waterland errflg++; 144*5c51f124SMoriah Waterland progerr(ERR_UNKNOWN_DEPENDENCY, type); 145*5c51f124SMoriah Waterland break; 146*5c51f124SMoriah Waterland } 147*5c51f124SMoriah Waterland 148*5c51f124SMoriah Waterland /* check to see if any versions listed are installed */ 149*5c51f124SMoriah Waterland pkgexist = pkgokay = 0; 150*5c51f124SMoriah Waterland i = 0; 151*5c51f124SMoriah Waterland if (strchr(abbrev, '.')) { 152*5c51f124SMoriah Waterland progerr(ERR_PKGABRV, abbrev); 153*5c51f124SMoriah Waterland } 154*5c51f124SMoriah Waterland (void) snprintf(wabbrev, sizeof (wabbrev), "%s.*", abbrev); 155*5c51f124SMoriah Waterland 156*5c51f124SMoriah Waterland do { 157*5c51f124SMoriah Waterland inst = fpkginst(wabbrev, alist[i], vlist[i]); 158*5c51f124SMoriah Waterland if (inst && (pkginfo(&info, inst, NULL, NULL) == 0)) { 159*5c51f124SMoriah Waterland pkgexist++; 160*5c51f124SMoriah Waterland if ((info.status == PI_INSTALLED) || 161*5c51f124SMoriah Waterland (info.status == PI_PRESVR4)) 162*5c51f124SMoriah Waterland pkgokay++; 163*5c51f124SMoriah Waterland } 164*5c51f124SMoriah Waterland } while (++i < nlist); 165*5c51f124SMoriah Waterland (void) fpkginst(NULL); /* force closing/rewind of files */ 166*5c51f124SMoriah Waterland 167*5c51f124SMoriah Waterland if (!info.name) { 168*5c51f124SMoriah Waterland info.name = name; 169*5c51f124SMoriah Waterland } 170*5c51f124SMoriah Waterland 171*5c51f124SMoriah Waterland switch (type) { 172*5c51f124SMoriah Waterland case 'I': 173*5c51f124SMoriah Waterland incompat(abbrev, info.name, a_preinstallCheck); 174*5c51f124SMoriah Waterland break; 175*5c51f124SMoriah Waterland 176*5c51f124SMoriah Waterland case 'P': 177*5c51f124SMoriah Waterland prereq(abbrev, name, a_preinstallCheck); 178*5c51f124SMoriah Waterland break; 179*5c51f124SMoriah Waterland 180*5c51f124SMoriah Waterland case 'R': 181*5c51f124SMoriah Waterland deponme(abbrev, info.name, a_preinstallCheck); 182*5c51f124SMoriah Waterland } 183*5c51f124SMoriah Waterland } 184*5c51f124SMoriah Waterland (void) fclose(fp); 185*5c51f124SMoriah Waterland 186*5c51f124SMoriah Waterland done: 187*5c51f124SMoriah Waterland if (a_removeFlag) { 188*5c51f124SMoriah Waterland ckrdeps(a_preinstallCheck); 189*5c51f124SMoriah Waterland } 190*5c51f124SMoriah Waterland 191*5c51f124SMoriah Waterland return (errflg); 192*5c51f124SMoriah Waterland } 193*5c51f124SMoriah Waterland 194*5c51f124SMoriah Waterland void 195*5c51f124SMoriah Waterland setPatchUpdate(void) 196*5c51f124SMoriah Waterland { 197*5c51f124SMoriah Waterland is_patch_update = 1; 198*5c51f124SMoriah Waterland } 199*5c51f124SMoriah Waterland 200*5c51f124SMoriah Waterland int 201*5c51f124SMoriah Waterland isPatchUpdate(void) 202*5c51f124SMoriah Waterland { 203*5c51f124SMoriah Waterland return ((is_patch_update) ? 1 : 0); 204*5c51f124SMoriah Waterland } 205*5c51f124SMoriah Waterland 206*5c51f124SMoriah Waterland void 207*5c51f124SMoriah Waterland setUpdate(void) 208*5c51f124SMoriah Waterland { 209*5c51f124SMoriah Waterland is_update = 1; 210*5c51f124SMoriah Waterland } 211*5c51f124SMoriah Waterland 212*5c51f124SMoriah Waterland int 213*5c51f124SMoriah Waterland isUpdate(void) 214*5c51f124SMoriah Waterland { 215*5c51f124SMoriah Waterland return ((is_update) ? 1 : 0); 216*5c51f124SMoriah Waterland } 217*5c51f124SMoriah Waterland 218*5c51f124SMoriah Waterland /* 219*5c51f124SMoriah Waterland * ***************************************************************************** 220*5c51f124SMoriah Waterland * static internal (private) functions 221*5c51f124SMoriah Waterland * ***************************************************************************** 222*5c51f124SMoriah Waterland */ 223*5c51f124SMoriah Waterland 224*5c51f124SMoriah Waterland static void 225*5c51f124SMoriah Waterland incompat(char *pkginst, char *pkgname, boolean_t a_preinstallCheck) 226*5c51f124SMoriah Waterland { 227*5c51f124SMoriah Waterland char buf[512]; 228*5c51f124SMoriah Waterland 229*5c51f124SMoriah Waterland if (!pkgexist) 230*5c51f124SMoriah Waterland return; 231*5c51f124SMoriah Waterland 232*5c51f124SMoriah Waterland errflg++; 233*5c51f124SMoriah Waterland if (a_preinstallCheck == B_TRUE) { 234*5c51f124SMoriah Waterland (void) fprintf(stdout, "incompat=%s\n", pkginst); 235*5c51f124SMoriah Waterland return; 236*5c51f124SMoriah Waterland } 237*5c51f124SMoriah Waterland 238*5c51f124SMoriah Waterland logerr(ERR_WARNING); 239*5c51f124SMoriah Waterland (void) snprintf(buf, sizeof (buf), ERR_INCOMP_VERS, pkginst, pkgname); 240*5c51f124SMoriah Waterland puttext(stderr, buf, 4, 0); 241*5c51f124SMoriah Waterland (void) putc('\n', stderr); 242*5c51f124SMoriah Waterland } 243*5c51f124SMoriah Waterland 244*5c51f124SMoriah Waterland static void 245*5c51f124SMoriah Waterland prereq(char *pkginst, char *pkgname, boolean_t a_preinstallCheck) 246*5c51f124SMoriah Waterland { 247*5c51f124SMoriah Waterland register int i; 248*5c51f124SMoriah Waterland char buf[512]; 249*5c51f124SMoriah Waterland 250*5c51f124SMoriah Waterland if (pkgokay) { 251*5c51f124SMoriah Waterland return; 252*5c51f124SMoriah Waterland } 253*5c51f124SMoriah Waterland 254*5c51f124SMoriah Waterland errflg++; 255*5c51f124SMoriah Waterland 256*5c51f124SMoriah Waterland if (a_preinstallCheck == B_TRUE) { 257*5c51f124SMoriah Waterland if (pkgexist) { 258*5c51f124SMoriah Waterland (void) fprintf(stdout, 259*5c51f124SMoriah Waterland "prerequisite-incomplete=%s\n", pkginst); 260*5c51f124SMoriah Waterland } else { 261*5c51f124SMoriah Waterland (void) fprintf(stdout, 262*5c51f124SMoriah Waterland "prerequisite-installed=%s\n", pkginst); 263*5c51f124SMoriah Waterland } 264*5c51f124SMoriah Waterland return; 265*5c51f124SMoriah Waterland } 266*5c51f124SMoriah Waterland 267*5c51f124SMoriah Waterland logerr(ERR_WARNING); 268*5c51f124SMoriah Waterland if (pkgexist) { 269*5c51f124SMoriah Waterland (void) snprintf(buf, sizeof (buf), ERR_PRENCI, pkginst, 270*5c51f124SMoriah Waterland pkgname); 271*5c51f124SMoriah Waterland puttext(stderr, buf, 4, 0); 272*5c51f124SMoriah Waterland (void) putc('\n', stderr); 273*5c51f124SMoriah Waterland } else { 274*5c51f124SMoriah Waterland (void) snprintf(buf, sizeof (buf), ERR_PREREQ, pkginst, 275*5c51f124SMoriah Waterland pkgname); 276*5c51f124SMoriah Waterland if (nlist) { 277*5c51f124SMoriah Waterland (void) strcat(buf, ERR_VALINST); 278*5c51f124SMoriah Waterland } 279*5c51f124SMoriah Waterland puttext(stderr, buf, 4, 0); 280*5c51f124SMoriah Waterland (void) putc('\n', stderr); 281*5c51f124SMoriah Waterland for (i = 0; i < nlist; i++) { 282*5c51f124SMoriah Waterland (void) printf(" "); 283*5c51f124SMoriah Waterland if (alist[i]) 284*5c51f124SMoriah Waterland (void) printf("(%s) ", alist[i]); 285*5c51f124SMoriah Waterland if (vlist[i]) 286*5c51f124SMoriah Waterland (void) printf("%s", vlist[i]); 287*5c51f124SMoriah Waterland (void) printf("\n"); 288*5c51f124SMoriah Waterland } 289*5c51f124SMoriah Waterland } 290*5c51f124SMoriah Waterland } 291*5c51f124SMoriah Waterland 292*5c51f124SMoriah Waterland static void 293*5c51f124SMoriah Waterland deponme(char *pkginst, char *pkgname, boolean_t a_preinstallCheck) 294*5c51f124SMoriah Waterland { 295*5c51f124SMoriah Waterland char buf[512]; 296*5c51f124SMoriah Waterland 297*5c51f124SMoriah Waterland if (!pkgexist) 298*5c51f124SMoriah Waterland return; 299*5c51f124SMoriah Waterland 300*5c51f124SMoriah Waterland errflg++; 301*5c51f124SMoriah Waterland 302*5c51f124SMoriah Waterland if (a_preinstallCheck == B_TRUE) { 303*5c51f124SMoriah Waterland if (!pkgname || !pkgname[0]) { 304*5c51f124SMoriah Waterland (void) snprintf(buf, sizeof (buf), 305*5c51f124SMoriah Waterland "dependonme=%s", pkginst); 306*5c51f124SMoriah Waterland } else { 307*5c51f124SMoriah Waterland (void) snprintf(buf, sizeof (buf), 308*5c51f124SMoriah Waterland "dependsonme=%s:%s", pkginst, pkgname); 309*5c51f124SMoriah Waterland } 310*5c51f124SMoriah Waterland (void) fprintf(stdout, "%s\n", buf); 311*5c51f124SMoriah Waterland return; 312*5c51f124SMoriah Waterland } 313*5c51f124SMoriah Waterland 314*5c51f124SMoriah Waterland logerr(ERR_WARNING); 315*5c51f124SMoriah Waterland if (!pkgname || !pkgname[0]) { 316*5c51f124SMoriah Waterland (void) snprintf(buf, sizeof (buf), ERR_DEPONME, pkginst); 317*5c51f124SMoriah Waterland } else { 318*5c51f124SMoriah Waterland (void) snprintf(buf, sizeof (buf), ERR_DEPNAM, pkginst, 319*5c51f124SMoriah Waterland pkgname); 320*5c51f124SMoriah Waterland } 321*5c51f124SMoriah Waterland puttext(stderr, buf, 4, 0); 322*5c51f124SMoriah Waterland (void) putc('\n', stderr); 323*5c51f124SMoriah Waterland } 324*5c51f124SMoriah Waterland 325*5c51f124SMoriah Waterland static int 326*5c51f124SMoriah Waterland getline(FILE *fp) 327*5c51f124SMoriah Waterland { 328*5c51f124SMoriah Waterland register int i, c, found; 329*5c51f124SMoriah Waterland char *pt, *new, line[LSIZE]; 330*5c51f124SMoriah Waterland 331*5c51f124SMoriah Waterland abbrev[0] = name[0] = type = '\0'; 332*5c51f124SMoriah Waterland 333*5c51f124SMoriah Waterland for (i = 0; i < nlist; i++) { 334*5c51f124SMoriah Waterland if (alist[i]) { 335*5c51f124SMoriah Waterland free(alist[i]); 336*5c51f124SMoriah Waterland alist[i] = NULL; 337*5c51f124SMoriah Waterland } 338*5c51f124SMoriah Waterland if (vlist[i]) { 339*5c51f124SMoriah Waterland free(vlist[i]); 340*5c51f124SMoriah Waterland vlist[i] = NULL; 341*5c51f124SMoriah Waterland } 342*5c51f124SMoriah Waterland } 343*5c51f124SMoriah Waterland alist[0] = vlist[0] = NULL; 344*5c51f124SMoriah Waterland 345*5c51f124SMoriah Waterland found = (-1); 346*5c51f124SMoriah Waterland nlist = 0; 347*5c51f124SMoriah Waterland while ((c = getc(fp)) != EOF) { 348*5c51f124SMoriah Waterland (void) ungetc(c, fp); 349*5c51f124SMoriah Waterland if ((found >= 0) && !isspace(c)) 350*5c51f124SMoriah Waterland return (1); 351*5c51f124SMoriah Waterland 352*5c51f124SMoriah Waterland if (!fgets(line, LSIZE, fp)) 353*5c51f124SMoriah Waterland break; 354*5c51f124SMoriah Waterland 355*5c51f124SMoriah Waterland for (pt = line; isspace(*pt); /* void */) 356*5c51f124SMoriah Waterland pt++; 357*5c51f124SMoriah Waterland if (!*pt || (*pt == '#')) 358*5c51f124SMoriah Waterland continue; 359*5c51f124SMoriah Waterland 360*5c51f124SMoriah Waterland if (pt == line) { 361*5c51f124SMoriah Waterland /* begin new definition */ 362*5c51f124SMoriah Waterland /* LINTED variable format specifier to sscanf(): */ 363*5c51f124SMoriah Waterland (void) sscanf(line, SSCANF_FORMAT, &type, abbrev, name); 364*5c51f124SMoriah Waterland found++; 365*5c51f124SMoriah Waterland continue; 366*5c51f124SMoriah Waterland } 367*5c51f124SMoriah Waterland if (found < 0) 368*5c51f124SMoriah Waterland return (0); 369*5c51f124SMoriah Waterland 370*5c51f124SMoriah Waterland if (*pt == '(') { 371*5c51f124SMoriah Waterland /* architecture is specified */ 372*5c51f124SMoriah Waterland if (new = strchr(pt, ')')) 373*5c51f124SMoriah Waterland *new++ = '\0'; 374*5c51f124SMoriah Waterland else 375*5c51f124SMoriah Waterland return (-1); /* bad specification */ 376*5c51f124SMoriah Waterland alist[found] = qstrdup(pt+1); 377*5c51f124SMoriah Waterland pt = new; 378*5c51f124SMoriah Waterland } 379*5c51f124SMoriah Waterland while (isspace(*pt)) 380*5c51f124SMoriah Waterland pt++; 381*5c51f124SMoriah Waterland if (*pt) { 382*5c51f124SMoriah Waterland vlist[found] = qstrdup(pt); 383*5c51f124SMoriah Waterland if (pt = strchr(vlist[found], '\n')) 384*5c51f124SMoriah Waterland *pt = '\0'; 385*5c51f124SMoriah Waterland } 386*5c51f124SMoriah Waterland found++; 387*5c51f124SMoriah Waterland nlist++; 388*5c51f124SMoriah Waterland } 389*5c51f124SMoriah Waterland return ((found >= 0) ? 1 : 0); 390*5c51f124SMoriah Waterland } 391*5c51f124SMoriah Waterland 392*5c51f124SMoriah Waterland static void 393*5c51f124SMoriah Waterland ckrdeps(boolean_t a_preinstallCheck) 394*5c51f124SMoriah Waterland { 395*5c51f124SMoriah Waterland struct dirent *drp; 396*5c51f124SMoriah Waterland DIR *dirfp; 397*5c51f124SMoriah Waterland FILE *fp; 398*5c51f124SMoriah Waterland char depfile[PATH_MAX+1]; 399*5c51f124SMoriah Waterland 400*5c51f124SMoriah Waterland if ((dirfp = opendir(pkgdir)) == NULL) 401*5c51f124SMoriah Waterland return; 402*5c51f124SMoriah Waterland 403*5c51f124SMoriah Waterland while ((drp = readdir(dirfp)) != NULL) { 404*5c51f124SMoriah Waterland if (drp->d_name[0] == '.') 405*5c51f124SMoriah Waterland continue; 406*5c51f124SMoriah Waterland 407*5c51f124SMoriah Waterland if (strcmp(drp->d_name, rmpkginst) == 0) 408*5c51f124SMoriah Waterland continue; /* others don't include me */ 409*5c51f124SMoriah Waterland (void) snprintf(depfile, sizeof (depfile), 410*5c51f124SMoriah Waterland "%s/%s/%s", pkgdir, drp->d_name, DEPEND_FILE); 411*5c51f124SMoriah Waterland if ((fp = fopen(depfile, "r")) == NULL) 412*5c51f124SMoriah Waterland continue; 413*5c51f124SMoriah Waterland 414*5c51f124SMoriah Waterland ckpreq(fp, drp->d_name, a_preinstallCheck); 415*5c51f124SMoriah Waterland } 416*5c51f124SMoriah Waterland (void) closedir(dirfp); 417*5c51f124SMoriah Waterland } 418*5c51f124SMoriah Waterland 419*5c51f124SMoriah Waterland static void 420*5c51f124SMoriah Waterland ckpreq(FILE *fp, char *dname, boolean_t a_preinstallCheck) 421*5c51f124SMoriah Waterland { 422*5c51f124SMoriah Waterland register int i; 423*5c51f124SMoriah Waterland char *inst; 424*5c51f124SMoriah Waterland 425*5c51f124SMoriah Waterland while (getline(fp)) { 426*5c51f124SMoriah Waterland if (type != 'P') 427*5c51f124SMoriah Waterland continue; 428*5c51f124SMoriah Waterland 429*5c51f124SMoriah Waterland if (strcmp(abbrev, rmpkg)) 430*5c51f124SMoriah Waterland continue; 431*5c51f124SMoriah Waterland 432*5c51f124SMoriah Waterland /* see if package is installed */ 433*5c51f124SMoriah Waterland i = 0; 434*5c51f124SMoriah Waterland if (strchr(abbrev, '.') == 0) { 435*5c51f124SMoriah Waterland (void) strcat(abbrev, ".*"); 436*5c51f124SMoriah Waterland } 437*5c51f124SMoriah Waterland pkgexist = 1; 438*5c51f124SMoriah Waterland 439*5c51f124SMoriah Waterland do { 440*5c51f124SMoriah Waterland if (inst = fpkginst(abbrev, alist[i], vlist[i])) { 441*5c51f124SMoriah Waterland if (strcmp(inst, rmpkginst) == 0) { 442*5c51f124SMoriah Waterland deponme(dname, "", a_preinstallCheck); 443*5c51f124SMoriah Waterland (void) fclose(fp); 444*5c51f124SMoriah Waterland (void) fpkginst(NULL); 445*5c51f124SMoriah Waterland return; 446*5c51f124SMoriah Waterland } 447*5c51f124SMoriah Waterland } 448*5c51f124SMoriah Waterland } while (++i < nlist); 449*5c51f124SMoriah Waterland (void) fpkginst(NULL); 450*5c51f124SMoriah Waterland } 451*5c51f124SMoriah Waterland (void) fclose(fp); 452*5c51f124SMoriah Waterland } 453