15c51f124SMoriah Waterland /* 25c51f124SMoriah Waterland * CDDL HEADER START 35c51f124SMoriah Waterland * 45c51f124SMoriah Waterland * The contents of this file are subject to the terms of the 55c51f124SMoriah Waterland * Common Development and Distribution License (the "License"). 65c51f124SMoriah Waterland * You may not use this file except in compliance with the License. 75c51f124SMoriah Waterland * 85c51f124SMoriah Waterland * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 95c51f124SMoriah Waterland * or http://www.opensolaris.org/os/licensing. 105c51f124SMoriah Waterland * See the License for the specific language governing permissions 115c51f124SMoriah Waterland * and limitations under the License. 125c51f124SMoriah Waterland * 135c51f124SMoriah Waterland * When distributing Covered Code, include this CDDL HEADER in each 145c51f124SMoriah Waterland * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 155c51f124SMoriah Waterland * If applicable, add the following below this CDDL HEADER, with the 165c51f124SMoriah Waterland * fields enclosed by brackets "[]" replaced with your own identifying 175c51f124SMoriah Waterland * information: Portions Copyright [yyyy] [name of copyright owner] 185c51f124SMoriah Waterland * 195c51f124SMoriah Waterland * CDDL HEADER END 205c51f124SMoriah Waterland */ 215c51f124SMoriah Waterland 225c51f124SMoriah Waterland /* 23*6e1ae2a3SGary Pennington * Copyright (c) 2004, 2010, Oracle and/or its affiliates. All rights reserved. 245c51f124SMoriah Waterland */ 255c51f124SMoriah Waterland 265c51f124SMoriah Waterland 275c51f124SMoriah Waterland #include <stdio.h> 285c51f124SMoriah Waterland #include <limits.h> 295c51f124SMoriah Waterland #include <stdlib.h> 305c51f124SMoriah Waterland #include <unistd.h> 315c51f124SMoriah Waterland #include <string.h> 325c51f124SMoriah Waterland #include <fcntl.h> 335c51f124SMoriah Waterland #include <sys/types.h> 345c51f124SMoriah Waterland #include <sys/stat.h> 355c51f124SMoriah Waterland #include <signal.h> 365c51f124SMoriah Waterland #include <errno.h> 375c51f124SMoriah Waterland #include <assert.h> 385c51f124SMoriah Waterland #include <pkgdev.h> 395c51f124SMoriah Waterland #include <pkginfo.h> 405c51f124SMoriah Waterland #include <pkglocs.h> 415c51f124SMoriah Waterland #include <locale.h> 425c51f124SMoriah Waterland #include <libintl.h> 435c51f124SMoriah Waterland #include <instzones_api.h> 445c51f124SMoriah Waterland #include <pkglib.h> 455c51f124SMoriah Waterland #include <install.h> 465c51f124SMoriah Waterland #include <libinst.h> 475c51f124SMoriah Waterland #include <libadm.h> 485c51f124SMoriah Waterland #include <messages.h> 495c51f124SMoriah Waterland 505c51f124SMoriah Waterland /* commands to execute */ 515c51f124SMoriah Waterland 525c51f124SMoriah Waterland #define PKGINFO_CMD "/usr/bin/pkginfo" 535c51f124SMoriah Waterland 545c51f124SMoriah Waterland #define GLOBALZONE_ONLY_PACKAGE_FILE_PATH \ 555c51f124SMoriah Waterland "/var/sadm/install/gz-only-packages" 565c51f124SMoriah Waterland 575c51f124SMoriah Waterland #if !defined(TEXT_DOMAIN) /* Should be defined by cc -D */ 585c51f124SMoriah Waterland #define TEXT_DOMAIN "SYS_TEST" 595c51f124SMoriah Waterland #endif 605c51f124SMoriah Waterland 615c51f124SMoriah Waterland /* 625c51f124SMoriah Waterland * forward declarations 635c51f124SMoriah Waterland */ 645c51f124SMoriah Waterland 655c51f124SMoriah Waterland static void _pkginfoInit(struct pkginfo *a_info); 665c51f124SMoriah Waterland static struct pkginfo *_pkginfoFactory(void); 675c51f124SMoriah Waterland static char **thisZonePackages; 685c51f124SMoriah Waterland static int numThisZonePackages; 695c51f124SMoriah Waterland 705c51f124SMoriah Waterland /* 715c51f124SMoriah Waterland * ***************************************************************************** 725c51f124SMoriah Waterland * global external (public) functions 735c51f124SMoriah Waterland * ***************************************************************************** 745c51f124SMoriah Waterland */ 755c51f124SMoriah Waterland 765c51f124SMoriah Waterland /* 775c51f124SMoriah Waterland * Name: pkginfoFree 785c51f124SMoriah Waterland * Description: free pkginfo structure returned from various functions 795c51f124SMoriah Waterland * Arguments: r_info - pointer to pointer to pkginfo structure to free 805c51f124SMoriah Waterland * Returns: void 815c51f124SMoriah Waterland */ 825c51f124SMoriah Waterland 835c51f124SMoriah Waterland void 845c51f124SMoriah Waterland pkginfoFree(struct pkginfo **r_info) 855c51f124SMoriah Waterland { 865c51f124SMoriah Waterland struct pkginfo *pinfo; 875c51f124SMoriah Waterland 885c51f124SMoriah Waterland /* entry assertions */ 895c51f124SMoriah Waterland 905c51f124SMoriah Waterland assert(r_info != (struct pkginfo **)NULL); 915c51f124SMoriah Waterland 925c51f124SMoriah Waterland /* localize reference to info structure to free */ 935c51f124SMoriah Waterland 945c51f124SMoriah Waterland pinfo = *r_info; 955c51f124SMoriah Waterland 965c51f124SMoriah Waterland /* reset callers handle to info structure */ 975c51f124SMoriah Waterland 985c51f124SMoriah Waterland *r_info = (struct pkginfo *)NULL; 995c51f124SMoriah Waterland 1005c51f124SMoriah Waterland assert(pinfo != (struct pkginfo *)NULL); 1015c51f124SMoriah Waterland 1025c51f124SMoriah Waterland /* free up contents of the structure */ 1035c51f124SMoriah Waterland 1045c51f124SMoriah Waterland _pkginfoInit(pinfo); 1055c51f124SMoriah Waterland 1065c51f124SMoriah Waterland /* free up structure itself */ 1075c51f124SMoriah Waterland 1085c51f124SMoriah Waterland (void) free(pinfo); 1095c51f124SMoriah Waterland } 1105c51f124SMoriah Waterland 1115c51f124SMoriah Waterland /* 1125c51f124SMoriah Waterland * Name: pkginfoIsPkgInstalled 1135c51f124SMoriah Waterland * Description: determine if specified package is installed, return pkginfo 1145c51f124SMoriah Waterland * structure describing package if package is installed 1155c51f124SMoriah Waterland * Arguments: r_pinfo - pointer to pointer to pkginfo structure 1165c51f124SMoriah Waterland * If this pointer is NOT null: 1175c51f124SMoriah Waterland * -On success, this handle is filled in with a pointer 1185c51f124SMoriah Waterland * --to a newly allocated pkginfo structure describing 1195c51f124SMoriah Waterland * --the package discovered 1205c51f124SMoriah Waterland * -On failure, this handle is filled with NULL 1215c51f124SMoriah Waterland * If this pointer is NULL: 1225c51f124SMoriah Waterland * -no pkginfo structure is returned on success. 1235c51f124SMoriah Waterland * a_pkgInst - package instance (name) to lookup 1245c51f124SMoriah Waterland * Returns: boolean_t 1255c51f124SMoriah Waterland * B_TRUE - package installed, pkginfo returned 1265c51f124SMoriah Waterland * B_FALSE - package not installed, no pkginfo returned 1275c51f124SMoriah Waterland * NOTE: This function returns the first instance of package that 1285c51f124SMoriah Waterland * is installed - see pkginfo() function for details 1295c51f124SMoriah Waterland * NOTE: Any pkginfo structure returned is placed in new storage for the 1305c51f124SMoriah Waterland * calling function. The caller must use 'pkginfoFree' to dispose 1315c51f124SMoriah Waterland * of the storage once the pkginfo structure is no longer needed. 1325c51f124SMoriah Waterland */ 1335c51f124SMoriah Waterland 1345c51f124SMoriah Waterland boolean_t 1355c51f124SMoriah Waterland pkginfoIsPkgInstalled(struct pkginfo **r_pinfo, char *a_pkgInst) 1365c51f124SMoriah Waterland { 1375c51f124SMoriah Waterland int r; 1385c51f124SMoriah Waterland struct pkginfo *pinf; 1395c51f124SMoriah Waterland 1405c51f124SMoriah Waterland /* entry assertions */ 1415c51f124SMoriah Waterland 1425c51f124SMoriah Waterland assert(a_pkgInst != (char *)NULL); 1435c51f124SMoriah Waterland assert(*a_pkgInst != '\0'); 1445c51f124SMoriah Waterland 1455c51f124SMoriah Waterland /* reset returned pkginfo structure handle */ 1465c51f124SMoriah Waterland 1475c51f124SMoriah Waterland if (r_pinfo != (struct pkginfo **)NULL) { 1485c51f124SMoriah Waterland *r_pinfo = (struct pkginfo *)NULL; 1495c51f124SMoriah Waterland } 1505c51f124SMoriah Waterland 1515c51f124SMoriah Waterland /* allocate a new pinfo structure for use in the call to pkginfo */ 1525c51f124SMoriah Waterland 1535c51f124SMoriah Waterland pinf = _pkginfoFactory(); 1545c51f124SMoriah Waterland 1555c51f124SMoriah Waterland /* lookup the specified package */ 1565c51f124SMoriah Waterland 1575c51f124SMoriah Waterland /* NOTE: required 'pkgdir' set to spool directory or NULL */ 1585c51f124SMoriah Waterland r = pkginfo(pinf, a_pkgInst, NULL, NULL); 1595c51f124SMoriah Waterland echoDebug(DBG_PKGOPS_PKGINFO_RETURNED, a_pkgInst, r); 1605c51f124SMoriah Waterland 1615c51f124SMoriah Waterland if (r_pinfo != (struct pkginfo **)NULL) { 1625c51f124SMoriah Waterland *r_pinfo = pinf; 1635c51f124SMoriah Waterland } else { 1645c51f124SMoriah Waterland /* free pkginfo structure */ 1655c51f124SMoriah Waterland pkginfoFree(&pinf); 1665c51f124SMoriah Waterland } 1675c51f124SMoriah Waterland 1685c51f124SMoriah Waterland return (r == 0 ? B_TRUE : B_FALSE); 1695c51f124SMoriah Waterland } 1705c51f124SMoriah Waterland 1715c51f124SMoriah Waterland /* 1725c51f124SMoriah Waterland * Name: pkgOpenInGzOnlyFile 1735c51f124SMoriah Waterland * Description: Open the global zone only package list file 1745c51f124SMoriah Waterland * Arguments: a_rootPath - pointer to string representing the root path 1755c51f124SMoriah Waterland * where the global zone only package list file is 1765c51f124SMoriah Waterland * located - NULL is the same as "/" 1775c51f124SMoriah Waterland * Returns: FILE * 1785c51f124SMoriah Waterland * == NULL - failure - file not open 1795c51f124SMoriah Waterland * != NULL - success - file pointer returned 1805c51f124SMoriah Waterland * NOTE: This function will create the file if it does not exist. 1815c51f124SMoriah Waterland */ 1825c51f124SMoriah Waterland 1835c51f124SMoriah Waterland FILE * 1845c51f124SMoriah Waterland pkgOpenInGzOnlyFile(char *a_rootPath) 1855c51f124SMoriah Waterland { 1865c51f124SMoriah Waterland FILE *pkgingzonlyFP; 1875c51f124SMoriah Waterland char pkgingzonlyPath[PATH_MAX]; 1885c51f124SMoriah Waterland int len; 1895c51f124SMoriah Waterland 1905c51f124SMoriah Waterland /* normalize root path */ 1915c51f124SMoriah Waterland 1925c51f124SMoriah Waterland if (a_rootPath == (char *)NULL) { 1935c51f124SMoriah Waterland a_rootPath = ""; 1945c51f124SMoriah Waterland } 1955c51f124SMoriah Waterland 1965c51f124SMoriah Waterland /* generate path to glocal zone only list file */ 1975c51f124SMoriah Waterland 1985c51f124SMoriah Waterland len = snprintf(pkgingzonlyPath, sizeof (pkgingzonlyPath), "%s/%s", 1995c51f124SMoriah Waterland a_rootPath, GLOBALZONE_ONLY_PACKAGE_FILE_PATH); 2005c51f124SMoriah Waterland if (len > sizeof (pkgingzonlyPath)) { 2015c51f124SMoriah Waterland progerr(ERR_CREATE_PATH_2, a_rootPath, 2025c51f124SMoriah Waterland GLOBALZONE_ONLY_PACKAGE_FILE_PATH); 2035c51f124SMoriah Waterland return ((FILE *)NULL); 2045c51f124SMoriah Waterland } 2055c51f124SMoriah Waterland 2065c51f124SMoriah Waterland /* open global zone only list file */ 2075c51f124SMoriah Waterland 2085c51f124SMoriah Waterland pkgingzonlyFP = fopen(pkgingzonlyPath, "r+"); 2095c51f124SMoriah Waterland if ((pkgingzonlyFP == (FILE *)NULL) && (errno == ENOENT)) { 2105c51f124SMoriah Waterland pkgingzonlyFP = fopen(pkgingzonlyPath, "w+"); 2115c51f124SMoriah Waterland } 2125c51f124SMoriah Waterland 2135c51f124SMoriah Waterland if ((pkgingzonlyFP == (FILE *)NULL) && (errno != ENOENT)) { 2145c51f124SMoriah Waterland progerr(ERR_PKGOPS_OPEN_GZONLY, pkgingzonlyPath, 2155c51f124SMoriah Waterland strerror(errno)); 2165c51f124SMoriah Waterland return ((FILE *)NULL); 2175c51f124SMoriah Waterland } 2185c51f124SMoriah Waterland 2195c51f124SMoriah Waterland /* success - return FILE pointer open on global zone only list file */ 2205c51f124SMoriah Waterland 2215c51f124SMoriah Waterland return (pkgingzonlyFP); 2225c51f124SMoriah Waterland } 2235c51f124SMoriah Waterland 2245c51f124SMoriah Waterland /* 2255c51f124SMoriah Waterland * Name: pkgIsPkgInGzOnly 2265c51f124SMoriah Waterland * Description: determine if package is recorded as "in global zone only" 2275c51f124SMoriah Waterland * by opening the appropriate files and searching for the 2285c51f124SMoriah Waterland * specified package 2295c51f124SMoriah Waterland * Arguments: a_rootPath - pointer to string representing the root path 2305c51f124SMoriah Waterland * where the global zone only package list file is 2315c51f124SMoriah Waterland * located - NULL is the same as "/" 2325c51f124SMoriah Waterland * a_pkgInst - pointer to string representing the package instance 2335c51f124SMoriah Waterland * (name) of the package to lookup 2345c51f124SMoriah Waterland * Returns: boolean_t 2355c51f124SMoriah Waterland * B_TRUE - package is recorded as "in global zone only" 2365c51f124SMoriah Waterland * B_FALSE - package is NOT recorded as "in gz only" 2375c51f124SMoriah Waterland * NOTE: This function will create the file if it does not exist. 2385c51f124SMoriah Waterland */ 2395c51f124SMoriah Waterland 2405c51f124SMoriah Waterland boolean_t 2415c51f124SMoriah Waterland pkgIsPkgInGzOnly(char *a_rootPath, char *a_pkgInst) 2425c51f124SMoriah Waterland { 2435c51f124SMoriah Waterland FILE *fp; 2445c51f124SMoriah Waterland boolean_t in_gz_only; 2455c51f124SMoriah Waterland 2465c51f124SMoriah Waterland /* normalize root path */ 2475c51f124SMoriah Waterland 2485c51f124SMoriah Waterland if (a_rootPath == (char *)NULL) { 2495c51f124SMoriah Waterland a_rootPath = ""; 2505c51f124SMoriah Waterland } 2515c51f124SMoriah Waterland 2525c51f124SMoriah Waterland /* open the global zone only package list file */ 2535c51f124SMoriah Waterland 2545c51f124SMoriah Waterland fp = pkgOpenInGzOnlyFile(a_rootPath); 2555c51f124SMoriah Waterland if (fp == (FILE *)NULL) { 2565c51f124SMoriah Waterland echoDebug(ERR_PKGOPS_CANNOT_OPEN_GZONLY, 2575c51f124SMoriah Waterland a_rootPath ? a_rootPath : "/"); 2585c51f124SMoriah Waterland return (B_FALSE); 2595c51f124SMoriah Waterland } 2605c51f124SMoriah Waterland 2615c51f124SMoriah Waterland /* is the package recorded as "in global zone only" ? */ 2625c51f124SMoriah Waterland 2635c51f124SMoriah Waterland in_gz_only = pkgIsPkgInGzOnlyFP(fp, a_pkgInst); 2645c51f124SMoriah Waterland 2655c51f124SMoriah Waterland /* close the global zone only package list file */ 2665c51f124SMoriah Waterland 2675c51f124SMoriah Waterland (void) fclose(fp); 2685c51f124SMoriah Waterland 2695c51f124SMoriah Waterland /* return results */ 2705c51f124SMoriah Waterland 2715c51f124SMoriah Waterland return (in_gz_only); 2725c51f124SMoriah Waterland } 2735c51f124SMoriah Waterland 2745c51f124SMoriah Waterland /* 2755c51f124SMoriah Waterland * Name: pkgIsPkgInGzOnly 2765c51f124SMoriah Waterland * Description: determine if package is recorded as "in global zone only" 2775c51f124SMoriah Waterland * by searching the specified open FILE for the specified package 2785c51f124SMoriah Waterland * Arguments: a_fp - pointer to FILE handle open on file to search 2795c51f124SMoriah Waterland * a_pkgInst - pointer to string representing the package instance 2805c51f124SMoriah Waterland * (name) of the package to lookup 2815c51f124SMoriah Waterland * Returns: boolean_t 2825c51f124SMoriah Waterland * B_TRUE - package is recorded as "in global zone only" 2835c51f124SMoriah Waterland * B_FALSE - package is NOT recorded as "in gz only" 2845c51f124SMoriah Waterland */ 2855c51f124SMoriah Waterland 2865c51f124SMoriah Waterland boolean_t 2875c51f124SMoriah Waterland pkgIsPkgInGzOnlyFP(FILE *a_fp, char *a_pkgInst) 2885c51f124SMoriah Waterland { 2895c51f124SMoriah Waterland char line[PATH_MAX+1]; 2905c51f124SMoriah Waterland 2915c51f124SMoriah Waterland /* entry assertions */ 2925c51f124SMoriah Waterland 2935c51f124SMoriah Waterland assert(a_fp != (FILE *)NULL); 2945c51f124SMoriah Waterland assert(a_pkgInst != (char *)NULL); 2955c51f124SMoriah Waterland assert(*a_pkgInst != '\0'); 2965c51f124SMoriah Waterland 2975c51f124SMoriah Waterland /* rewind the file to the beginning */ 2985c51f124SMoriah Waterland 2995c51f124SMoriah Waterland rewind(a_fp); 3005c51f124SMoriah Waterland 3015c51f124SMoriah Waterland /* read the file line by line searching for the specified package */ 3025c51f124SMoriah Waterland 3035c51f124SMoriah Waterland while (fgets(line, sizeof (line), a_fp) != (char *)NULL) { 3045c51f124SMoriah Waterland int len; 3055c51f124SMoriah Waterland 3065c51f124SMoriah Waterland /* strip off trailing newlines */ 3075c51f124SMoriah Waterland len = strlen(line); 3085c51f124SMoriah Waterland while ((len > 0) && (line[len-1] == '\n')) { 3095c51f124SMoriah Waterland line[--len] = '\0'; 3105c51f124SMoriah Waterland } 3115c51f124SMoriah Waterland 3125c51f124SMoriah Waterland /* ignore blank and comment lines */ 3135c51f124SMoriah Waterland if ((line[0] == '#') || (line[0] == '\0')) { 3145c51f124SMoriah Waterland continue; 3155c51f124SMoriah Waterland } 3165c51f124SMoriah Waterland 3175c51f124SMoriah Waterland /* return true if this is the package we are looking for */ 3185c51f124SMoriah Waterland if (strcmp(a_pkgInst, line) == 0) { 3195c51f124SMoriah Waterland echoDebug(DBG_PKGOPS_PKG_IS_GZONLY, a_pkgInst); 3205c51f124SMoriah Waterland return (B_TRUE); 3215c51f124SMoriah Waterland } 3225c51f124SMoriah Waterland } 3235c51f124SMoriah Waterland 3245c51f124SMoriah Waterland /* end of file - package not found */ 3255c51f124SMoriah Waterland 3265c51f124SMoriah Waterland echoDebug(DBG_PKGOPS_PKG_NOT_GZONLY, a_pkgInst); 3275c51f124SMoriah Waterland 3285c51f124SMoriah Waterland return (B_FALSE); 3295c51f124SMoriah Waterland } 3305c51f124SMoriah Waterland 3315c51f124SMoriah Waterland /* 3325c51f124SMoriah Waterland * Name: pkgRemovePackageFromGzonlyList 3335c51f124SMoriah Waterland * Description: Remove specified package from the global zone only package list 3345c51f124SMoriah Waterland * file located at a specified root path 3355c51f124SMoriah Waterland * Arguments: a_rootPath - pointer to string representing the root path 3365c51f124SMoriah Waterland * where the global zone only package list file is 3375c51f124SMoriah Waterland * located - NULL is the same as "/" 3385c51f124SMoriah Waterland * a_pkgInst - pointer to string representing the package instance 3395c51f124SMoriah Waterland * (name) of the package to remove 3405c51f124SMoriah Waterland * Returns: boolean_t 3415c51f124SMoriah Waterland * B_TRUE - package is successfully removed 3425c51f124SMoriah Waterland * B_FALSE - failed to remove package from file 3435c51f124SMoriah Waterland * NOTE: This function will create the file if it does not exist. 3445c51f124SMoriah Waterland */ 3455c51f124SMoriah Waterland 3465c51f124SMoriah Waterland boolean_t 3475c51f124SMoriah Waterland pkgRemovePackageFromGzonlyList(char *a_rootPath, char *a_pkgInst) 3485c51f124SMoriah Waterland { 3495c51f124SMoriah Waterland FILE *destFP; 3505c51f124SMoriah Waterland FILE *srcFP; 3515c51f124SMoriah Waterland boolean_t pkgremoved = B_FALSE; 3525c51f124SMoriah Waterland char destPath[PATH_MAX]; 3535c51f124SMoriah Waterland char line[PATH_MAX+1]; 3545c51f124SMoriah Waterland char savePath[PATH_MAX]; 3555c51f124SMoriah Waterland char srcPath[PATH_MAX]; 3565c51f124SMoriah Waterland char timeb[BUFSIZ]; 3575c51f124SMoriah Waterland int len; 3585c51f124SMoriah Waterland struct tm *timep; 3595c51f124SMoriah Waterland time_t clock; 3605c51f124SMoriah Waterland 3615c51f124SMoriah Waterland /* entry assertions */ 3625c51f124SMoriah Waterland 3635c51f124SMoriah Waterland assert(a_pkgInst != (char *)NULL); 3645c51f124SMoriah Waterland assert(*a_pkgInst != '\0'); 3655c51f124SMoriah Waterland 3665c51f124SMoriah Waterland /* normalize root path */ 3675c51f124SMoriah Waterland 3685c51f124SMoriah Waterland if (a_rootPath == (char *)NULL) { 3695c51f124SMoriah Waterland a_rootPath = ""; 3705c51f124SMoriah Waterland } 3715c51f124SMoriah Waterland 3725c51f124SMoriah Waterland /* 3735c51f124SMoriah Waterland * calculate paths to various objects 3745c51f124SMoriah Waterland */ 3755c51f124SMoriah Waterland 3765c51f124SMoriah Waterland /* path to current "source" ingzonly file */ 3775c51f124SMoriah Waterland 3785c51f124SMoriah Waterland len = snprintf(srcPath, sizeof (srcPath), "%s/%s", 3795c51f124SMoriah Waterland a_rootPath, GLOBALZONE_ONLY_PACKAGE_FILE_PATH); 3805c51f124SMoriah Waterland if (len > sizeof (srcPath)) { 3815c51f124SMoriah Waterland progerr(ERR_CREATE_PATH_2, a_rootPath, 3825c51f124SMoriah Waterland GLOBALZONE_ONLY_PACKAGE_FILE_PATH); 3835c51f124SMoriah Waterland return (B_FALSE); 3845c51f124SMoriah Waterland } 3855c51f124SMoriah Waterland 3865c51f124SMoriah Waterland /* path to new "destination" ingzonly file */ 3875c51f124SMoriah Waterland 3885c51f124SMoriah Waterland len = snprintf(destPath, sizeof (destPath), "%s/%s.tmp", 3895c51f124SMoriah Waterland a_rootPath, GLOBALZONE_ONLY_PACKAGE_FILE_PATH); 3905c51f124SMoriah Waterland if (len > sizeof (srcPath)) { 3915c51f124SMoriah Waterland progerr(ERR_CREATE_PATH_2, a_rootPath, 3925c51f124SMoriah Waterland GLOBALZONE_ONLY_PACKAGE_FILE_PATH); 3935c51f124SMoriah Waterland return (B_FALSE); 3945c51f124SMoriah Waterland } 3955c51f124SMoriah Waterland 3965c51f124SMoriah Waterland /* path to temporary "saved" ingzonly file */ 3975c51f124SMoriah Waterland 3985c51f124SMoriah Waterland len = snprintf(savePath, sizeof (savePath), "%s/%s.save", 3995c51f124SMoriah Waterland a_rootPath, GLOBALZONE_ONLY_PACKAGE_FILE_PATH); 4005c51f124SMoriah Waterland if (len > sizeof (srcPath)) { 4015c51f124SMoriah Waterland progerr(ERR_CREATE_PATH_2, a_rootPath, 4025c51f124SMoriah Waterland GLOBALZONE_ONLY_PACKAGE_FILE_PATH); 4035c51f124SMoriah Waterland return (B_FALSE); 4045c51f124SMoriah Waterland } 4055c51f124SMoriah Waterland 4065c51f124SMoriah Waterland /* open source file, creating if necessary */ 4075c51f124SMoriah Waterland 4085c51f124SMoriah Waterland srcFP = fopen(srcPath, "r+"); 4095c51f124SMoriah Waterland if ((srcFP == (FILE *)NULL) && (errno == ENOENT)) { 4105c51f124SMoriah Waterland srcFP = fopen(srcPath, "w+"); 4115c51f124SMoriah Waterland } 4125c51f124SMoriah Waterland 4135c51f124SMoriah Waterland /* error if could not open/create file */ 4145c51f124SMoriah Waterland 4155c51f124SMoriah Waterland if (srcFP == (FILE *)NULL) { 4165c51f124SMoriah Waterland progerr(ERR_PKGOPS_OPEN_GZONLY, srcPath, strerror(errno)); 4175c51f124SMoriah Waterland return (B_FALSE); 4185c51f124SMoriah Waterland } 4195c51f124SMoriah Waterland 4205c51f124SMoriah Waterland /* open/create new destination file */ 4215c51f124SMoriah Waterland 4225c51f124SMoriah Waterland (void) remove(destPath); 4235c51f124SMoriah Waterland destFP = fopen(destPath, "w"); 4245c51f124SMoriah Waterland if (destFP == (FILE *)NULL) { 4255c51f124SMoriah Waterland progerr(ERR_PKGOPS_TMPOPEN, destPath, strerror(errno)); 4265c51f124SMoriah Waterland if (srcFP != (FILE *)NULL) { 4275c51f124SMoriah Waterland (void) fclose(srcFP); 4285c51f124SMoriah Waterland } 4295c51f124SMoriah Waterland return (B_FALSE); 4305c51f124SMoriah Waterland } 4315c51f124SMoriah Waterland 4325c51f124SMoriah Waterland /* add standard comment to beginning of file */ 4335c51f124SMoriah Waterland 4345c51f124SMoriah Waterland (void) time(&clock); 4355c51f124SMoriah Waterland timep = localtime(&clock); 4365c51f124SMoriah Waterland 4375c51f124SMoriah Waterland (void) strftime(timeb, sizeof (timeb), "%c\n", timep); 4385c51f124SMoriah Waterland 4395c51f124SMoriah Waterland /* put standard header at the beginning of the file */ 4405c51f124SMoriah Waterland 4415c51f124SMoriah Waterland (void) fprintf(destFP, MSG_GZONLY_FILE_HEADER, 4425c51f124SMoriah Waterland get_prog_name(), "remove", a_pkgInst, timeb); 4435c51f124SMoriah Waterland 4445c51f124SMoriah Waterland /* read source/write destination - removing specified package */ 4455c51f124SMoriah Waterland 4465c51f124SMoriah Waterland while (fgets(line, sizeof (line), srcFP) != (char *)NULL) { 4475c51f124SMoriah Waterland int len; 4485c51f124SMoriah Waterland 4495c51f124SMoriah Waterland /* strip off trailing newlines */ 4505c51f124SMoriah Waterland len = strlen(line); 4515c51f124SMoriah Waterland while ((len > 0) && (line[len-1] == '\n')) { 4525c51f124SMoriah Waterland line[--len] = '\0'; 4535c51f124SMoriah Waterland } 4545c51f124SMoriah Waterland 4555c51f124SMoriah Waterland /* ignore blank and comment lines */ 4565c51f124SMoriah Waterland if ((line[0] == '#') || (line[0] == '\0')) { 4575c51f124SMoriah Waterland continue; 4585c51f124SMoriah Waterland } 4595c51f124SMoriah Waterland 4605c51f124SMoriah Waterland /* add pkg if yet to add and pkg <= line */ 4615c51f124SMoriah Waterland if ((pkgremoved == B_FALSE) && (strcmp(a_pkgInst, line) == 0)) { 4625c51f124SMoriah Waterland pkgremoved = B_TRUE; 4635c51f124SMoriah Waterland } else { 4645c51f124SMoriah Waterland (void) fprintf(destFP, "%s\n", line); 4655c51f124SMoriah Waterland } 4665c51f124SMoriah Waterland } 4675c51f124SMoriah Waterland 4685c51f124SMoriah Waterland /* close both files */ 4695c51f124SMoriah Waterland 4705c51f124SMoriah Waterland (void) fclose(srcFP); 4715c51f124SMoriah Waterland 4725c51f124SMoriah Waterland (void) fclose(destFP); 4735c51f124SMoriah Waterland 4745c51f124SMoriah Waterland /* 4755c51f124SMoriah Waterland * if package not found there is no need to update the original file 4765c51f124SMoriah Waterland */ 4775c51f124SMoriah Waterland 4785c51f124SMoriah Waterland if (pkgremoved == B_FALSE) { 4795c51f124SMoriah Waterland (void) unlink(destPath); 4805c51f124SMoriah Waterland return (B_TRUE); 4815c51f124SMoriah Waterland } 4825c51f124SMoriah Waterland 4835c51f124SMoriah Waterland /* 4845c51f124SMoriah Waterland * Now we want to make a copy of the old gzonly file as a 4855c51f124SMoriah Waterland * fail-safe. 4865c51f124SMoriah Waterland */ 4875c51f124SMoriah Waterland 4885c51f124SMoriah Waterland if ((access(savePath, F_OK) == 0) && remove(savePath)) { 4895c51f124SMoriah Waterland progerr(ERR_REMOVE, savePath, strerror(errno)); 4905c51f124SMoriah Waterland (void) remove(destPath); 4915c51f124SMoriah Waterland return (B_FALSE); 4925c51f124SMoriah Waterland } 4935c51f124SMoriah Waterland 4945c51f124SMoriah Waterland if (link(srcPath, savePath) != 0) { 4955c51f124SMoriah Waterland progerr(ERR_LINK, savePath, srcPath, strerror(errno)); 4965c51f124SMoriah Waterland (void) remove(destPath); 4975c51f124SMoriah Waterland return (B_FALSE); 4985c51f124SMoriah Waterland } 4995c51f124SMoriah Waterland 5005c51f124SMoriah Waterland if (rename(destPath, srcPath) != 0) { 5015c51f124SMoriah Waterland progerr(ERR_RENAME, destPath, srcPath, strerror(errno)); 5025c51f124SMoriah Waterland if (rename(savePath, srcPath)) { 5035c51f124SMoriah Waterland progerr(ERR_RENAME, savePath, srcPath, strerror(errno)); 5045c51f124SMoriah Waterland } 5055c51f124SMoriah Waterland (void) remove(destPath); 5065c51f124SMoriah Waterland return (B_FALSE); 5075c51f124SMoriah Waterland } 5085c51f124SMoriah Waterland 5095c51f124SMoriah Waterland if (remove(savePath) != 0) { 5105c51f124SMoriah Waterland progerr(ERR_REMOVE, savePath, strerror(errno)); 5115c51f124SMoriah Waterland } 5125c51f124SMoriah Waterland 5135c51f124SMoriah Waterland /* successfully removed package */ 5145c51f124SMoriah Waterland 5155c51f124SMoriah Waterland echoDebug(DBG_PKGOPS_REMOVED_GZPKG, a_pkgInst); 5165c51f124SMoriah Waterland 5175c51f124SMoriah Waterland return (B_TRUE); 5185c51f124SMoriah Waterland } 5195c51f124SMoriah Waterland 5205c51f124SMoriah Waterland /* 5215c51f124SMoriah Waterland * Name: pkgAddPackageFromGzonlyList 5225c51f124SMoriah Waterland * Description: Add specified package to the global zone only package list 5235c51f124SMoriah Waterland * file located at a specified root path 5245c51f124SMoriah Waterland * Arguments: a_rootPath - pointer to string representing the root path 5255c51f124SMoriah Waterland * where the global zone only package list file is 5265c51f124SMoriah Waterland * located - NULL is the same as "/" 5275c51f124SMoriah Waterland * a_pkgInst - pointer to string representing the package instance 5285c51f124SMoriah Waterland * (name) of the package to add 5295c51f124SMoriah Waterland * Returns: boolean_t 5305c51f124SMoriah Waterland * B_TRUE - package is successfully added 5315c51f124SMoriah Waterland * B_FALSE - failed to add package to the file 5325c51f124SMoriah Waterland * NOTE: This function will create the file if it does not exist. 5335c51f124SMoriah Waterland */ 5345c51f124SMoriah Waterland 5355c51f124SMoriah Waterland boolean_t 5365c51f124SMoriah Waterland pkgAddPackageToGzonlyList(char *a_pkgInst, char *a_rootPath) 5375c51f124SMoriah Waterland { 5385c51f124SMoriah Waterland FILE *destFP; 5395c51f124SMoriah Waterland FILE *srcFP; 5405c51f124SMoriah Waterland boolean_t pkgadded = B_FALSE; 5415c51f124SMoriah Waterland char destPath[PATH_MAX]; 5425c51f124SMoriah Waterland char line[PATH_MAX+1]; 5435c51f124SMoriah Waterland char savePath[PATH_MAX]; 5445c51f124SMoriah Waterland char srcPath[PATH_MAX]; 5455c51f124SMoriah Waterland char timeb[BUFSIZ]; 5465c51f124SMoriah Waterland int len; 5475c51f124SMoriah Waterland struct tm *timep; 5485c51f124SMoriah Waterland time_t clock; 5495c51f124SMoriah Waterland 5505c51f124SMoriah Waterland /* entry assertions */ 5515c51f124SMoriah Waterland 5525c51f124SMoriah Waterland assert(a_pkgInst != (char *)NULL); 5535c51f124SMoriah Waterland assert(*a_pkgInst != '\0'); 5545c51f124SMoriah Waterland 5555c51f124SMoriah Waterland /* normalize root path */ 5565c51f124SMoriah Waterland 5575c51f124SMoriah Waterland if (a_rootPath == (char *)NULL) { 5585c51f124SMoriah Waterland a_rootPath = ""; 5595c51f124SMoriah Waterland } 5605c51f124SMoriah Waterland 5615c51f124SMoriah Waterland /* entry debugging info */ 5625c51f124SMoriah Waterland 5635c51f124SMoriah Waterland echoDebug(DBG_PKGOPS_ADDGZPKG, a_pkgInst, a_rootPath); 5645c51f124SMoriah Waterland 5655c51f124SMoriah Waterland /* 5665c51f124SMoriah Waterland * calculate paths to various objects 5675c51f124SMoriah Waterland */ 5685c51f124SMoriah Waterland 5695c51f124SMoriah Waterland /* path to current "source" ingzonly file */ 5705c51f124SMoriah Waterland 5715c51f124SMoriah Waterland len = snprintf(srcPath, sizeof (srcPath), "%s/%s", 5725c51f124SMoriah Waterland a_rootPath, GLOBALZONE_ONLY_PACKAGE_FILE_PATH); 5735c51f124SMoriah Waterland if (len > sizeof (srcPath)) { 5745c51f124SMoriah Waterland progerr(ERR_CREATE_PATH_2, a_rootPath, 5755c51f124SMoriah Waterland GLOBALZONE_ONLY_PACKAGE_FILE_PATH); 5765c51f124SMoriah Waterland return (B_FALSE); 5775c51f124SMoriah Waterland } 5785c51f124SMoriah Waterland 5795c51f124SMoriah Waterland /* path to new "destination" ingzonly file */ 5805c51f124SMoriah Waterland 5815c51f124SMoriah Waterland len = snprintf(destPath, sizeof (destPath), "%s/%s.tmp", 5825c51f124SMoriah Waterland a_rootPath, GLOBALZONE_ONLY_PACKAGE_FILE_PATH); 5835c51f124SMoriah Waterland if (len > sizeof (srcPath)) { 5845c51f124SMoriah Waterland progerr(ERR_CREATE_PATH_2, a_rootPath, 5855c51f124SMoriah Waterland GLOBALZONE_ONLY_PACKAGE_FILE_PATH); 5865c51f124SMoriah Waterland return (B_FALSE); 5875c51f124SMoriah Waterland } 5885c51f124SMoriah Waterland 5895c51f124SMoriah Waterland /* path to temporary "saved" ingzonly file */ 5905c51f124SMoriah Waterland 5915c51f124SMoriah Waterland len = snprintf(savePath, sizeof (savePath), "%s/%s.save", 5925c51f124SMoriah Waterland a_rootPath, GLOBALZONE_ONLY_PACKAGE_FILE_PATH); 5935c51f124SMoriah Waterland if (len > sizeof (srcPath)) { 5945c51f124SMoriah Waterland progerr(ERR_CREATE_PATH_2, a_rootPath, 5955c51f124SMoriah Waterland GLOBALZONE_ONLY_PACKAGE_FILE_PATH); 5965c51f124SMoriah Waterland return (B_FALSE); 5975c51f124SMoriah Waterland } 5985c51f124SMoriah Waterland 5995c51f124SMoriah Waterland /* open source file, creating if necessary */ 6005c51f124SMoriah Waterland 6015c51f124SMoriah Waterland srcFP = fopen(srcPath, "r+"); 6025c51f124SMoriah Waterland if ((srcFP == (FILE *)NULL) && (errno == ENOENT)) { 6035c51f124SMoriah Waterland srcFP = fopen(srcPath, "w+"); 6045c51f124SMoriah Waterland } 6055c51f124SMoriah Waterland 6065c51f124SMoriah Waterland /* error if could not open/create file */ 6075c51f124SMoriah Waterland 6085c51f124SMoriah Waterland if (srcFP == (FILE *)NULL) { 6095c51f124SMoriah Waterland progerr(ERR_PKGOPS_OPEN_GZONLY, srcPath, strerror(errno)); 6105c51f124SMoriah Waterland return (B_FALSE); 6115c51f124SMoriah Waterland } 6125c51f124SMoriah Waterland 6135c51f124SMoriah Waterland /* open/create new destination file */ 6145c51f124SMoriah Waterland 6155c51f124SMoriah Waterland (void) remove(destPath); 6165c51f124SMoriah Waterland destFP = fopen(destPath, "w"); 6175c51f124SMoriah Waterland if (destFP == (FILE *)NULL) { 6185c51f124SMoriah Waterland progerr(ERR_PKGOPS_TMPOPEN, destPath, strerror(errno)); 6195c51f124SMoriah Waterland if (srcFP != (FILE *)NULL) { 6205c51f124SMoriah Waterland (void) fclose(srcFP); 6215c51f124SMoriah Waterland } 6225c51f124SMoriah Waterland return (B_FALSE); 6235c51f124SMoriah Waterland } 6245c51f124SMoriah Waterland 6255c51f124SMoriah Waterland /* add standard comment to beginning of file */ 6265c51f124SMoriah Waterland 6275c51f124SMoriah Waterland (void) time(&clock); 6285c51f124SMoriah Waterland timep = localtime(&clock); 6295c51f124SMoriah Waterland 6305c51f124SMoriah Waterland (void) strftime(timeb, sizeof (timeb), "%c\n", timep); 6315c51f124SMoriah Waterland 6325c51f124SMoriah Waterland /* put standard header at the beginning of the file */ 6335c51f124SMoriah Waterland 6345c51f124SMoriah Waterland (void) fprintf(destFP, MSG_GZONLY_FILE_HEADER, 6355c51f124SMoriah Waterland get_prog_name(), "add", a_pkgInst, timeb); 6365c51f124SMoriah Waterland 6375c51f124SMoriah Waterland /* read source/write destination; add package at appropriate location */ 6385c51f124SMoriah Waterland 6395c51f124SMoriah Waterland while (fgets(line, sizeof (line), srcFP) != (char *)NULL) { 6405c51f124SMoriah Waterland int len; 6415c51f124SMoriah Waterland 6425c51f124SMoriah Waterland /* strip off trailing newlines */ 6435c51f124SMoriah Waterland len = strlen(line); 6445c51f124SMoriah Waterland while ((len > 0) && (line[len-1] == '\n')) { 6455c51f124SMoriah Waterland line[--len] = '\0'; 6465c51f124SMoriah Waterland } 6475c51f124SMoriah Waterland 6485c51f124SMoriah Waterland /* ignore blank and comment lines */ 6495c51f124SMoriah Waterland if ((line[0] == '#') || (line[0] == '\0')) { 6505c51f124SMoriah Waterland continue; 6515c51f124SMoriah Waterland } 6525c51f124SMoriah Waterland 6535c51f124SMoriah Waterland /* add pkg if yet to add and pkg <= line */ 6545c51f124SMoriah Waterland if ((pkgadded == B_FALSE) && (strcmp(a_pkgInst, line) <= 0)) { 6555c51f124SMoriah Waterland if (strcmp(a_pkgInst, line) != 0) { 6565c51f124SMoriah Waterland (void) fprintf(destFP, "%s\n", a_pkgInst); 6575c51f124SMoriah Waterland } 6585c51f124SMoriah Waterland pkgadded = B_TRUE; 6595c51f124SMoriah Waterland } 6605c51f124SMoriah Waterland 6615c51f124SMoriah Waterland (void) fprintf(destFP, "%s\n", line); 6625c51f124SMoriah Waterland } 6635c51f124SMoriah Waterland 6645c51f124SMoriah Waterland /* if package not added yet, add to end of the file */ 6655c51f124SMoriah Waterland 6665c51f124SMoriah Waterland if (pkgadded == B_FALSE) { 6675c51f124SMoriah Waterland (void) fprintf(destFP, "%s\n", a_pkgInst); 6685c51f124SMoriah Waterland } 6695c51f124SMoriah Waterland 6705c51f124SMoriah Waterland /* close both files */ 6715c51f124SMoriah Waterland 6725c51f124SMoriah Waterland (void) fclose(srcFP); 6735c51f124SMoriah Waterland 6745c51f124SMoriah Waterland (void) fclose(destFP); 6755c51f124SMoriah Waterland 6765c51f124SMoriah Waterland /* 6775c51f124SMoriah Waterland * Now we want to make a copy of the old gzonly file as a 6785c51f124SMoriah Waterland * fail-safe. 6795c51f124SMoriah Waterland */ 6805c51f124SMoriah Waterland 6815c51f124SMoriah Waterland if ((access(savePath, F_OK) == 0) && remove(savePath)) { 6825c51f124SMoriah Waterland progerr(ERR_REMOVE, savePath, strerror(errno)); 6835c51f124SMoriah Waterland (void) remove(destPath); 6845c51f124SMoriah Waterland return (B_FALSE); 6855c51f124SMoriah Waterland } 6865c51f124SMoriah Waterland 6875c51f124SMoriah Waterland if (link(srcPath, savePath) != 0) { 6885c51f124SMoriah Waterland progerr(ERR_LINK, savePath, srcPath, strerror(errno)); 6895c51f124SMoriah Waterland (void) remove(destPath); 6905c51f124SMoriah Waterland return (B_FALSE); 6915c51f124SMoriah Waterland } 6925c51f124SMoriah Waterland 6935c51f124SMoriah Waterland if (rename(destPath, srcPath) != 0) { 6945c51f124SMoriah Waterland progerr(ERR_RENAME, destPath, srcPath, strerror(errno)); 6955c51f124SMoriah Waterland if (rename(savePath, srcPath)) { 6965c51f124SMoriah Waterland progerr(ERR_RENAME, savePath, srcPath, strerror(errno)); 6975c51f124SMoriah Waterland } 6985c51f124SMoriah Waterland (void) remove(destPath); 6995c51f124SMoriah Waterland return (B_FALSE); 7005c51f124SMoriah Waterland } 7015c51f124SMoriah Waterland 7025c51f124SMoriah Waterland if (remove(savePath) != 0) { 7035c51f124SMoriah Waterland progerr(ERR_REMOVE, savePath, strerror(errno)); 7045c51f124SMoriah Waterland } 7055c51f124SMoriah Waterland 7065c51f124SMoriah Waterland /* successfully added package */ 7075c51f124SMoriah Waterland 7085c51f124SMoriah Waterland echoDebug(DBG_PKGOPS_ADDED_GZPKG, a_pkgInst); 7095c51f124SMoriah Waterland 7105c51f124SMoriah Waterland return (B_TRUE); 7115c51f124SMoriah Waterland } 7125c51f124SMoriah Waterland 7135c51f124SMoriah Waterland /* 7145c51f124SMoriah Waterland * Name: pkginfoParamTruth 7155c51f124SMoriah Waterland * Description: Search pkginfo file for specified parameter/value pair 7165c51f124SMoriah Waterland * Arguments: a_fp - Pointer to FILE handle open on pkginfo file to search 7175c51f124SMoriah Waterland * a_param - Pointer to string representing the parameter name 7185c51f124SMoriah Waterland * to search for 7195c51f124SMoriah Waterland * a_value - Pointer to string representing the "success" value 7205c51f124SMoriah Waterland * being searched for 7215c51f124SMoriah Waterland * a_default - determine results if parameter NOT found 7225c51f124SMoriah Waterland * B_TRUE - parameter is TRUE if not found 7235c51f124SMoriah Waterland * B_FALSE - parameter is FALSE if not found 7245c51f124SMoriah Waterland * Returns: boolean_t 7255c51f124SMoriah Waterland * B_TRUE - the parameter was found and matched the specified value 7265c51f124SMoriah Waterland * OR the paramter was not found and a_default == B_TRUE 7275c51f124SMoriah Waterland * B_FALSE - the parameter was found and did NOT match the value 7285c51f124SMoriah Waterland * OR the paramter was not found and a_default == B_FALSE 7295c51f124SMoriah Waterland */ 7305c51f124SMoriah Waterland 7315c51f124SMoriah Waterland boolean_t 7325c51f124SMoriah Waterland pkginfoParamTruth(FILE *a_fp, char *a_param, char *a_value, boolean_t a_default) 7335c51f124SMoriah Waterland { 7345c51f124SMoriah Waterland char *param; 7355c51f124SMoriah Waterland boolean_t result; 7365c51f124SMoriah Waterland 7375c51f124SMoriah Waterland /* entry assertions */ 7385c51f124SMoriah Waterland 7395c51f124SMoriah Waterland assert(a_fp != (FILE *)NULL); 7405c51f124SMoriah Waterland assert(a_param != (char *)NULL); 7415c51f124SMoriah Waterland assert(*a_param != '\0'); 7425c51f124SMoriah Waterland assert(a_value != (char *)NULL); 7435c51f124SMoriah Waterland assert(*a_value != '\0'); 7445c51f124SMoriah Waterland 7455c51f124SMoriah Waterland /* rewind the file to the beginning */ 7465c51f124SMoriah Waterland 7475c51f124SMoriah Waterland rewind(a_fp); 7485c51f124SMoriah Waterland 7495c51f124SMoriah Waterland /* search pkginfo file for the specified parameter */ 7505c51f124SMoriah Waterland 7515c51f124SMoriah Waterland param = fpkgparam(a_fp, a_param); 7525c51f124SMoriah Waterland 7535c51f124SMoriah Waterland if (param == (char *)NULL) { 7545c51f124SMoriah Waterland /* parameter not found - return default */ 7555c51f124SMoriah Waterland result = a_default; 7565c51f124SMoriah Waterland } else if (*param == '\0') { 7575c51f124SMoriah Waterland /* parameter found but no value - return default */ 7585c51f124SMoriah Waterland result = a_default; 7595c51f124SMoriah Waterland } else if (strcasecmp(param, a_value) == 0) { 7605c51f124SMoriah Waterland /* paramter found - matches value */ 7615c51f124SMoriah Waterland result = B_TRUE; 7625c51f124SMoriah Waterland } else { 7635c51f124SMoriah Waterland /* parameter found - does not match value */ 7645c51f124SMoriah Waterland result = B_FALSE; 7655c51f124SMoriah Waterland } 7665c51f124SMoriah Waterland 7675c51f124SMoriah Waterland /* exit debugging info */ 7685c51f124SMoriah Waterland 7695c51f124SMoriah Waterland echoDebug(DBG_PKGOPS_PARAMTRUTH_RESULTS, 7705c51f124SMoriah Waterland a_param, a_value, a_default == B_TRUE ? "true" : "false", 7715c51f124SMoriah Waterland param ? param : "?", result == B_TRUE ? "true" : "false"); 7725c51f124SMoriah Waterland 7735c51f124SMoriah Waterland /* if parameter value found, free results */ 7745c51f124SMoriah Waterland 7755c51f124SMoriah Waterland if (param != (char *)NULL) { 7765c51f124SMoriah Waterland (void) free(param); 7775c51f124SMoriah Waterland } 7785c51f124SMoriah Waterland 7795c51f124SMoriah Waterland /* return results of search */ 7805c51f124SMoriah Waterland 7815c51f124SMoriah Waterland return (result); 7825c51f124SMoriah Waterland } 7835c51f124SMoriah Waterland 7845c51f124SMoriah Waterland /* 7855c51f124SMoriah Waterland * Name: pkgGetPackageList 7865c51f124SMoriah Waterland * Description: Determine list of packages based on list of packages that are 7875c51f124SMoriah Waterland * available, category of packages to select, and list of packages 7885c51f124SMoriah Waterland * to select. 7895c51f124SMoriah Waterland * Arguments: r_pkgList - pointer to pointer to string array where the list 7905c51f124SMoriah Waterland * of selected packages will be returned 7915c51f124SMoriah Waterland * a_argv - pointer to string array containing list of packages 7925c51f124SMoriah Waterland * to select 7935c51f124SMoriah Waterland * a_optind - index into string array of first package to select 7945c51f124SMoriah Waterland * a_categories - pointer to string representing the categories of 7955c51f124SMoriah Waterland * packages to select 7965c51f124SMoriah Waterland * a_categoryList - pointer to string array representing a list 7975c51f124SMoriah Waterland * of categories to select 7985c51f124SMoriah Waterland * a_pkgdev - package dev containing packages that can be selected 7995c51f124SMoriah Waterland * Returns: int 8005c51f124SMoriah Waterland * == 0 - packages found r_pkgList contains results package list retrieved 8015c51f124SMoriah Waterland * == -1 - no packages found (errno == ENOPKG) 8025c51f124SMoriah Waterland * != 0 - "quit" value entered by user 8035c51f124SMoriah Waterland * NOTE: If both a category and a list of packages to select are provided 8045c51f124SMoriah Waterland * the category is used over the list of packages provided 8055c51f124SMoriah Waterland * NOTE: If neither a category nor a list of packages to select are 8065c51f124SMoriah Waterland * provided, an error is returned 8075c51f124SMoriah Waterland */ 8085c51f124SMoriah Waterland 8095c51f124SMoriah Waterland int 8105c51f124SMoriah Waterland pkgGetPackageList(char ***r_pkgList, char **a_argv, int a_optind, 8115c51f124SMoriah Waterland char *a_categories, char **a_categoryList, struct pkgdev *a_pkgdev) 8125c51f124SMoriah Waterland { 8135c51f124SMoriah Waterland char *all_pkgs[4] = {"all", NULL}; 8145c51f124SMoriah Waterland 8155c51f124SMoriah Waterland /* entry assertions */ 8165c51f124SMoriah Waterland 8175c51f124SMoriah Waterland assert(a_pkgdev != (struct pkgdev *)NULL); 8185c51f124SMoriah Waterland assert(a_pkgdev->dirname != (char *)NULL); 8195c51f124SMoriah Waterland assert(*a_pkgdev->dirname != '\0'); 8205c51f124SMoriah Waterland assert(r_pkgList != (char ***)NULL); 8215c51f124SMoriah Waterland assert(a_argv != (char **)NULL); 8225c51f124SMoriah Waterland 8235c51f124SMoriah Waterland /* entry debugging info */ 8245c51f124SMoriah Waterland 8255c51f124SMoriah Waterland echoDebug(DBG_PKGOPS_GETPKGLIST_ENTRY); 8265c51f124SMoriah Waterland echoDebug(DBG_PKGOPS_GETPKGLIST_ARGS, a_pkgdev->dirname, 8275c51f124SMoriah Waterland a_categories ? a_categories : "?"); 8285c51f124SMoriah Waterland 8295c51f124SMoriah Waterland /* reset returned package list handle */ 8305c51f124SMoriah Waterland 8315c51f124SMoriah Waterland *r_pkgList = (char **)NULL; 8325c51f124SMoriah Waterland 8335c51f124SMoriah Waterland /* 8345c51f124SMoriah Waterland * generate list of packages to be removed: if removing by category, 8355c51f124SMoriah Waterland * then generate package list based on all packages by category, 8365c51f124SMoriah Waterland * else generate package list based on all packages specified. 8375c51f124SMoriah Waterland */ 8385c51f124SMoriah Waterland 8395c51f124SMoriah Waterland if (a_categories != NULL) { 8405c51f124SMoriah Waterland /* generate package list from all packages in given category */ 8415c51f124SMoriah Waterland 8425c51f124SMoriah Waterland *r_pkgList = gpkglist(a_pkgdev->dirname, &all_pkgs[0], 8435c51f124SMoriah Waterland a_categoryList); 8445c51f124SMoriah Waterland 8455c51f124SMoriah Waterland if (*r_pkgList == NULL) { 8465c51f124SMoriah Waterland echoDebug(DBG_PKGOPS_GPKGLIST_CATFAILED, a_categories); 8475c51f124SMoriah Waterland progerr(ERR_CAT_FND, a_categories); 8485c51f124SMoriah Waterland return (1); 8495c51f124SMoriah Waterland } 8505c51f124SMoriah Waterland 8515c51f124SMoriah Waterland echoDebug(DBG_PKGOPS_GPKGLIST_CATOK, a_categories); 8525c51f124SMoriah Waterland 8535c51f124SMoriah Waterland return (0); 8545c51f124SMoriah Waterland } 8555c51f124SMoriah Waterland 8565c51f124SMoriah Waterland /* generate package list from specified packages */ 8575c51f124SMoriah Waterland 8585c51f124SMoriah Waterland *r_pkgList = gpkglist(a_pkgdev->dirname, &a_argv[a_optind], NULL); 8595c51f124SMoriah Waterland 8605c51f124SMoriah Waterland /* if list generated return results */ 8615c51f124SMoriah Waterland 8625c51f124SMoriah Waterland if (*r_pkgList != NULL) { 8635c51f124SMoriah Waterland echoDebug(DBG_PKGOPS_GPKGLIST_OK); 8645c51f124SMoriah Waterland return (0); 8655c51f124SMoriah Waterland } 8665c51f124SMoriah Waterland 8675c51f124SMoriah Waterland /* handle error from gpkglist */ 8685c51f124SMoriah Waterland 8695c51f124SMoriah Waterland switch (errno) { 8705c51f124SMoriah Waterland case ENOPKG: /* no packages */ 8715c51f124SMoriah Waterland echoDebug(DBG_PKGOPS_GPKGLIST_ENOPKG); 8725c51f124SMoriah Waterland return (-1); 8735c51f124SMoriah Waterland 8745c51f124SMoriah Waterland case ESRCH: 8755c51f124SMoriah Waterland echoDebug(DBG_PKGOPS_GPKGLIST_ESRCH); 8765c51f124SMoriah Waterland return (1); 8775c51f124SMoriah Waterland 8785c51f124SMoriah Waterland case EINTR: 8795c51f124SMoriah Waterland echoDebug(DBG_PKGOPS_GPKGLIST_EINTR); 8805c51f124SMoriah Waterland return (3); 8815c51f124SMoriah Waterland 8825c51f124SMoriah Waterland default: 8835c51f124SMoriah Waterland echoDebug(DBG_PKGOPS_GPKGLIST_UNKNOWN, errno); 8845c51f124SMoriah Waterland progerr(ERR_GPKGLIST_ERROR); 8855c51f124SMoriah Waterland return (99); 8865c51f124SMoriah Waterland } 8875c51f124SMoriah Waterland } 8885c51f124SMoriah Waterland 8895c51f124SMoriah Waterland /* 8905c51f124SMoriah Waterland * return string representing path to "global zone only file" 8915c51f124SMoriah Waterland */ 8925c51f124SMoriah Waterland 8935c51f124SMoriah Waterland char * 8945c51f124SMoriah Waterland pkgGetGzOnlyPath(void) 8955c51f124SMoriah Waterland { 8965c51f124SMoriah Waterland return (GLOBALZONE_ONLY_PACKAGE_FILE_PATH); 8975c51f124SMoriah Waterland } 8985c51f124SMoriah Waterland 8995c51f124SMoriah Waterland /* 9005c51f124SMoriah Waterland * Name: pkgAddThisZonePackage 9015c51f124SMoriah Waterland * Description: Add specified package to internal list of "this zone only" pkgs 9025c51f124SMoriah Waterland * Arguments: a_pkgInst - name of package to add to list 9035c51f124SMoriah Waterland * Returns: void 9045c51f124SMoriah Waterland */ 9055c51f124SMoriah Waterland 9065c51f124SMoriah Waterland void 9075c51f124SMoriah Waterland pkgAddThisZonePackage(char *a_pkgInst) 9085c51f124SMoriah Waterland { 9095c51f124SMoriah Waterland /* entry assertions */ 9105c51f124SMoriah Waterland 9115c51f124SMoriah Waterland assert(a_pkgInst != (char *)NULL); 9125c51f124SMoriah Waterland assert(*a_pkgInst != '\0'); 9135c51f124SMoriah Waterland 9145c51f124SMoriah Waterland /* do not duplicate entries */ 9155c51f124SMoriah Waterland 9165c51f124SMoriah Waterland if (pkgPackageIsThisZone(a_pkgInst) == B_TRUE) { 9175c51f124SMoriah Waterland return; 9185c51f124SMoriah Waterland } 9195c51f124SMoriah Waterland 9205c51f124SMoriah Waterland /* add package name to internal list */ 9215c51f124SMoriah Waterland 9225c51f124SMoriah Waterland if (thisZonePackages == (char **)NULL) { 9235c51f124SMoriah Waterland thisZonePackages = 9245c51f124SMoriah Waterland (char **)calloc(2, sizeof (char **)); 9255c51f124SMoriah Waterland } else { 9265c51f124SMoriah Waterland thisZonePackages = 9275c51f124SMoriah Waterland (char **)realloc(thisZonePackages, 9285c51f124SMoriah Waterland sizeof (char **)*(numThisZonePackages+2)); 9295c51f124SMoriah Waterland } 9305c51f124SMoriah Waterland 9315c51f124SMoriah Waterland /* handle out of memory error */ 9325c51f124SMoriah Waterland 9335c51f124SMoriah Waterland if (thisZonePackages == (char **)NULL) { 9345c51f124SMoriah Waterland progerr(ERR_MEMORY, errno); 9355c51f124SMoriah Waterland quit(99); 9365c51f124SMoriah Waterland } 9375c51f124SMoriah Waterland 9385c51f124SMoriah Waterland /* add this entry to the end of the list */ 9395c51f124SMoriah Waterland 9405c51f124SMoriah Waterland thisZonePackages[numThisZonePackages] = strdup(a_pkgInst); 9415c51f124SMoriah Waterland if (thisZonePackages[numThisZonePackages] == (char *)NULL) { 9425c51f124SMoriah Waterland progerr(ERR_MEMORY, errno); 9435c51f124SMoriah Waterland quit(99); 9445c51f124SMoriah Waterland } 9455c51f124SMoriah Waterland 9465c51f124SMoriah Waterland numThisZonePackages++; 9475c51f124SMoriah Waterland 9485c51f124SMoriah Waterland /* make sure end of the list is properly terminated */ 9495c51f124SMoriah Waterland 9505c51f124SMoriah Waterland thisZonePackages[numThisZonePackages] = (char *)NULL; 9515c51f124SMoriah Waterland 9525c51f124SMoriah Waterland /* exit debugging info */ 9535c51f124SMoriah Waterland 9545c51f124SMoriah Waterland echoDebug(DBG_PKGOPS_ADD_TZP, numThisZonePackages, 9555c51f124SMoriah Waterland thisZonePackages[numThisZonePackages-1]); 9565c51f124SMoriah Waterland } 9575c51f124SMoriah Waterland 9585c51f124SMoriah Waterland /* 9595c51f124SMoriah Waterland * Name: pkgPackageIsThisZone 9605c51f124SMoriah Waterland * Description: Determine if the specified package is marked to be installed 9615c51f124SMoriah Waterland * in this zone only 9625c51f124SMoriah Waterland * Arguments: a_pkgInst - pointer to string representing package name to check 9635c51f124SMoriah Waterland * Returns: boolean_t 9645c51f124SMoriah Waterland * B_TRUE - the package IS "this zone only" 9655c51f124SMoriah Waterland * B_FALSE - the paackage is NOT "this zone only" 9665c51f124SMoriah Waterland */ 9675c51f124SMoriah Waterland 9685c51f124SMoriah Waterland boolean_t 9695c51f124SMoriah Waterland pkgPackageIsThisZone(char *a_pkgInst) 9705c51f124SMoriah Waterland { 9715c51f124SMoriah Waterland int n; 9725c51f124SMoriah Waterland 9735c51f124SMoriah Waterland /* entry assertions */ 9745c51f124SMoriah Waterland 9755c51f124SMoriah Waterland assert(a_pkgInst != (char *)NULL); 9765c51f124SMoriah Waterland assert(*a_pkgInst != '\0'); 9775c51f124SMoriah Waterland 9785c51f124SMoriah Waterland /* 9795c51f124SMoriah Waterland * see if this package is in the "this zone only" list 9805c51f124SMoriah Waterland */ 9815c51f124SMoriah Waterland 9825c51f124SMoriah Waterland for (n = 0; n < numThisZonePackages; n++) { 9835c51f124SMoriah Waterland if (strcmp(a_pkgInst, thisZonePackages[n]) == 0) { 9845c51f124SMoriah Waterland echoDebug(DBG_PKGOPS_IS_THISZONE, a_pkgInst); 9855c51f124SMoriah Waterland return (B_TRUE); 9865c51f124SMoriah Waterland } 9875c51f124SMoriah Waterland } 9885c51f124SMoriah Waterland 9895c51f124SMoriah Waterland /* path is not in "this zone only" list */ 9905c51f124SMoriah Waterland 9915c51f124SMoriah Waterland echoDebug(DBG_PKGOPS_IS_NOT_THISZONE, a_pkgInst); 9925c51f124SMoriah Waterland 9935c51f124SMoriah Waterland return (B_FALSE); 9945c51f124SMoriah Waterland } 9955c51f124SMoriah Waterland 9965c51f124SMoriah Waterland /* 9975c51f124SMoriah Waterland * Name: pkgLocateHighestInst 9985c51f124SMoriah Waterland * Description: Locate the highest installed instance of a package 9995c51f124SMoriah Waterland * Arguments: r_path - [RO, *RW] - (char *) 10005c51f124SMoriah Waterland * Pointer to buffer where the full path to the top level 10015c51f124SMoriah Waterland * directory containing the latest instance of the 10025c51f124SMoriah Waterland * specified package is located is placed. 10035c51f124SMoriah Waterland * r_pathLen - [RO, *RO] - (int) 10045c51f124SMoriah Waterland * Integer representing the size of r_path in bytes. 10055c51f124SMoriah Waterland * r_pkgInst - [RO, *RW] - (char *) 10065c51f124SMoriah Waterland * Pointer to buffer where the package instance name of the 10075c51f124SMoriah Waterland * latest instance of the specified package is placed. 10085c51f124SMoriah Waterland * r_pkgInstLen - [RO, *RO] - (int) 10095c51f124SMoriah Waterland * Integer representing the size of r_pkgInst in bytes. 10105c51f124SMoriah Waterland * a_rootPath - [RO, *RO] - (char *) 10115c51f124SMoriah Waterland * Pointer to string representing the root path to look 10125c51f124SMoriah Waterland * for the latest instance of the specified package. 10135c51f124SMoriah Waterland * a_pkgInst - [RO, *RO] - (char *) 10145c51f124SMoriah Waterland * Pointer to string representing the name of the package 10155c51f124SMoriah Waterland * to locate the latest installed instance of. 10165c51f124SMoriah Waterland */ 10175c51f124SMoriah Waterland 10185c51f124SMoriah Waterland void 10195c51f124SMoriah Waterland pkgLocateHighestInst(char *r_path, int r_pathLen, char *r_pkgInst, 10205c51f124SMoriah Waterland int r_pkgInstLen, char *a_rootPath, char *a_pkgInst) 10215c51f124SMoriah Waterland { 10225c51f124SMoriah Waterland char pkgInstPath[PATH_MAX] = {'\0'}; 10235c51f124SMoriah Waterland char pkgWild[PKGSIZ+1] = {'\0'}; 10245c51f124SMoriah Waterland char pkgName[PKGSIZ+1] = {'\0'}; 10255c51f124SMoriah Waterland int npkgs; 10265c51f124SMoriah Waterland struct pkginfo *pinf = (struct pkginfo *)NULL; 10275c51f124SMoriah Waterland 10285c51f124SMoriah Waterland /* entry assertions */ 10295c51f124SMoriah Waterland 10305c51f124SMoriah Waterland assert(r_path != (char *)NULL); 10315c51f124SMoriah Waterland assert(r_pathLen > 0); 10325c51f124SMoriah Waterland assert(r_pkgInst != (char *)NULL); 10335c51f124SMoriah Waterland assert(r_pkgInstLen > 0); 10345c51f124SMoriah Waterland assert(a_pkgInst != (char *)NULL); 10355c51f124SMoriah Waterland assert(*a_pkgInst != '\0'); 10365c51f124SMoriah Waterland 10375c51f124SMoriah Waterland /* normalize root path */ 10385c51f124SMoriah Waterland 10395c51f124SMoriah Waterland if ((a_rootPath == (char *)NULL) || (strcmp(a_rootPath, "/") == 0)) { 10405c51f124SMoriah Waterland a_rootPath = ""; 10415c51f124SMoriah Waterland } 10425c51f124SMoriah Waterland 10435c51f124SMoriah Waterland /* construct path to package repository directory (eg. /var/sadm/pkg) */ 10445c51f124SMoriah Waterland 10455c51f124SMoriah Waterland (void) snprintf(pkgInstPath, sizeof (pkgInstPath), "%s%s", a_rootPath, 10465c51f124SMoriah Waterland PKGLOC); 10475c51f124SMoriah Waterland 10485c51f124SMoriah Waterland /* entry debugging info */ 10495c51f124SMoriah Waterland 10505c51f124SMoriah Waterland echoDebug(DBG_PKGOPS_LOCHIGH_ENTRY); 10515c51f124SMoriah Waterland echoDebug(DBG_PKGOPS_LOCHIGH_ARGS, pkgInstPath, a_pkgInst); 10525c51f124SMoriah Waterland 10535c51f124SMoriah Waterland /* reset returned path/package instance so both ares empty */ 10545c51f124SMoriah Waterland 10555c51f124SMoriah Waterland *r_path = '\0'; 10565c51f124SMoriah Waterland *r_pkgInst = '\0'; 10575c51f124SMoriah Waterland 10585c51f124SMoriah Waterland /* remove any architecture extension */ 10595c51f124SMoriah Waterland 10605c51f124SMoriah Waterland pkgstrGetToken_r((char *)NULL, a_pkgInst, 0, ".", 10615c51f124SMoriah Waterland pkgName, sizeof (pkgName)); 10625c51f124SMoriah Waterland 10635c51f124SMoriah Waterland /* make sure that the package name is valid and can be wild carded */ 10645c51f124SMoriah Waterland 10655c51f124SMoriah Waterland if (pkgnmchk(pkgName, NULL, 0) || strchr(pkgName, '.')) { 10665c51f124SMoriah Waterland progerr(ERR_PKGOPS_LOCHIGH_BAD_PKGNAME, pkgName); 10675c51f124SMoriah Waterland quit(99); 10685c51f124SMoriah Waterland } 10695c51f124SMoriah Waterland 10705c51f124SMoriah Waterland /* create wild card specification for this package instance */ 10715c51f124SMoriah Waterland 10725c51f124SMoriah Waterland (void) snprintf(pkgWild, sizeof (pkgWild), "%s.*", pkgName); 10735c51f124SMoriah Waterland 10745c51f124SMoriah Waterland echoDebug(DBG_PKGOPS_LOCHIGH_WILDCARD, pkgName, pkgWild); 10755c51f124SMoriah Waterland 10765c51f124SMoriah Waterland /* 10775c51f124SMoriah Waterland * inspect the system to determine if any instances of the 10785c51f124SMoriah Waterland * package being installed already exist on the system 10795c51f124SMoriah Waterland */ 10805c51f124SMoriah Waterland 10815c51f124SMoriah Waterland for (npkgs = 0; ; npkgs++) { 10825c51f124SMoriah Waterland char *savePkgdir; 10835c51f124SMoriah Waterland int r; 10845c51f124SMoriah Waterland 10855c51f124SMoriah Waterland /* allocate new pinfo structure for use in the pkginfo call */ 10865c51f124SMoriah Waterland 10875c51f124SMoriah Waterland pinf = _pkginfoFactory(); 10885c51f124SMoriah Waterland 10895c51f124SMoriah Waterland /* 10905c51f124SMoriah Waterland * lookup the specified package; the first call will cause the 10915c51f124SMoriah Waterland * pkgdir directory to be opened - it will be closed when the 10925c51f124SMoriah Waterland * end of directory is read and pkginfo() returns != 0. You must 10935c51f124SMoriah Waterland * cycle through all instances until pkginfo() returns != 0. 10945c51f124SMoriah Waterland * NOTE: pkginfo() requires the global variable 'pkgdir' be set 10955c51f124SMoriah Waterland * to the package installed directory (<root>/var/sadm/pkg). 10965c51f124SMoriah Waterland */ 10975c51f124SMoriah Waterland 10985c51f124SMoriah Waterland savePkgdir = pkgdir; 10995c51f124SMoriah Waterland pkgdir = pkgInstPath; 11005c51f124SMoriah Waterland 11015c51f124SMoriah Waterland r = pkginfo(pinf, pkgWild, NULL, NULL); 11025c51f124SMoriah Waterland 11035c51f124SMoriah Waterland pkgdir = savePkgdir; 11045c51f124SMoriah Waterland 11055c51f124SMoriah Waterland echoDebug(DBG_PKGOPS_PKGINFO_RETURNED, pkgName, r); 11065c51f124SMoriah Waterland 11075c51f124SMoriah Waterland /* break out of loop of no package found */ 11085c51f124SMoriah Waterland 11095c51f124SMoriah Waterland if (r != 0) { 11105c51f124SMoriah Waterland pkginfoFree(&pinf); 11115c51f124SMoriah Waterland break; 11125c51f124SMoriah Waterland } 11135c51f124SMoriah Waterland 11145c51f124SMoriah Waterland echoDebug(DBG_PKGOPS_LOCHIGH_INSTANCE, npkgs, 11155c51f124SMoriah Waterland pinf->pkginst ? pinf->pkginst : "", 11165c51f124SMoriah Waterland pinf->name ? pinf->name : "", 11175c51f124SMoriah Waterland pinf->arch ? pinf->arch : "", 11185c51f124SMoriah Waterland pinf->version ? pinf->version : "", 11195c51f124SMoriah Waterland pinf->vendor ? pinf->vendor : "", 11205c51f124SMoriah Waterland pinf->basedir ? pinf->basedir : "", 11215c51f124SMoriah Waterland pinf->catg ? pinf->catg : "", 11225c51f124SMoriah Waterland pinf->status); 11235c51f124SMoriah Waterland 11245c51f124SMoriah Waterland /* save path/instance name for this instance found */ 11255c51f124SMoriah Waterland 11265c51f124SMoriah Waterland (void) strlcpy(r_pkgInst, pinf->pkginst, r_pkgInstLen); 11275c51f124SMoriah Waterland pkgstrPrintf_r(r_path, r_pathLen, "%s%s/%s", a_rootPath, 11285c51f124SMoriah Waterland PKGLOC, pinf->pkginst); 11295c51f124SMoriah Waterland 11305c51f124SMoriah Waterland pkginfoFree(&pinf); 11315c51f124SMoriah Waterland } 11325c51f124SMoriah Waterland 11335c51f124SMoriah Waterland echoDebug(DBG_PKGOPS_LOCHIGH_RETURN, npkgs, r_pkgInst, r_path); 11345c51f124SMoriah Waterland } 11355c51f124SMoriah Waterland 11365c51f124SMoriah Waterland /* 11375c51f124SMoriah Waterland * Name: pkgTestInstalled 11385c51f124SMoriah Waterland * Description: determine if package is installed at specified root path 11395c51f124SMoriah Waterland * Arguments: a_packageName - name of package to test 11405c51f124SMoriah Waterland * a_rootPath - root path of alternative root to test 11415c51f124SMoriah Waterland * Returns: B_TRUE - package is installed 11425c51f124SMoriah Waterland * B_FALSE - package is not installed 11435c51f124SMoriah Waterland */ 11445c51f124SMoriah Waterland 11455c51f124SMoriah Waterland boolean_t 11465c51f124SMoriah Waterland pkgTestInstalled(char *a_packageName, char *a_rootPath) 11475c51f124SMoriah Waterland { 11485c51f124SMoriah Waterland char cmd[MAXPATHLEN+1]; 11495c51f124SMoriah Waterland int rc; 11505c51f124SMoriah Waterland 11515c51f124SMoriah Waterland /* entry assertions */ 11525c51f124SMoriah Waterland 11535c51f124SMoriah Waterland assert(a_packageName != (char *)NULL); 11545c51f124SMoriah Waterland assert(*a_packageName != '\0'); 11555c51f124SMoriah Waterland assert(a_rootPath != (char *)NULL); 11565c51f124SMoriah Waterland assert(a_rootPath != '\0'); 11575c51f124SMoriah Waterland 11585c51f124SMoriah Waterland /* entry debugging info */ 11595c51f124SMoriah Waterland 11605c51f124SMoriah Waterland echoDebug(DBG_PKG_TEST_EXISTENCE, a_packageName, a_rootPath); 11615c51f124SMoriah Waterland 11625c51f124SMoriah Waterland /* 11635c51f124SMoriah Waterland * create pkginfo command to execute: 11645c51f124SMoriah Waterland * /usr/bin/pkginfo -q <packageName> 11655c51f124SMoriah Waterland */ 11665c51f124SMoriah Waterland (void) snprintf(cmd, sizeof (cmd), 11675c51f124SMoriah Waterland "%s -q %s", PKGINFO_CMD, a_packageName); 11685c51f124SMoriah Waterland 11695c51f124SMoriah Waterland /* execute command */ 11705c51f124SMoriah Waterland 11715c51f124SMoriah Waterland rc = system(cmd); 11725c51f124SMoriah Waterland 11735c51f124SMoriah Waterland /* return success if pkginfo returns "0" */ 11745c51f124SMoriah Waterland 11755c51f124SMoriah Waterland if (rc == 0) { 11765c51f124SMoriah Waterland echoDebug(DBG_PKG_INSTALLED, a_packageName, a_rootPath); 11775c51f124SMoriah Waterland return (B_TRUE); 11785c51f124SMoriah Waterland } 11795c51f124SMoriah Waterland 11805c51f124SMoriah Waterland /* package not installed */ 11815c51f124SMoriah Waterland 11825c51f124SMoriah Waterland echoDebug(DBG_PKG_NOT_INSTALLED, a_packageName, a_rootPath); 11835c51f124SMoriah Waterland 11845c51f124SMoriah Waterland return (B_FALSE); 11855c51f124SMoriah Waterland } 11865c51f124SMoriah Waterland 11875c51f124SMoriah Waterland /* 11885c51f124SMoriah Waterland * ***************************************************************************** 11895c51f124SMoriah Waterland * static internal (private) functions 11905c51f124SMoriah Waterland * ***************************************************************************** 11915c51f124SMoriah Waterland */ 11925c51f124SMoriah Waterland 11935c51f124SMoriah Waterland static void 11945c51f124SMoriah Waterland _pkginfoInit(struct pkginfo *a_info) 11955c51f124SMoriah Waterland { 11965c51f124SMoriah Waterland /* entry assertions */ 11975c51f124SMoriah Waterland 11985c51f124SMoriah Waterland assert(a_info != (struct pkginfo *)NULL); 11995c51f124SMoriah Waterland 12005c51f124SMoriah Waterland /* free previously allocated space */ 12015c51f124SMoriah Waterland 12025c51f124SMoriah Waterland if (a_info->pkginst) { 12035c51f124SMoriah Waterland free(a_info->pkginst); 12045c51f124SMoriah Waterland if (a_info->arch) 12055c51f124SMoriah Waterland free(a_info->arch); 12065c51f124SMoriah Waterland if (a_info->version) 12075c51f124SMoriah Waterland free(a_info->version); 12085c51f124SMoriah Waterland if (a_info->basedir) 12095c51f124SMoriah Waterland free(a_info->basedir); 12105c51f124SMoriah Waterland if (a_info->name) 12115c51f124SMoriah Waterland free(a_info->name); 12125c51f124SMoriah Waterland if (a_info->vendor) 12135c51f124SMoriah Waterland free(a_info->vendor); 12145c51f124SMoriah Waterland if (a_info->catg) 12155c51f124SMoriah Waterland free(a_info->catg); 12165c51f124SMoriah Waterland } 12175c51f124SMoriah Waterland 12185c51f124SMoriah Waterland a_info->pkginst = NULL; 12195c51f124SMoriah Waterland a_info->arch = a_info->version = NULL; 12205c51f124SMoriah Waterland a_info->basedir = a_info->name = NULL; 12215c51f124SMoriah Waterland a_info->vendor = a_info->catg = NULL; 12225c51f124SMoriah Waterland a_info->status = PI_UNKNOWN; 12235c51f124SMoriah Waterland } 12245c51f124SMoriah Waterland 12255c51f124SMoriah Waterland static struct pkginfo * 12265c51f124SMoriah Waterland _pkginfoFactory(void) 12275c51f124SMoriah Waterland { 12285c51f124SMoriah Waterland struct pkginfo *pinf; 12295c51f124SMoriah Waterland 12305c51f124SMoriah Waterland pinf = (struct pkginfo *)calloc(1, sizeof (struct pkginfo)); 12315c51f124SMoriah Waterland if (pinf == (struct pkginfo *)NULL) { 12325c51f124SMoriah Waterland progerr(ERR_MEM); 12335c51f124SMoriah Waterland exit(1); 12345c51f124SMoriah Waterland } 12355c51f124SMoriah Waterland 12365c51f124SMoriah Waterland _pkginfoInit(pinf); 12375c51f124SMoriah Waterland return (pinf); 12385c51f124SMoriah Waterland } 1239