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/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Use is subject to license terms.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/* All Rights Reserved */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <stdio.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <ctype.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <string.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <signal.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <errno.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <stdlib.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <valtools.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include "pkginfo.h"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include "pkglib.h"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include "pkglibmsgs.h"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include "pkgstrct.h"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include "pkglocale.h"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern char *pkgdir; /* WHERE? */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/* libadm.a */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern CKMENU *allocmenu(char *label, int attr);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern int ckitem(CKMENU *menup, char *item[], short max, char *defstr,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *error, char *help, char *prompt);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern int pkgnmchk(register char *pkg, register char *spec,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int presvr4flg);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern int fpkginfo(struct pkginfo *info, char *pkginst);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern char *fpkginst(char *pkg, ...);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern int setinvis(CKMENU *menup, char *choice);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern int setitem(CKMENU *menup, char *choice);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define CMDSIZ 512
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define LSIZE 256
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define MAXSIZE 128
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define MALLOCSIZ 128
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define MAX_CAT_ARGS 64
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define MAX_CAT_LEN 16
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int cont_in_list = 0; /* live continuation */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic char cont_keyword[PKGSIZ+1]; /* the continuation keyword */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Allocate memory for the next package name. This function attempts the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * allocation and if that succeeds, returns a pointer to the new memory
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * location and increments "n". Otherwise, it returens NULL and n is
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * unchanged.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic char **
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandnext_n(int *n, char **nwpkg)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int loc_n = *n;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((++loc_n % MALLOCSIZ) == 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland nwpkg = (char **)realloc(nwpkg,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (loc_n+MALLOCSIZ) * sizeof (char **));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (nwpkg == NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(pkg_gt(ERR_MEMORY), errno);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland errno = ENOMEM;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *n = loc_n;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (nwpkg);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * This informs gpkglist() to put a keyword at the head of the pkglist. This
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * was originally intended for live continue, but it may have other
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * applications as well.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandvoid
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandpkglist_cont(char *keyword)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland cont_in_list = 1;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) strncpy(cont_keyword, keyword, PKGSIZ);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * This function constructs the list of packages that the user wants managed.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * It may be a list on the command line, it may be some or all of the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * packages in a directory or it may be a continuation from a previous
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * dryrun. It may also be a list of pkgs gathered from the CATEGORY parameter
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * in a spooled or installed pkginfo file.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandchar **
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandgpkglist(char *dir, char **pkg, char **catg)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland struct _choice_ *chp;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland struct pkginfo info;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *inst;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland CKMENU *menup;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char temp[LSIZE];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *savedir, **nwpkg;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int i, n;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland savedir = pkgdir;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkgdir = dir;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland info.pkginst = NULL; /* initialize for memory handling */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (pkginfo(&info, "all", NULL, NULL)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland errno = ENOPKG; /* contains no valid packages */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkgdir = savedir;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * If no explicit list was provided and this is not a continuation
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * (implying a certain level of direction on the caller's part)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * present a menu of available packages for installation.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (pkg[0] == NULL && !cont_in_list) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland menup = allocmenu(pkg_gt(HEADER), CKALPHA);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (setinvis(menup, "all")) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland errno = EFAULT;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland do {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* bug id 1087404 */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!info.pkginst || !info.name || !info.arch ||
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland !info.version)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland continue;
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore (void) snprintf(temp, sizeof (temp),
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore "%s %s\n(%s) %s", info.pkginst,
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore info.name, info.arch, info.version);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (setitem(menup, temp)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland errno = EFAULT;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } while (pkginfo(&info, "all", NULL, NULL) == 0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* clear memory usage by pkginfo */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) pkginfo(&info, NULL, NULL, NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkgdir = savedir; /* restore pkgdir to orig value */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland nwpkg = (char **)calloc(MALLOCSIZ, sizeof (char **));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland n = ckitem(menup, nwpkg, MALLOCSIZ, "all", NULL,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkg_gt(HELP), pkg_gt(PROMPT));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (n) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland free(nwpkg);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland errno = ((n == 3) ? EINTR : EFAULT);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkgdir = savedir;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (strcmp(nwpkg[0], "all") == 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland chp = menup->choice;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (n = 0; chp; /* void */) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland nwpkg[n] = strdup(chp->token);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland nwpkg = next_n(&n, nwpkg);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland chp = chp->next;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland nwpkg[n] = NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (n = 0; nwpkg[n]; n++)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland nwpkg[n] = strdup(nwpkg[n]);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) setitem(menup, NULL); /* free resources */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland free(menup);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkgdir = savedir;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (nwpkg);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* clear memory usage by pkginfo */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) pkginfo(&info, NULL, NULL, NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland nwpkg = (char **)calloc(MALLOCSIZ, sizeof (char **));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * pkg array contains the instance identifiers to
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * be selected, or possibly wildcard definitions
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland i = n = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland do {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (cont_in_list) { /* This is a live continuation. */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland nwpkg[n] = strdup(cont_keyword);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland nwpkg = next_n(&n, nwpkg);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland nwpkg[n] = NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland cont_in_list = 0; /* handled */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (pkg[0] == NULL) { /* It's just a continuation. */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else if (pkgnmchk(pkg[i], "all", 1)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* wildcard specification */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fpkginst(NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland inst = fpkginst(pkg[i], NULL, NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (inst == NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(pkg_gt(ERR_NOPKG), pkg[i]);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland free(nwpkg);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland nwpkg = NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland errno = ESRCH;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland do {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (catg != NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkginfo(&info, inst, NULL, NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!is_same_CATEGORY(catg,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland info.catg))
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland continue;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland nwpkg[n] = strdup(inst);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland nwpkg = next_n(&n, nwpkg);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland nwpkg[n] = NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } while (inst = fpkginst(pkg[i], NULL, NULL));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (fpkginfo(&info, pkg[i])) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(pkg_gt(ERR_NOPKG), pkg[i]);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland free(nwpkg);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland nwpkg = NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland errno = ESRCH;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland nwpkg[n] = strdup(pkg[i]);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland nwpkg = next_n(&n, nwpkg);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland nwpkg[n] = NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } while (pkg[++i]);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fpkginst(NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fpkginfo(&info, NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkgdir = savedir; /* restore pkgdir to orig value */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (catg != NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (nwpkg[0] == NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * No pkgs in the spooled directory matched the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * category specified by the user.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland free(nwpkg);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (nwpkg);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Check category passed in on the command line to see if it is valid.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * returns 0 if the category is valid
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * returns 1 if the category is invalid
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandint
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandis_not_valid_category(char **category, char *progname)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (strcasecmp(progname, "pkgrm") == 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (is_same_CATEGORY(category, "system"))
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Check category length
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * returns 0 if the category length is valid
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * returns 1 if a category has length > 16 chars as defined by the SVr4 ABI
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandint
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandis_not_valid_length(char **category)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int i;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (i = 0; category[i] != NULL; i++) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (strlen(category[i]) > MAX_CAT_LEN)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Check category passed in on the command line against the CATEGORY in the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * spooled or installed packages pkginfo file.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * returns 0 if categories match
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * returns 1 if categories don't match
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandint
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandis_same_CATEGORY(char **category, char *persistent_category)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int i, j, n = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *pers_catg, **pers_catgs;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pers_catg = strdup(persistent_category);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pers_catgs = (char **)calloc(MAX_CAT_LEN, sizeof (char **));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pers_catgs[n++] = strtok(pers_catg, " \t\n, ");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland while (pers_catgs[n] = strtok(NULL, " \t\n, "))
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland n++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (i = 0; category[i] != NULL; i++) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (j = 0; j < n; j++) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (strcasecmp(category[i], pers_catgs[j]) == 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Given a string of categories, construct a null-terminated array of
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * categories.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * returns the array of categories or NULL
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandchar **
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandget_categories(char *catg_arg)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int n = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *tmp_catg;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char **catgs;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland tmp_catg = strdup(catg_arg);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland catgs = (char **)calloc(MAX_CAT_LEN, sizeof (char **));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland catgs[n++] = strtok(tmp_catg, " \t\n, ");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland while (catgs[n] = strtok(NULL, " \t\n, "))
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland n++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (*catgs == NULL)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland else
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (catgs);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}