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/*
6e1ae2a33c618c4c2b14aec7d2f21743ddea5837Gary Pennington * Copyright (c) 2004, 2010, Oracle and/or its affiliates. All rights reserved.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <stdio.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <limits.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <stdlib.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <unistd.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <string.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <fcntl.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <sys/types.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <sys/stat.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <signal.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <errno.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <assert.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <pkgdev.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <pkginfo.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <pkglocs.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <locale.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <libintl.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <instzones_api.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <pkglib.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <install.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <libinst.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <libadm.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <messages.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/* commands to execute */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define PKGINFO_CMD "/usr/bin/pkginfo"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define GLOBALZONE_ONLY_PACKAGE_FILE_PATH \
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "/var/sadm/install/gz-only-packages"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#if !defined(TEXT_DOMAIN) /* Should be defined by cc -D */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define TEXT_DOMAIN "SYS_TEST"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#endif
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * forward declarations
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic void _pkginfoInit(struct pkginfo *a_info);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic struct pkginfo *_pkginfoFactory(void);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic char **thisZonePackages;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int numThisZonePackages;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * *****************************************************************************
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * global external (public) functions
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * *****************************************************************************
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: pkginfoFree
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: free pkginfo structure returned from various functions
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments: r_info - pointer to pointer to pkginfo structure to free
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Returns: void
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandvoid
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah WaterlandpkginfoFree(struct pkginfo **r_info)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland struct pkginfo *pinfo;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry assertions */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(r_info != (struct pkginfo **)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* localize reference to info structure to free */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pinfo = *r_info;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* reset callers handle to info structure */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *r_info = (struct pkginfo *)NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(pinfo != (struct pkginfo *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* free up contents of the structure */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _pkginfoInit(pinfo);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* free up structure itself */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) free(pinfo);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: pkginfoIsPkgInstalled
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: determine if specified package is installed, return pkginfo
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * structure describing package if package is installed
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments: r_pinfo - pointer to pointer to pkginfo structure
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * If this pointer is NOT null:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * -On success, this handle is filled in with a pointer
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * --to a newly allocated pkginfo structure describing
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * --the package discovered
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * -On failure, this handle is filled with NULL
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * If this pointer is NULL:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * -no pkginfo structure is returned on success.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a_pkgInst - package instance (name) to lookup
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Returns: boolean_t
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * B_TRUE - package installed, pkginfo returned
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * B_FALSE - package not installed, no pkginfo returned
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * NOTE: This function returns the first instance of package that
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * is installed - see pkginfo() function for details
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * NOTE: Any pkginfo structure returned is placed in new storage for the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * calling function. The caller must use 'pkginfoFree' to dispose
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * of the storage once the pkginfo structure is no longer needed.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandboolean_t
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah WaterlandpkginfoIsPkgInstalled(struct pkginfo **r_pinfo, char *a_pkgInst)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int r;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland struct pkginfo *pinf;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry assertions */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(a_pkgInst != (char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(*a_pkgInst != '\0');
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* reset returned pkginfo structure handle */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (r_pinfo != (struct pkginfo **)NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *r_pinfo = (struct pkginfo *)NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* allocate a new pinfo structure for use in the call to pkginfo */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pinf = _pkginfoFactory();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* lookup the specified package */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* NOTE: required 'pkgdir' set to spool directory or NULL */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland r = pkginfo(pinf, a_pkgInst, NULL, NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_PKGOPS_PKGINFO_RETURNED, a_pkgInst, r);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (r_pinfo != (struct pkginfo **)NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *r_pinfo = pinf;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* free pkginfo structure */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkginfoFree(&pinf);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (r == 0 ? B_TRUE : B_FALSE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: pkgOpenInGzOnlyFile
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: Open the global zone only package list file
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments: a_rootPath - pointer to string representing the root path
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * where the global zone only package list file is
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * located - NULL is the same as "/"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Returns: FILE *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * == NULL - failure - file not open
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * != NULL - success - file pointer returned
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * NOTE: This function will create the file if it does not exist.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah WaterlandFILE *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah WaterlandpkgOpenInGzOnlyFile(char *a_rootPath)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland FILE *pkgingzonlyFP;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char pkgingzonlyPath[PATH_MAX];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int len;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* normalize root path */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (a_rootPath == (char *)NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland a_rootPath = "";
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* generate path to glocal zone only list file */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland len = snprintf(pkgingzonlyPath, sizeof (pkgingzonlyPath), "%s/%s",
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland a_rootPath, GLOBALZONE_ONLY_PACKAGE_FILE_PATH);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (len > sizeof (pkgingzonlyPath)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_CREATE_PATH_2, a_rootPath,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland GLOBALZONE_ONLY_PACKAGE_FILE_PATH);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return ((FILE *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* open global zone only list file */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkgingzonlyFP = fopen(pkgingzonlyPath, "r+");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((pkgingzonlyFP == (FILE *)NULL) && (errno == ENOENT)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkgingzonlyFP = fopen(pkgingzonlyPath, "w+");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((pkgingzonlyFP == (FILE *)NULL) && (errno != ENOENT)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_PKGOPS_OPEN_GZONLY, pkgingzonlyPath,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland strerror(errno));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return ((FILE *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* success - return FILE pointer open on global zone only list file */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (pkgingzonlyFP);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: pkgIsPkgInGzOnly
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: determine if package is recorded as "in global zone only"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * by opening the appropriate files and searching for the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * specified package
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments: a_rootPath - pointer to string representing the root path
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * where the global zone only package list file is
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * located - NULL is the same as "/"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a_pkgInst - pointer to string representing the package instance
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * (name) of the package to lookup
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Returns: boolean_t
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * B_TRUE - package is recorded as "in global zone only"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * B_FALSE - package is NOT recorded as "in gz only"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * NOTE: This function will create the file if it does not exist.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandboolean_t
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah WaterlandpkgIsPkgInGzOnly(char *a_rootPath, char *a_pkgInst)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland FILE *fp;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland boolean_t in_gz_only;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* normalize root path */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (a_rootPath == (char *)NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland a_rootPath = "";
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* open the global zone only package list file */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland fp = pkgOpenInGzOnlyFile(a_rootPath);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (fp == (FILE *)NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(ERR_PKGOPS_CANNOT_OPEN_GZONLY,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland a_rootPath ? a_rootPath : "/");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_FALSE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* is the package recorded as "in global zone only" ? */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland in_gz_only = pkgIsPkgInGzOnlyFP(fp, a_pkgInst);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* close the global zone only package list file */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fclose(fp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* return results */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (in_gz_only);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: pkgIsPkgInGzOnly
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: determine if package is recorded as "in global zone only"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * by searching the specified open FILE for the specified package
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments: a_fp - pointer to FILE handle open on file to search
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a_pkgInst - pointer to string representing the package instance
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * (name) of the package to lookup
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Returns: boolean_t
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * B_TRUE - package is recorded as "in global zone only"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * B_FALSE - package is NOT recorded as "in gz only"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandboolean_t
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah WaterlandpkgIsPkgInGzOnlyFP(FILE *a_fp, char *a_pkgInst)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char line[PATH_MAX+1];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry assertions */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(a_fp != (FILE *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(a_pkgInst != (char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(*a_pkgInst != '\0');
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* rewind the file to the beginning */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland rewind(a_fp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* read the file line by line searching for the specified package */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland while (fgets(line, sizeof (line), a_fp) != (char *)NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int len;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* strip off trailing newlines */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland len = strlen(line);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland while ((len > 0) && (line[len-1] == '\n')) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland line[--len] = '\0';
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* ignore blank and comment lines */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((line[0] == '#') || (line[0] == '\0')) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland continue;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* return true if this is the package we are looking for */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (strcmp(a_pkgInst, line) == 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_PKGOPS_PKG_IS_GZONLY, a_pkgInst);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_TRUE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* end of file - package not found */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_PKGOPS_PKG_NOT_GZONLY, a_pkgInst);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_FALSE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: pkgRemovePackageFromGzonlyList
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: Remove specified package from the global zone only package list
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * file located at a specified root path
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments: a_rootPath - pointer to string representing the root path
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * where the global zone only package list file is
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * located - NULL is the same as "/"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a_pkgInst - pointer to string representing the package instance
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * (name) of the package to remove
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Returns: boolean_t
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * B_TRUE - package is successfully removed
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * B_FALSE - failed to remove package from file
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * NOTE: This function will create the file if it does not exist.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandboolean_t
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah WaterlandpkgRemovePackageFromGzonlyList(char *a_rootPath, char *a_pkgInst)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland FILE *destFP;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland FILE *srcFP;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland boolean_t pkgremoved = B_FALSE;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char destPath[PATH_MAX];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char line[PATH_MAX+1];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char savePath[PATH_MAX];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char srcPath[PATH_MAX];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char timeb[BUFSIZ];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int len;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland struct tm *timep;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland time_t clock;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry assertions */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(a_pkgInst != (char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(*a_pkgInst != '\0');
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* normalize root path */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (a_rootPath == (char *)NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland a_rootPath = "";
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * calculate paths to various objects
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* path to current "source" ingzonly file */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland len = snprintf(srcPath, sizeof (srcPath), "%s/%s",
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland a_rootPath, GLOBALZONE_ONLY_PACKAGE_FILE_PATH);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (len > sizeof (srcPath)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_CREATE_PATH_2, a_rootPath,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland GLOBALZONE_ONLY_PACKAGE_FILE_PATH);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_FALSE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* path to new "destination" ingzonly file */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland len = snprintf(destPath, sizeof (destPath), "%s/%s.tmp",
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland a_rootPath, GLOBALZONE_ONLY_PACKAGE_FILE_PATH);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (len > sizeof (srcPath)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_CREATE_PATH_2, a_rootPath,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland GLOBALZONE_ONLY_PACKAGE_FILE_PATH);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_FALSE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* path to temporary "saved" ingzonly file */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland len = snprintf(savePath, sizeof (savePath), "%s/%s.save",
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland a_rootPath, GLOBALZONE_ONLY_PACKAGE_FILE_PATH);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (len > sizeof (srcPath)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_CREATE_PATH_2, a_rootPath,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland GLOBALZONE_ONLY_PACKAGE_FILE_PATH);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_FALSE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* open source file, creating if necessary */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland srcFP = fopen(srcPath, "r+");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((srcFP == (FILE *)NULL) && (errno == ENOENT)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland srcFP = fopen(srcPath, "w+");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* error if could not open/create file */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (srcFP == (FILE *)NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_PKGOPS_OPEN_GZONLY, srcPath, strerror(errno));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_FALSE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* open/create new destination file */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) remove(destPath);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland destFP = fopen(destPath, "w");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (destFP == (FILE *)NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_PKGOPS_TMPOPEN, destPath, strerror(errno));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (srcFP != (FILE *)NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fclose(srcFP);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_FALSE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* add standard comment to beginning of file */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) time(&clock);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland timep = localtime(&clock);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) strftime(timeb, sizeof (timeb), "%c\n", timep);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* put standard header at the beginning of the file */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fprintf(destFP, MSG_GZONLY_FILE_HEADER,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland get_prog_name(), "remove", a_pkgInst, timeb);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* read source/write destination - removing specified package */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland while (fgets(line, sizeof (line), srcFP) != (char *)NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int len;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* strip off trailing newlines */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland len = strlen(line);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland while ((len > 0) && (line[len-1] == '\n')) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland line[--len] = '\0';
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* ignore blank and comment lines */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((line[0] == '#') || (line[0] == '\0')) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland continue;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* add pkg if yet to add and pkg <= line */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((pkgremoved == B_FALSE) && (strcmp(a_pkgInst, line) == 0)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkgremoved = B_TRUE;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fprintf(destFP, "%s\n", line);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* close both files */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fclose(srcFP);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fclose(destFP);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * if package not found there is no need to update the original file
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (pkgremoved == B_FALSE) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) unlink(destPath);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_TRUE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Now we want to make a copy of the old gzonly file as a
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * fail-safe.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((access(savePath, F_OK) == 0) && remove(savePath)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_REMOVE, savePath, strerror(errno));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) remove(destPath);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_FALSE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (link(srcPath, savePath) != 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_LINK, savePath, srcPath, strerror(errno));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) remove(destPath);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_FALSE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (rename(destPath, srcPath) != 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_RENAME, destPath, srcPath, strerror(errno));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (rename(savePath, srcPath)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_RENAME, savePath, srcPath, strerror(errno));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) remove(destPath);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_FALSE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (remove(savePath) != 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_REMOVE, savePath, strerror(errno));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* successfully removed package */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_PKGOPS_REMOVED_GZPKG, a_pkgInst);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_TRUE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: pkgAddPackageFromGzonlyList
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: Add specified package to the global zone only package list
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * file located at a specified root path
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments: a_rootPath - pointer to string representing the root path
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * where the global zone only package list file is
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * located - NULL is the same as "/"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a_pkgInst - pointer to string representing the package instance
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * (name) of the package to add
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Returns: boolean_t
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * B_TRUE - package is successfully added
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * B_FALSE - failed to add package to the file
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * NOTE: This function will create the file if it does not exist.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandboolean_t
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah WaterlandpkgAddPackageToGzonlyList(char *a_pkgInst, char *a_rootPath)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland FILE *destFP;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland FILE *srcFP;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland boolean_t pkgadded = B_FALSE;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char destPath[PATH_MAX];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char line[PATH_MAX+1];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char savePath[PATH_MAX];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char srcPath[PATH_MAX];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char timeb[BUFSIZ];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int len;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland struct tm *timep;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland time_t clock;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry assertions */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(a_pkgInst != (char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(*a_pkgInst != '\0');
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* normalize root path */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (a_rootPath == (char *)NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland a_rootPath = "";
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry debugging info */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_PKGOPS_ADDGZPKG, a_pkgInst, a_rootPath);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * calculate paths to various objects
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* path to current "source" ingzonly file */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland len = snprintf(srcPath, sizeof (srcPath), "%s/%s",
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland a_rootPath, GLOBALZONE_ONLY_PACKAGE_FILE_PATH);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (len > sizeof (srcPath)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_CREATE_PATH_2, a_rootPath,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland GLOBALZONE_ONLY_PACKAGE_FILE_PATH);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_FALSE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* path to new "destination" ingzonly file */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland len = snprintf(destPath, sizeof (destPath), "%s/%s.tmp",
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland a_rootPath, GLOBALZONE_ONLY_PACKAGE_FILE_PATH);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (len > sizeof (srcPath)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_CREATE_PATH_2, a_rootPath,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland GLOBALZONE_ONLY_PACKAGE_FILE_PATH);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_FALSE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* path to temporary "saved" ingzonly file */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland len = snprintf(savePath, sizeof (savePath), "%s/%s.save",
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland a_rootPath, GLOBALZONE_ONLY_PACKAGE_FILE_PATH);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (len > sizeof (srcPath)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_CREATE_PATH_2, a_rootPath,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland GLOBALZONE_ONLY_PACKAGE_FILE_PATH);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_FALSE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* open source file, creating if necessary */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland srcFP = fopen(srcPath, "r+");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((srcFP == (FILE *)NULL) && (errno == ENOENT)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland srcFP = fopen(srcPath, "w+");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* error if could not open/create file */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (srcFP == (FILE *)NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_PKGOPS_OPEN_GZONLY, srcPath, strerror(errno));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_FALSE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* open/create new destination file */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) remove(destPath);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland destFP = fopen(destPath, "w");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (destFP == (FILE *)NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_PKGOPS_TMPOPEN, destPath, strerror(errno));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (srcFP != (FILE *)NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fclose(srcFP);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_FALSE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* add standard comment to beginning of file */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) time(&clock);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland timep = localtime(&clock);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) strftime(timeb, sizeof (timeb), "%c\n", timep);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* put standard header at the beginning of the file */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fprintf(destFP, MSG_GZONLY_FILE_HEADER,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland get_prog_name(), "add", a_pkgInst, timeb);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* read source/write destination; add package at appropriate location */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland while (fgets(line, sizeof (line), srcFP) != (char *)NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int len;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* strip off trailing newlines */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland len = strlen(line);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland while ((len > 0) && (line[len-1] == '\n')) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland line[--len] = '\0';
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* ignore blank and comment lines */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((line[0] == '#') || (line[0] == '\0')) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland continue;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* add pkg if yet to add and pkg <= line */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((pkgadded == B_FALSE) && (strcmp(a_pkgInst, line) <= 0)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (strcmp(a_pkgInst, line) != 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fprintf(destFP, "%s\n", a_pkgInst);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkgadded = B_TRUE;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fprintf(destFP, "%s\n", line);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if package not added yet, add to end of the file */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (pkgadded == B_FALSE) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fprintf(destFP, "%s\n", a_pkgInst);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* close both files */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fclose(srcFP);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fclose(destFP);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Now we want to make a copy of the old gzonly file as a
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * fail-safe.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((access(savePath, F_OK) == 0) && remove(savePath)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_REMOVE, savePath, strerror(errno));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) remove(destPath);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_FALSE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (link(srcPath, savePath) != 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_LINK, savePath, srcPath, strerror(errno));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) remove(destPath);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_FALSE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (rename(destPath, srcPath) != 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_RENAME, destPath, srcPath, strerror(errno));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (rename(savePath, srcPath)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_RENAME, savePath, srcPath, strerror(errno));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) remove(destPath);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_FALSE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (remove(savePath) != 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_REMOVE, savePath, strerror(errno));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* successfully added package */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_PKGOPS_ADDED_GZPKG, a_pkgInst);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_TRUE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: pkginfoParamTruth
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: Search pkginfo file for specified parameter/value pair
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments: a_fp - Pointer to FILE handle open on pkginfo file to search
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a_param - Pointer to string representing the parameter name
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * to search for
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a_value - Pointer to string representing the "success" value
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * being searched for
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a_default - determine results if parameter NOT found
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * B_TRUE - parameter is TRUE if not found
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * B_FALSE - parameter is FALSE if not found
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Returns: boolean_t
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * B_TRUE - the parameter was found and matched the specified value
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * OR the paramter was not found and a_default == B_TRUE
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * B_FALSE - the parameter was found and did NOT match the value
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * OR the paramter was not found and a_default == B_FALSE
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandboolean_t
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah WaterlandpkginfoParamTruth(FILE *a_fp, char *a_param, char *a_value, boolean_t a_default)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *param;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland boolean_t result;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry assertions */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(a_fp != (FILE *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(a_param != (char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(*a_param != '\0');
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(a_value != (char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(*a_value != '\0');
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* rewind the file to the beginning */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland rewind(a_fp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* search pkginfo file for the specified parameter */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland param = fpkgparam(a_fp, a_param);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (param == (char *)NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* parameter not found - return default */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland result = a_default;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else if (*param == '\0') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* parameter found but no value - return default */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland result = a_default;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else if (strcasecmp(param, a_value) == 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* paramter found - matches value */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland result = B_TRUE;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* parameter found - does not match value */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland result = B_FALSE;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* exit debugging info */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_PKGOPS_PARAMTRUTH_RESULTS,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland a_param, a_value, a_default == B_TRUE ? "true" : "false",
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland param ? param : "?", result == B_TRUE ? "true" : "false");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if parameter value found, free results */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (param != (char *)NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) free(param);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* return results of search */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (result);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: pkgGetPackageList
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: Determine list of packages based on list of packages that are
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * available, category of packages to select, and list of packages
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * to select.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments: r_pkgList - pointer to pointer to string array where the list
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * of selected packages will be returned
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a_argv - pointer to string array containing list of packages
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * to select
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a_optind - index into string array of first package to select
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a_categories - pointer to string representing the categories of
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * packages to select
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a_categoryList - pointer to string array representing a list
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * of categories to select
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a_pkgdev - package dev containing packages that can be selected
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Returns: int
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * == 0 - packages found r_pkgList contains results package list retrieved
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * == -1 - no packages found (errno == ENOPKG)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * != 0 - "quit" value entered by user
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * NOTE: If both a category and a list of packages to select are provided
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * the category is used over the list of packages provided
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * NOTE: If neither a category nor a list of packages to select are
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * provided, an error is returned
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandint
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah WaterlandpkgGetPackageList(char ***r_pkgList, char **a_argv, int a_optind,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *a_categories, char **a_categoryList, struct pkgdev *a_pkgdev)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *all_pkgs[4] = {"all", NULL};
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry assertions */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(a_pkgdev != (struct pkgdev *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(a_pkgdev->dirname != (char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(*a_pkgdev->dirname != '\0');
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(r_pkgList != (char ***)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(a_argv != (char **)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry debugging info */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_PKGOPS_GETPKGLIST_ENTRY);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_PKGOPS_GETPKGLIST_ARGS, a_pkgdev->dirname,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland a_categories ? a_categories : "?");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* reset returned package list handle */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *r_pkgList = (char **)NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * generate list of packages to be removed: if removing by category,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * then generate package list based on all packages by category,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * else generate package list based on all packages specified.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (a_categories != NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* generate package list from all packages in given category */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *r_pkgList = gpkglist(a_pkgdev->dirname, &all_pkgs[0],
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland a_categoryList);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (*r_pkgList == NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_PKGOPS_GPKGLIST_CATFAILED, a_categories);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_CAT_FND, a_categories);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_PKGOPS_GPKGLIST_CATOK, a_categories);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* generate package list from specified packages */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *r_pkgList = gpkglist(a_pkgdev->dirname, &a_argv[a_optind], NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if list generated return results */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (*r_pkgList != NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_PKGOPS_GPKGLIST_OK);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* handle error from gpkglist */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland switch (errno) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case ENOPKG: /* no packages */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_PKGOPS_GPKGLIST_ENOPKG);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (-1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case ESRCH:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_PKGOPS_GPKGLIST_ESRCH);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case EINTR:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_PKGOPS_GPKGLIST_EINTR);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (3);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland default:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_PKGOPS_GPKGLIST_UNKNOWN, errno);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_GPKGLIST_ERROR);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (99);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * return string representing path to "global zone only file"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandchar *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah WaterlandpkgGetGzOnlyPath(void)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (GLOBALZONE_ONLY_PACKAGE_FILE_PATH);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: pkgAddThisZonePackage
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: Add specified package to internal list of "this zone only" pkgs
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments: a_pkgInst - name of package to add to list
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Returns: void
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandvoid
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah WaterlandpkgAddThisZonePackage(char *a_pkgInst)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry assertions */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(a_pkgInst != (char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(*a_pkgInst != '\0');
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* do not duplicate entries */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (pkgPackageIsThisZone(a_pkgInst) == B_TRUE) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* add package name to internal list */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (thisZonePackages == (char **)NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland thisZonePackages =
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (char **)calloc(2, sizeof (char **));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland thisZonePackages =
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (char **)realloc(thisZonePackages,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland sizeof (char **)*(numThisZonePackages+2));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* handle out of memory error */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (thisZonePackages == (char **)NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_MEMORY, errno);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(99);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* add this entry to the end of the list */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland thisZonePackages[numThisZonePackages] = strdup(a_pkgInst);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (thisZonePackages[numThisZonePackages] == (char *)NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_MEMORY, errno);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(99);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland numThisZonePackages++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* make sure end of the list is properly terminated */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland thisZonePackages[numThisZonePackages] = (char *)NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* exit debugging info */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_PKGOPS_ADD_TZP, numThisZonePackages,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland thisZonePackages[numThisZonePackages-1]);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: pkgPackageIsThisZone
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: Determine if the specified package is marked to be installed
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * in this zone only
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments: a_pkgInst - pointer to string representing package name to check
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Returns: boolean_t
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * B_TRUE - the package IS "this zone only"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * B_FALSE - the paackage is NOT "this zone only"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandboolean_t
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah WaterlandpkgPackageIsThisZone(char *a_pkgInst)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int n;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry assertions */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(a_pkgInst != (char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(*a_pkgInst != '\0');
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * see if this package is in the "this zone only" list
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (n = 0; n < numThisZonePackages; n++) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (strcmp(a_pkgInst, thisZonePackages[n]) == 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_PKGOPS_IS_THISZONE, a_pkgInst);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_TRUE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* path is not in "this zone only" list */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_PKGOPS_IS_NOT_THISZONE, a_pkgInst);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_FALSE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: pkgLocateHighestInst
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: Locate the highest installed instance of a package
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments: r_path - [RO, *RW] - (char *)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Pointer to buffer where the full path to the top level
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * directory containing the latest instance of the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * specified package is located is placed.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * r_pathLen - [RO, *RO] - (int)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Integer representing the size of r_path in bytes.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * r_pkgInst - [RO, *RW] - (char *)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Pointer to buffer where the package instance name of the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * latest instance of the specified package is placed.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * r_pkgInstLen - [RO, *RO] - (int)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Integer representing the size of r_pkgInst in bytes.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a_rootPath - [RO, *RO] - (char *)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Pointer to string representing the root path to look
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * for the latest instance of the specified package.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a_pkgInst - [RO, *RO] - (char *)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Pointer to string representing the name of the package
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * to locate the latest installed instance of.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandvoid
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah WaterlandpkgLocateHighestInst(char *r_path, int r_pathLen, char *r_pkgInst,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int r_pkgInstLen, char *a_rootPath, char *a_pkgInst)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char pkgInstPath[PATH_MAX] = {'\0'};
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char pkgWild[PKGSIZ+1] = {'\0'};
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char pkgName[PKGSIZ+1] = {'\0'};
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int npkgs;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland struct pkginfo *pinf = (struct pkginfo *)NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry assertions */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(r_path != (char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(r_pathLen > 0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(r_pkgInst != (char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(r_pkgInstLen > 0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(a_pkgInst != (char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(*a_pkgInst != '\0');
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* normalize root path */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((a_rootPath == (char *)NULL) || (strcmp(a_rootPath, "/") == 0)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland a_rootPath = "";
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* construct path to package repository directory (eg. /var/sadm/pkg) */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) snprintf(pkgInstPath, sizeof (pkgInstPath), "%s%s", a_rootPath,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland PKGLOC);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry debugging info */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_PKGOPS_LOCHIGH_ENTRY);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_PKGOPS_LOCHIGH_ARGS, pkgInstPath, a_pkgInst);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* reset returned path/package instance so both ares empty */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *r_path = '\0';
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *r_pkgInst = '\0';
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* remove any architecture extension */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkgstrGetToken_r((char *)NULL, a_pkgInst, 0, ".",
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkgName, sizeof (pkgName));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* make sure that the package name is valid and can be wild carded */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (pkgnmchk(pkgName, NULL, 0) || strchr(pkgName, '.')) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_PKGOPS_LOCHIGH_BAD_PKGNAME, pkgName);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(99);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* create wild card specification for this package instance */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) snprintf(pkgWild, sizeof (pkgWild), "%s.*", pkgName);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_PKGOPS_LOCHIGH_WILDCARD, pkgName, pkgWild);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * inspect the system to determine if any instances of the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * package being installed already exist on the system
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (npkgs = 0; ; npkgs++) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *savePkgdir;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int r;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* allocate new pinfo structure for use in the pkginfo call */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pinf = _pkginfoFactory();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * lookup the specified package; the first call will cause the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * pkgdir directory to be opened - it will be closed when the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * end of directory is read and pkginfo() returns != 0. You must
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * cycle through all instances until pkginfo() returns != 0.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * NOTE: pkginfo() requires the global variable 'pkgdir' be set
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * to the package installed directory (<root>/var/sadm/pkg).
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland savePkgdir = pkgdir;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkgdir = pkgInstPath;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland r = pkginfo(pinf, pkgWild, NULL, NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkgdir = savePkgdir;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_PKGOPS_PKGINFO_RETURNED, pkgName, r);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* break out of loop of no package found */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (r != 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkginfoFree(&pinf);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_PKGOPS_LOCHIGH_INSTANCE, npkgs,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pinf->pkginst ? pinf->pkginst : "",
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pinf->name ? pinf->name : "",
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pinf->arch ? pinf->arch : "",
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pinf->version ? pinf->version : "",
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pinf->vendor ? pinf->vendor : "",
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pinf->basedir ? pinf->basedir : "",
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pinf->catg ? pinf->catg : "",
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pinf->status);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* save path/instance name for this instance found */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) strlcpy(r_pkgInst, pinf->pkginst, r_pkgInstLen);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkgstrPrintf_r(r_path, r_pathLen, "%s%s/%s", a_rootPath,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland PKGLOC, pinf->pkginst);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkginfoFree(&pinf);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_PKGOPS_LOCHIGH_RETURN, npkgs, r_pkgInst, r_path);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: pkgTestInstalled
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: determine if package is installed at specified root path
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments: a_packageName - name of package to test
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a_rootPath - root path of alternative root to test
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Returns: B_TRUE - package is installed
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * B_FALSE - package is not installed
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandboolean_t
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah WaterlandpkgTestInstalled(char *a_packageName, char *a_rootPath)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char cmd[MAXPATHLEN+1];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int rc;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry assertions */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(a_packageName != (char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(*a_packageName != '\0');
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(a_rootPath != (char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(a_rootPath != '\0');
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry debugging info */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_PKG_TEST_EXISTENCE, a_packageName, a_rootPath);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * create pkginfo command to execute:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * /usr/bin/pkginfo -q <packageName>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) snprintf(cmd, sizeof (cmd),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "%s -q %s", PKGINFO_CMD, a_packageName);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* execute command */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland rc = system(cmd);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* return success if pkginfo returns "0" */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (rc == 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_PKG_INSTALLED, a_packageName, a_rootPath);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_TRUE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* package not installed */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_PKG_NOT_INSTALLED, a_packageName, a_rootPath);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_FALSE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * *****************************************************************************
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * static internal (private) functions
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * *****************************************************************************
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic void
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland_pkginfoInit(struct pkginfo *a_info)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry assertions */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(a_info != (struct pkginfo *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* free previously allocated space */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (a_info->pkginst) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland free(a_info->pkginst);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (a_info->arch)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland free(a_info->arch);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (a_info->version)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland free(a_info->version);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (a_info->basedir)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland free(a_info->basedir);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (a_info->name)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland free(a_info->name);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (a_info->vendor)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland free(a_info->vendor);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (a_info->catg)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland free(a_info->catg);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland a_info->pkginst = NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland a_info->arch = a_info->version = NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland a_info->basedir = a_info->name = NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland a_info->vendor = a_info->catg = NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland a_info->status = PI_UNKNOWN;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic struct pkginfo *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland_pkginfoFactory(void)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland struct pkginfo *pinf;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pinf = (struct pkginfo *)calloc(1, sizeof (struct pkginfo));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (pinf == (struct pkginfo *)NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_MEM);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland exit(1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _pkginfoInit(pinf);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (pinf);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}