5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * CDDL HEADER START
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * The contents of this file are subject to the terms of the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Common Development and Distribution License (the "License").
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * You may not use this file except in compliance with the License.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * or http://www.opensolaris.org/os/licensing.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * See the License for the specific language governing permissions
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * and limitations under the License.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * When distributing Covered Code, include this CDDL HEADER in each
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * If applicable, add the following below this CDDL HEADER, with the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * fields enclosed by brackets "[]" replaced with your own identifying
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * information: Portions Copyright [yyyy] [name of copyright owner]
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * CDDL HEADER END
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
23a1ccea6aac035f084a7a4cdc968687d1b02dafRoger A. Faulkner * Copyright (c) 2006, 2010, Oracle and/or its affiliates. All rights reserved.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/* All Rights Reserved */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <stdio.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <errno.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <limits.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <stdlib.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <unistd.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <string.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <ctype.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <dirent.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <sys/types.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <pkgstrct.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <pkginfo.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <locale.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <libintl.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <pkglib.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include "libinst.h"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include "libadm.h"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include "messages.h"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define LSIZE 256
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define NVERS 50
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * internal global variables
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic struct pkginfo info;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic char type;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic char *alist[NVERS];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic char *rmpkginst;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic char *vlist[NVERS];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic char file[128];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic char name[128];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic char rmpkg[PKGSIZ+1];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic char wabbrev[128];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int errflg = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int nlist;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int pkgexist;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int pkgokay;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int is_update;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * IMPORTANT NOTE: THE SIZE OF 'abbrev' IS HARD CODED INTO THE CHARACTER
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * ARRAY SSCANF_FORMAT -- YOU MUST UPDATE BOTH VALUES AT THE SAME TIME!!
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic char abbrev[128+1];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic char *SSCANF_FORMAT = "%c %128s %[^\n]";
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * forward declarations
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic void ckrdeps(boolean_t a_preinstallCheck);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic void ckpreq(FILE *fp, char *dname, boolean_t a_preinstallCheck);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic void deponme(char *pkginst, char *pkgname,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland boolean_t a_preinstallCheck);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic void prereq(char *pkginst, char *pkgname,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland boolean_t a_preinstallCheck);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic void incompat(char *pkginst, char *pkgname,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland boolean_t a_preinstallCheck);
23a1ccea6aac035f084a7a4cdc968687d1b02dafRoger A. Faulknerstatic int getaline(FILE *fp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * *****************************************************************************
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * global external (public) functions
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * *****************************************************************************
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandint
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlanddockdeps(char *a_depfile, int a_removeFlag, boolean_t a_preinstallCheck)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland FILE *fp;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int i;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *inst;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (a_removeFlag) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* check removal dependencies */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland rmpkginst = a_depfile;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) strncpy(rmpkg, rmpkginst, PKGSIZ);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) strtok(rmpkg, ".");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) snprintf(file, sizeof (file),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "%s/%s/%s", pkgdir, rmpkginst, DEPEND_FILE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((fp = fopen(file, "r")) == NULL)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland goto done;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((fp = fopen(a_depfile, "r")) == NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_CANNOT_OPEN_DEPEND_FILE, a_depfile,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland strerror(errno));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(99);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
23a1ccea6aac035f084a7a4cdc968687d1b02dafRoger A. Faulkner while (getaline(fp)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland switch (type) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'I':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'P':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (a_removeFlag) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland continue;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'R':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!a_removeFlag) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland continue;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland default:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland errflg++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_UNKNOWN_DEPENDENCY, type);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* check to see if any versions listed are installed */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkgexist = pkgokay = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland i = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (strchr(abbrev, '.')) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_PKGABRV, abbrev);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) snprintf(wabbrev, sizeof (wabbrev), "%s.*", abbrev);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland do {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland inst = fpkginst(wabbrev, alist[i], vlist[i]);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (inst && (pkginfo(&info, inst, NULL, NULL) == 0)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkgexist++;
9ab815e1e50104cb1004a5ccca7a6da582994b57Garrett D'Amore if (info.status == PI_INSTALLED)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkgokay++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } while (++i < nlist);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fpkginst(NULL); /* force closing/rewind of files */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!info.name) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland info.name = name;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland switch (type) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'I':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland incompat(abbrev, info.name, a_preinstallCheck);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'P':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland prereq(abbrev, name, a_preinstallCheck);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'R':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland deponme(abbrev, info.name, a_preinstallCheck);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fclose(fp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlanddone:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (a_removeFlag) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ckrdeps(a_preinstallCheck);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (errflg);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandvoid
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah WaterlandsetUpdate(void)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland is_update = 1;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandint
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah WaterlandisUpdate(void)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return ((is_update) ? 1 : 0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * *****************************************************************************
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * static internal (private) functions
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * *****************************************************************************
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic void
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandincompat(char *pkginst, char *pkgname, boolean_t a_preinstallCheck)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char buf[512];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!pkgexist)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland errflg++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (a_preinstallCheck == B_TRUE) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fprintf(stdout, "incompat=%s\n", pkginst);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland logerr(ERR_WARNING);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) snprintf(buf, sizeof (buf), ERR_INCOMP_VERS, pkginst, pkgname);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland puttext(stderr, buf, 4, 0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) putc('\n', stderr);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic void
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandprereq(char *pkginst, char *pkgname, boolean_t a_preinstallCheck)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland register int i;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char buf[512];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (pkgokay) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland errflg++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (a_preinstallCheck == B_TRUE) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (pkgexist) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fprintf(stdout,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "prerequisite-incomplete=%s\n", pkginst);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fprintf(stdout,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "prerequisite-installed=%s\n", pkginst);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland logerr(ERR_WARNING);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (pkgexist) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) snprintf(buf, sizeof (buf), ERR_PRENCI, pkginst,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkgname);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland puttext(stderr, buf, 4, 0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) putc('\n', stderr);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) snprintf(buf, sizeof (buf), ERR_PREREQ, pkginst,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkgname);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (nlist) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) strcat(buf, ERR_VALINST);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland puttext(stderr, buf, 4, 0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) putc('\n', stderr);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (i = 0; i < nlist; i++) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) printf(" ");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (alist[i])
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) printf("(%s) ", alist[i]);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (vlist[i])
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) printf("%s", vlist[i]);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) printf("\n");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic void
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlanddeponme(char *pkginst, char *pkgname, boolean_t a_preinstallCheck)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char buf[512];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!pkgexist)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland errflg++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (a_preinstallCheck == B_TRUE) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!pkgname || !pkgname[0]) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) snprintf(buf, sizeof (buf),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "dependonme=%s", pkginst);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) snprintf(buf, sizeof (buf),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "dependsonme=%s:%s", pkginst, pkgname);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fprintf(stdout, "%s\n", buf);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland logerr(ERR_WARNING);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!pkgname || !pkgname[0]) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) snprintf(buf, sizeof (buf), ERR_DEPONME, pkginst);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) snprintf(buf, sizeof (buf), ERR_DEPNAM, pkginst,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkgname);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland puttext(stderr, buf, 4, 0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) putc('\n', stderr);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int
23a1ccea6aac035f084a7a4cdc968687d1b02dafRoger A. Faulknergetaline(FILE *fp)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland register int i, c, found;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *pt, *new, line[LSIZE];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland abbrev[0] = name[0] = type = '\0';
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (i = 0; i < nlist; i++) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (alist[i]) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland free(alist[i]);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland alist[i] = NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (vlist[i]) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland free(vlist[i]);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland vlist[i] = NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland alist[0] = vlist[0] = NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland found = (-1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland nlist = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland while ((c = getc(fp)) != EOF) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) ungetc(c, fp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((found >= 0) && !isspace(c))
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!fgets(line, LSIZE, fp))
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (pt = line; isspace(*pt); /* void */)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pt++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!*pt || (*pt == '#'))
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland continue;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (pt == line) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* begin new definition */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* LINTED variable format specifier to sscanf(): */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) sscanf(line, SSCANF_FORMAT, &type, abbrev, name);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland found++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland continue;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (found < 0)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (*pt == '(') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* architecture is specified */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (new = strchr(pt, ')'))
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *new++ = '\0';
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland else
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (-1); /* bad specification */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland alist[found] = qstrdup(pt+1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pt = new;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland while (isspace(*pt))
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pt++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (*pt) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland vlist[found] = qstrdup(pt);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (pt = strchr(vlist[found], '\n'))
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *pt = '\0';
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland found++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland nlist++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return ((found >= 0) ? 1 : 0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic void
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandckrdeps(boolean_t a_preinstallCheck)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland struct dirent *drp;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland DIR *dirfp;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland FILE *fp;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char depfile[PATH_MAX+1];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((dirfp = opendir(pkgdir)) == NULL)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland while ((drp = readdir(dirfp)) != NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (drp->d_name[0] == '.')
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland continue;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (strcmp(drp->d_name, rmpkginst) == 0)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland continue; /* others don't include me */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) snprintf(depfile, sizeof (depfile),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "%s/%s/%s", pkgdir, drp->d_name, DEPEND_FILE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((fp = fopen(depfile, "r")) == NULL)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland continue;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ckpreq(fp, drp->d_name, a_preinstallCheck);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) closedir(dirfp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic void
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandckpreq(FILE *fp, char *dname, boolean_t a_preinstallCheck)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland register int i;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *inst;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
23a1ccea6aac035f084a7a4cdc968687d1b02dafRoger A. Faulkner while (getaline(fp)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (type != 'P')
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland continue;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (strcmp(abbrev, rmpkg))
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland continue;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* see if package is installed */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland i = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (strchr(abbrev, '.') == 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) strcat(abbrev, ".*");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkgexist = 1;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland do {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (inst = fpkginst(abbrev, alist[i], vlist[i])) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (strcmp(inst, rmpkginst) == 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland deponme(dname, "", a_preinstallCheck);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fclose(fp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fpkginst(NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } while (++i < nlist);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fpkginst(NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fclose(fp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}