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*23a1cceaSRoger A. Faulkner * Copyright (c) 2006, 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 #include <stdio.h> 305c51f124SMoriah Waterland #include <errno.h> 315c51f124SMoriah Waterland #include <limits.h> 325c51f124SMoriah Waterland #include <stdlib.h> 335c51f124SMoriah Waterland #include <unistd.h> 345c51f124SMoriah Waterland #include <string.h> 355c51f124SMoriah Waterland #include <ctype.h> 365c51f124SMoriah Waterland #include <dirent.h> 375c51f124SMoriah Waterland #include <sys/types.h> 385c51f124SMoriah Waterland #include <pkgstrct.h> 395c51f124SMoriah Waterland #include <pkginfo.h> 405c51f124SMoriah Waterland #include <locale.h> 415c51f124SMoriah Waterland #include <libintl.h> 425c51f124SMoriah Waterland #include <pkglib.h> 435c51f124SMoriah Waterland #include "libinst.h" 445c51f124SMoriah Waterland #include "libadm.h" 455c51f124SMoriah Waterland #include "messages.h" 465c51f124SMoriah Waterland 475c51f124SMoriah Waterland #define LSIZE 256 485c51f124SMoriah Waterland #define NVERS 50 495c51f124SMoriah Waterland 505c51f124SMoriah Waterland /* 515c51f124SMoriah Waterland * internal global variables 525c51f124SMoriah Waterland */ 535c51f124SMoriah Waterland 545c51f124SMoriah Waterland static struct pkginfo info; 555c51f124SMoriah Waterland 565c51f124SMoriah Waterland static char type; 575c51f124SMoriah Waterland static char *alist[NVERS]; 585c51f124SMoriah Waterland static char *rmpkginst; 595c51f124SMoriah Waterland static char *vlist[NVERS]; 605c51f124SMoriah Waterland static char file[128]; 615c51f124SMoriah Waterland static char name[128]; 625c51f124SMoriah Waterland static char rmpkg[PKGSIZ+1]; 635c51f124SMoriah Waterland static char wabbrev[128]; 645c51f124SMoriah Waterland 655c51f124SMoriah Waterland static int errflg = 0; 665c51f124SMoriah Waterland static int nlist; 675c51f124SMoriah Waterland static int pkgexist; 685c51f124SMoriah Waterland static int pkgokay; 695c51f124SMoriah Waterland static int is_update; 705c51f124SMoriah Waterland static int is_patch_update; 715c51f124SMoriah Waterland 725c51f124SMoriah Waterland /* 735c51f124SMoriah Waterland * IMPORTANT NOTE: THE SIZE OF 'abbrev' IS HARD CODED INTO THE CHARACTER 745c51f124SMoriah Waterland * ARRAY SSCANF_FORMAT -- YOU MUST UPDATE BOTH VALUES AT THE SAME TIME!! 755c51f124SMoriah Waterland */ 765c51f124SMoriah Waterland 775c51f124SMoriah Waterland static char abbrev[128+1]; 785c51f124SMoriah Waterland static char *SSCANF_FORMAT = "%c %128s %[^\n]"; 795c51f124SMoriah Waterland 805c51f124SMoriah Waterland /* 815c51f124SMoriah Waterland * forward declarations 825c51f124SMoriah Waterland */ 835c51f124SMoriah Waterland 845c51f124SMoriah Waterland static void ckrdeps(boolean_t a_preinstallCheck); 855c51f124SMoriah Waterland static void ckpreq(FILE *fp, char *dname, boolean_t a_preinstallCheck); 865c51f124SMoriah Waterland static void deponme(char *pkginst, char *pkgname, 875c51f124SMoriah Waterland boolean_t a_preinstallCheck); 885c51f124SMoriah Waterland static void prereq(char *pkginst, char *pkgname, 895c51f124SMoriah Waterland boolean_t a_preinstallCheck); 905c51f124SMoriah Waterland static void incompat(char *pkginst, char *pkgname, 915c51f124SMoriah Waterland boolean_t a_preinstallCheck); 92*23a1cceaSRoger A. Faulkner static int getaline(FILE *fp); 935c51f124SMoriah Waterland 945c51f124SMoriah Waterland /* 955c51f124SMoriah Waterland * ***************************************************************************** 965c51f124SMoriah Waterland * global external (public) functions 975c51f124SMoriah Waterland * ***************************************************************************** 985c51f124SMoriah Waterland */ 995c51f124SMoriah Waterland 1005c51f124SMoriah Waterland int 1015c51f124SMoriah Waterland dockdeps(char *a_depfile, int a_removeFlag, boolean_t a_preinstallCheck) 1025c51f124SMoriah Waterland { 1035c51f124SMoriah Waterland FILE *fp; 1045c51f124SMoriah Waterland int i; 1055c51f124SMoriah Waterland char *inst; 1065c51f124SMoriah Waterland 1075c51f124SMoriah Waterland if (a_removeFlag) { 1085c51f124SMoriah Waterland /* check removal dependencies */ 1095c51f124SMoriah Waterland rmpkginst = a_depfile; 1105c51f124SMoriah Waterland (void) strncpy(rmpkg, rmpkginst, PKGSIZ); 1115c51f124SMoriah Waterland (void) strtok(rmpkg, "."); 1125c51f124SMoriah Waterland (void) snprintf(file, sizeof (file), 1135c51f124SMoriah Waterland "%s/%s/%s", pkgdir, rmpkginst, DEPEND_FILE); 1145c51f124SMoriah Waterland if ((fp = fopen(file, "r")) == NULL) 1155c51f124SMoriah Waterland goto done; 1165c51f124SMoriah Waterland } else { 1175c51f124SMoriah Waterland if ((fp = fopen(a_depfile, "r")) == NULL) { 1185c51f124SMoriah Waterland progerr(ERR_CANNOT_OPEN_DEPEND_FILE, a_depfile, 1195c51f124SMoriah Waterland strerror(errno)); 1205c51f124SMoriah Waterland quit(99); 1215c51f124SMoriah Waterland } 1225c51f124SMoriah Waterland } 1235c51f124SMoriah Waterland 124*23a1cceaSRoger A. Faulkner while (getaline(fp)) { 1255c51f124SMoriah Waterland switch (type) { 1265c51f124SMoriah Waterland case 'I': 1275c51f124SMoriah Waterland case 'P': 1285c51f124SMoriah Waterland if (a_removeFlag) { 1295c51f124SMoriah Waterland continue; 1305c51f124SMoriah Waterland } 1315c51f124SMoriah Waterland break; 1325c51f124SMoriah Waterland 1335c51f124SMoriah Waterland case 'R': 1345c51f124SMoriah Waterland if (!a_removeFlag) { 1355c51f124SMoriah Waterland continue; 1365c51f124SMoriah Waterland } 1375c51f124SMoriah Waterland break; 1385c51f124SMoriah Waterland 1395c51f124SMoriah Waterland default: 1405c51f124SMoriah Waterland errflg++; 1415c51f124SMoriah Waterland progerr(ERR_UNKNOWN_DEPENDENCY, type); 1425c51f124SMoriah Waterland break; 1435c51f124SMoriah Waterland } 1445c51f124SMoriah Waterland 1455c51f124SMoriah Waterland /* check to see if any versions listed are installed */ 1465c51f124SMoriah Waterland pkgexist = pkgokay = 0; 1475c51f124SMoriah Waterland i = 0; 1485c51f124SMoriah Waterland if (strchr(abbrev, '.')) { 1495c51f124SMoriah Waterland progerr(ERR_PKGABRV, abbrev); 1505c51f124SMoriah Waterland } 1515c51f124SMoriah Waterland (void) snprintf(wabbrev, sizeof (wabbrev), "%s.*", abbrev); 1525c51f124SMoriah Waterland 1535c51f124SMoriah Waterland do { 1545c51f124SMoriah Waterland inst = fpkginst(wabbrev, alist[i], vlist[i]); 1555c51f124SMoriah Waterland if (inst && (pkginfo(&info, inst, NULL, NULL) == 0)) { 1565c51f124SMoriah Waterland pkgexist++; 1575c51f124SMoriah Waterland if ((info.status == PI_INSTALLED) || 1585c51f124SMoriah Waterland (info.status == PI_PRESVR4)) 1595c51f124SMoriah Waterland pkgokay++; 1605c51f124SMoriah Waterland } 1615c51f124SMoriah Waterland } while (++i < nlist); 1625c51f124SMoriah Waterland (void) fpkginst(NULL); /* force closing/rewind of files */ 1635c51f124SMoriah Waterland 1645c51f124SMoriah Waterland if (!info.name) { 1655c51f124SMoriah Waterland info.name = name; 1665c51f124SMoriah Waterland } 1675c51f124SMoriah Waterland 1685c51f124SMoriah Waterland switch (type) { 1695c51f124SMoriah Waterland case 'I': 1705c51f124SMoriah Waterland incompat(abbrev, info.name, a_preinstallCheck); 1715c51f124SMoriah Waterland break; 1725c51f124SMoriah Waterland 1735c51f124SMoriah Waterland case 'P': 1745c51f124SMoriah Waterland prereq(abbrev, name, a_preinstallCheck); 1755c51f124SMoriah Waterland break; 1765c51f124SMoriah Waterland 1775c51f124SMoriah Waterland case 'R': 1785c51f124SMoriah Waterland deponme(abbrev, info.name, a_preinstallCheck); 1795c51f124SMoriah Waterland } 1805c51f124SMoriah Waterland } 1815c51f124SMoriah Waterland (void) fclose(fp); 1825c51f124SMoriah Waterland 1835c51f124SMoriah Waterland done: 1845c51f124SMoriah Waterland if (a_removeFlag) { 1855c51f124SMoriah Waterland ckrdeps(a_preinstallCheck); 1865c51f124SMoriah Waterland } 1875c51f124SMoriah Waterland 1885c51f124SMoriah Waterland return (errflg); 1895c51f124SMoriah Waterland } 1905c51f124SMoriah Waterland 1915c51f124SMoriah Waterland void 1925c51f124SMoriah Waterland setPatchUpdate(void) 1935c51f124SMoriah Waterland { 1945c51f124SMoriah Waterland is_patch_update = 1; 1955c51f124SMoriah Waterland } 1965c51f124SMoriah Waterland 1975c51f124SMoriah Waterland int 1985c51f124SMoriah Waterland isPatchUpdate(void) 1995c51f124SMoriah Waterland { 2005c51f124SMoriah Waterland return ((is_patch_update) ? 1 : 0); 2015c51f124SMoriah Waterland } 2025c51f124SMoriah Waterland 2035c51f124SMoriah Waterland void 2045c51f124SMoriah Waterland setUpdate(void) 2055c51f124SMoriah Waterland { 2065c51f124SMoriah Waterland is_update = 1; 2075c51f124SMoriah Waterland } 2085c51f124SMoriah Waterland 2095c51f124SMoriah Waterland int 2105c51f124SMoriah Waterland isUpdate(void) 2115c51f124SMoriah Waterland { 2125c51f124SMoriah Waterland return ((is_update) ? 1 : 0); 2135c51f124SMoriah Waterland } 2145c51f124SMoriah Waterland 2155c51f124SMoriah Waterland /* 2165c51f124SMoriah Waterland * ***************************************************************************** 2175c51f124SMoriah Waterland * static internal (private) functions 2185c51f124SMoriah Waterland * ***************************************************************************** 2195c51f124SMoriah Waterland */ 2205c51f124SMoriah Waterland 2215c51f124SMoriah Waterland static void 2225c51f124SMoriah Waterland incompat(char *pkginst, char *pkgname, boolean_t a_preinstallCheck) 2235c51f124SMoriah Waterland { 2245c51f124SMoriah Waterland char buf[512]; 2255c51f124SMoriah Waterland 2265c51f124SMoriah Waterland if (!pkgexist) 2275c51f124SMoriah Waterland return; 2285c51f124SMoriah Waterland 2295c51f124SMoriah Waterland errflg++; 2305c51f124SMoriah Waterland if (a_preinstallCheck == B_TRUE) { 2315c51f124SMoriah Waterland (void) fprintf(stdout, "incompat=%s\n", pkginst); 2325c51f124SMoriah Waterland return; 2335c51f124SMoriah Waterland } 2345c51f124SMoriah Waterland 2355c51f124SMoriah Waterland logerr(ERR_WARNING); 2365c51f124SMoriah Waterland (void) snprintf(buf, sizeof (buf), ERR_INCOMP_VERS, pkginst, pkgname); 2375c51f124SMoriah Waterland puttext(stderr, buf, 4, 0); 2385c51f124SMoriah Waterland (void) putc('\n', stderr); 2395c51f124SMoriah Waterland } 2405c51f124SMoriah Waterland 2415c51f124SMoriah Waterland static void 2425c51f124SMoriah Waterland prereq(char *pkginst, char *pkgname, boolean_t a_preinstallCheck) 2435c51f124SMoriah Waterland { 2445c51f124SMoriah Waterland register int i; 2455c51f124SMoriah Waterland char buf[512]; 2465c51f124SMoriah Waterland 2475c51f124SMoriah Waterland if (pkgokay) { 2485c51f124SMoriah Waterland return; 2495c51f124SMoriah Waterland } 2505c51f124SMoriah Waterland 2515c51f124SMoriah Waterland errflg++; 2525c51f124SMoriah Waterland 2535c51f124SMoriah Waterland if (a_preinstallCheck == B_TRUE) { 2545c51f124SMoriah Waterland if (pkgexist) { 2555c51f124SMoriah Waterland (void) fprintf(stdout, 2565c51f124SMoriah Waterland "prerequisite-incomplete=%s\n", pkginst); 2575c51f124SMoriah Waterland } else { 2585c51f124SMoriah Waterland (void) fprintf(stdout, 2595c51f124SMoriah Waterland "prerequisite-installed=%s\n", pkginst); 2605c51f124SMoriah Waterland } 2615c51f124SMoriah Waterland return; 2625c51f124SMoriah Waterland } 2635c51f124SMoriah Waterland 2645c51f124SMoriah Waterland logerr(ERR_WARNING); 2655c51f124SMoriah Waterland if (pkgexist) { 2665c51f124SMoriah Waterland (void) snprintf(buf, sizeof (buf), ERR_PRENCI, pkginst, 2675c51f124SMoriah Waterland pkgname); 2685c51f124SMoriah Waterland puttext(stderr, buf, 4, 0); 2695c51f124SMoriah Waterland (void) putc('\n', stderr); 2705c51f124SMoriah Waterland } else { 2715c51f124SMoriah Waterland (void) snprintf(buf, sizeof (buf), ERR_PREREQ, pkginst, 2725c51f124SMoriah Waterland pkgname); 2735c51f124SMoriah Waterland if (nlist) { 2745c51f124SMoriah Waterland (void) strcat(buf, ERR_VALINST); 2755c51f124SMoriah Waterland } 2765c51f124SMoriah Waterland puttext(stderr, buf, 4, 0); 2775c51f124SMoriah Waterland (void) putc('\n', stderr); 2785c51f124SMoriah Waterland for (i = 0; i < nlist; i++) { 2795c51f124SMoriah Waterland (void) printf(" "); 2805c51f124SMoriah Waterland if (alist[i]) 2815c51f124SMoriah Waterland (void) printf("(%s) ", alist[i]); 2825c51f124SMoriah Waterland if (vlist[i]) 2835c51f124SMoriah Waterland (void) printf("%s", vlist[i]); 2845c51f124SMoriah Waterland (void) printf("\n"); 2855c51f124SMoriah Waterland } 2865c51f124SMoriah Waterland } 2875c51f124SMoriah Waterland } 2885c51f124SMoriah Waterland 2895c51f124SMoriah Waterland static void 2905c51f124SMoriah Waterland deponme(char *pkginst, char *pkgname, boolean_t a_preinstallCheck) 2915c51f124SMoriah Waterland { 2925c51f124SMoriah Waterland char buf[512]; 2935c51f124SMoriah Waterland 2945c51f124SMoriah Waterland if (!pkgexist) 2955c51f124SMoriah Waterland return; 2965c51f124SMoriah Waterland 2975c51f124SMoriah Waterland errflg++; 2985c51f124SMoriah Waterland 2995c51f124SMoriah Waterland if (a_preinstallCheck == B_TRUE) { 3005c51f124SMoriah Waterland if (!pkgname || !pkgname[0]) { 3015c51f124SMoriah Waterland (void) snprintf(buf, sizeof (buf), 3025c51f124SMoriah Waterland "dependonme=%s", pkginst); 3035c51f124SMoriah Waterland } else { 3045c51f124SMoriah Waterland (void) snprintf(buf, sizeof (buf), 3055c51f124SMoriah Waterland "dependsonme=%s:%s", pkginst, pkgname); 3065c51f124SMoriah Waterland } 3075c51f124SMoriah Waterland (void) fprintf(stdout, "%s\n", buf); 3085c51f124SMoriah Waterland return; 3095c51f124SMoriah Waterland } 3105c51f124SMoriah Waterland 3115c51f124SMoriah Waterland logerr(ERR_WARNING); 3125c51f124SMoriah Waterland if (!pkgname || !pkgname[0]) { 3135c51f124SMoriah Waterland (void) snprintf(buf, sizeof (buf), ERR_DEPONME, pkginst); 3145c51f124SMoriah Waterland } else { 3155c51f124SMoriah Waterland (void) snprintf(buf, sizeof (buf), ERR_DEPNAM, pkginst, 3165c51f124SMoriah Waterland pkgname); 3175c51f124SMoriah Waterland } 3185c51f124SMoriah Waterland puttext(stderr, buf, 4, 0); 3195c51f124SMoriah Waterland (void) putc('\n', stderr); 3205c51f124SMoriah Waterland } 3215c51f124SMoriah Waterland 3225c51f124SMoriah Waterland static int 323*23a1cceaSRoger A. Faulkner getaline(FILE *fp) 3245c51f124SMoriah Waterland { 3255c51f124SMoriah Waterland register int i, c, found; 3265c51f124SMoriah Waterland char *pt, *new, line[LSIZE]; 3275c51f124SMoriah Waterland 3285c51f124SMoriah Waterland abbrev[0] = name[0] = type = '\0'; 3295c51f124SMoriah Waterland 3305c51f124SMoriah Waterland for (i = 0; i < nlist; i++) { 3315c51f124SMoriah Waterland if (alist[i]) { 3325c51f124SMoriah Waterland free(alist[i]); 3335c51f124SMoriah Waterland alist[i] = NULL; 3345c51f124SMoriah Waterland } 3355c51f124SMoriah Waterland if (vlist[i]) { 3365c51f124SMoriah Waterland free(vlist[i]); 3375c51f124SMoriah Waterland vlist[i] = NULL; 3385c51f124SMoriah Waterland } 3395c51f124SMoriah Waterland } 3405c51f124SMoriah Waterland alist[0] = vlist[0] = NULL; 3415c51f124SMoriah Waterland 3425c51f124SMoriah Waterland found = (-1); 3435c51f124SMoriah Waterland nlist = 0; 3445c51f124SMoriah Waterland while ((c = getc(fp)) != EOF) { 3455c51f124SMoriah Waterland (void) ungetc(c, fp); 3465c51f124SMoriah Waterland if ((found >= 0) && !isspace(c)) 3475c51f124SMoriah Waterland return (1); 3485c51f124SMoriah Waterland 3495c51f124SMoriah Waterland if (!fgets(line, LSIZE, fp)) 3505c51f124SMoriah Waterland break; 3515c51f124SMoriah Waterland 3525c51f124SMoriah Waterland for (pt = line; isspace(*pt); /* void */) 3535c51f124SMoriah Waterland pt++; 3545c51f124SMoriah Waterland if (!*pt || (*pt == '#')) 3555c51f124SMoriah Waterland continue; 3565c51f124SMoriah Waterland 3575c51f124SMoriah Waterland if (pt == line) { 3585c51f124SMoriah Waterland /* begin new definition */ 3595c51f124SMoriah Waterland /* LINTED variable format specifier to sscanf(): */ 3605c51f124SMoriah Waterland (void) sscanf(line, SSCANF_FORMAT, &type, abbrev, name); 3615c51f124SMoriah Waterland found++; 3625c51f124SMoriah Waterland continue; 3635c51f124SMoriah Waterland } 3645c51f124SMoriah Waterland if (found < 0) 3655c51f124SMoriah Waterland return (0); 3665c51f124SMoriah Waterland 3675c51f124SMoriah Waterland if (*pt == '(') { 3685c51f124SMoriah Waterland /* architecture is specified */ 3695c51f124SMoriah Waterland if (new = strchr(pt, ')')) 3705c51f124SMoriah Waterland *new++ = '\0'; 3715c51f124SMoriah Waterland else 3725c51f124SMoriah Waterland return (-1); /* bad specification */ 3735c51f124SMoriah Waterland alist[found] = qstrdup(pt+1); 3745c51f124SMoriah Waterland pt = new; 3755c51f124SMoriah Waterland } 3765c51f124SMoriah Waterland while (isspace(*pt)) 3775c51f124SMoriah Waterland pt++; 3785c51f124SMoriah Waterland if (*pt) { 3795c51f124SMoriah Waterland vlist[found] = qstrdup(pt); 3805c51f124SMoriah Waterland if (pt = strchr(vlist[found], '\n')) 3815c51f124SMoriah Waterland *pt = '\0'; 3825c51f124SMoriah Waterland } 3835c51f124SMoriah Waterland found++; 3845c51f124SMoriah Waterland nlist++; 3855c51f124SMoriah Waterland } 3865c51f124SMoriah Waterland return ((found >= 0) ? 1 : 0); 3875c51f124SMoriah Waterland } 3885c51f124SMoriah Waterland 3895c51f124SMoriah Waterland static void 3905c51f124SMoriah Waterland ckrdeps(boolean_t a_preinstallCheck) 3915c51f124SMoriah Waterland { 3925c51f124SMoriah Waterland struct dirent *drp; 3935c51f124SMoriah Waterland DIR *dirfp; 3945c51f124SMoriah Waterland FILE *fp; 3955c51f124SMoriah Waterland char depfile[PATH_MAX+1]; 3965c51f124SMoriah Waterland 3975c51f124SMoriah Waterland if ((dirfp = opendir(pkgdir)) == NULL) 3985c51f124SMoriah Waterland return; 3995c51f124SMoriah Waterland 4005c51f124SMoriah Waterland while ((drp = readdir(dirfp)) != NULL) { 4015c51f124SMoriah Waterland if (drp->d_name[0] == '.') 4025c51f124SMoriah Waterland continue; 4035c51f124SMoriah Waterland 4045c51f124SMoriah Waterland if (strcmp(drp->d_name, rmpkginst) == 0) 4055c51f124SMoriah Waterland continue; /* others don't include me */ 4065c51f124SMoriah Waterland (void) snprintf(depfile, sizeof (depfile), 4075c51f124SMoriah Waterland "%s/%s/%s", pkgdir, drp->d_name, DEPEND_FILE); 4085c51f124SMoriah Waterland if ((fp = fopen(depfile, "r")) == NULL) 4095c51f124SMoriah Waterland continue; 4105c51f124SMoriah Waterland 4115c51f124SMoriah Waterland ckpreq(fp, drp->d_name, a_preinstallCheck); 4125c51f124SMoriah Waterland } 4135c51f124SMoriah Waterland (void) closedir(dirfp); 4145c51f124SMoriah Waterland } 4155c51f124SMoriah Waterland 4165c51f124SMoriah Waterland static void 4175c51f124SMoriah Waterland ckpreq(FILE *fp, char *dname, boolean_t a_preinstallCheck) 4185c51f124SMoriah Waterland { 4195c51f124SMoriah Waterland register int i; 4205c51f124SMoriah Waterland char *inst; 4215c51f124SMoriah Waterland 422*23a1cceaSRoger A. Faulkner while (getaline(fp)) { 4235c51f124SMoriah Waterland if (type != 'P') 4245c51f124SMoriah Waterland continue; 4255c51f124SMoriah Waterland 4265c51f124SMoriah Waterland if (strcmp(abbrev, rmpkg)) 4275c51f124SMoriah Waterland continue; 4285c51f124SMoriah Waterland 4295c51f124SMoriah Waterland /* see if package is installed */ 4305c51f124SMoriah Waterland i = 0; 4315c51f124SMoriah Waterland if (strchr(abbrev, '.') == 0) { 4325c51f124SMoriah Waterland (void) strcat(abbrev, ".*"); 4335c51f124SMoriah Waterland } 4345c51f124SMoriah Waterland pkgexist = 1; 4355c51f124SMoriah Waterland 4365c51f124SMoriah Waterland do { 4375c51f124SMoriah Waterland if (inst = fpkginst(abbrev, alist[i], vlist[i])) { 4385c51f124SMoriah Waterland if (strcmp(inst, rmpkginst) == 0) { 4395c51f124SMoriah Waterland deponme(dname, "", a_preinstallCheck); 4405c51f124SMoriah Waterland (void) fclose(fp); 4415c51f124SMoriah Waterland (void) fpkginst(NULL); 4425c51f124SMoriah Waterland return; 4435c51f124SMoriah Waterland } 4445c51f124SMoriah Waterland } 4455c51f124SMoriah Waterland } while (++i < nlist); 4465c51f124SMoriah Waterland (void) fpkginst(NULL); 4475c51f124SMoriah Waterland } 4485c51f124SMoriah Waterland (void) fclose(fp); 4495c51f124SMoriah Waterland } 450