5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * CDDL HEADER START
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 * 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 * 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 * CDDL HEADER END
6e1ae2a33c618c4c2b14aec7d2f21743ddea5837Gary Pennington * Copyright (c) 2004, 2010, Oracle and/or its affiliates. All rights reserved.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/* commands to execute */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#if !defined(TEXT_DOMAIN) /* Should be defined by cc -D */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * forward declarations
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic void _pkginfoInit(struct pkginfo *a_info);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic struct pkginfo *_pkginfoFactory(void);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * *****************************************************************************
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * global external (public) functions
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 /* entry assertions */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* localize reference to info structure to free */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* reset callers handle to info structure */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* free up contents of the structure */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* free up structure itself */
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 WaterlandpkginfoIsPkgInstalled(struct pkginfo **r_pinfo, char *a_pkgInst)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry assertions */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* reset returned pkginfo structure handle */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* allocate a new pinfo structure for use in the call to pkginfo */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* lookup the specified package */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* NOTE: required 'pkgdir' set to spool directory or NULL */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_PKGOPS_PKGINFO_RETURNED, a_pkgInst, r);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* free pkginfo structure */
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 /* normalize root path */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* generate path to glocal zone only list file */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland len = snprintf(pkgingzonlyPath, sizeof (pkgingzonlyPath), "%s/%s",
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland a_rootPath, GLOBALZONE_ONLY_PACKAGE_FILE_PATH);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* open global zone only list file */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkgingzonlyFP = fopen(pkgingzonlyPath, "r+");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((pkgingzonlyFP == (FILE *)NULL) && (errno == ENOENT)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkgingzonlyFP = fopen(pkgingzonlyPath, "w+");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((pkgingzonlyFP == (FILE *)NULL) && (errno != ENOENT)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_PKGOPS_OPEN_GZONLY, pkgingzonlyPath,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* success - return FILE pointer open on global zone only list file */
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 WaterlandpkgIsPkgInGzOnly(char *a_rootPath, char *a_pkgInst)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* normalize root path */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* open the global zone only package list file */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* is the package recorded as "in global zone only" ? */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland in_gz_only = pkgIsPkgInGzOnlyFP(fp, a_pkgInst);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* close the global zone only package list file */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* return results */
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 WaterlandpkgIsPkgInGzOnlyFP(FILE *a_fp, char *a_pkgInst)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry assertions */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* rewind the file to the beginning */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* read the file line by line searching for the specified package */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland while (fgets(line, sizeof (line), a_fp) != (char *)NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* strip off trailing newlines */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland while ((len > 0) && (line[len-1] == '\n')) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* ignore blank and comment lines */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((line[0] == '#') || (line[0] == '\0')) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* return true if this is the package we are looking for */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_PKGOPS_PKG_IS_GZONLY, a_pkgInst);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* end of file - package not found */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_PKGOPS_PKG_NOT_GZONLY, a_pkgInst);
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 WaterlandpkgRemovePackageFromGzonlyList(char *a_rootPath, char *a_pkgInst)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry assertions */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* normalize root path */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * calculate paths to various objects
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* path to current "source" ingzonly file */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland len = snprintf(srcPath, sizeof (srcPath), "%s/%s",
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland a_rootPath, GLOBALZONE_ONLY_PACKAGE_FILE_PATH);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* path to new "destination" ingzonly file */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland len = snprintf(destPath, sizeof (destPath), "%s/%s.tmp",
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland a_rootPath, GLOBALZONE_ONLY_PACKAGE_FILE_PATH);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* path to temporary "saved" ingzonly file */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland len = snprintf(savePath, sizeof (savePath), "%s/%s.save",
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland a_rootPath, GLOBALZONE_ONLY_PACKAGE_FILE_PATH);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* open source file, creating if necessary */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((srcFP == (FILE *)NULL) && (errno == ENOENT)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* error if could not open/create file */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_PKGOPS_OPEN_GZONLY, srcPath, strerror(errno));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* open/create new destination file */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_PKGOPS_TMPOPEN, destPath, strerror(errno));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* add standard comment to beginning of file */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) strftime(timeb, sizeof (timeb), "%c\n", timep);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* put standard header at the beginning of the file */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fprintf(destFP, MSG_GZONLY_FILE_HEADER,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland get_prog_name(), "remove", a_pkgInst, timeb);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* read source/write destination - removing specified package */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland while (fgets(line, sizeof (line), srcFP) != (char *)NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* strip off trailing newlines */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland while ((len > 0) && (line[len-1] == '\n')) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* ignore blank and comment lines */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((line[0] == '#') || (line[0] == '\0')) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* add pkg if yet to add and pkg <= line */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((pkgremoved == B_FALSE) && (strcmp(a_pkgInst, line) == 0)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* close both files */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * if package not found there is no need to update the original file
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Now we want to make a copy of the old gzonly file as a
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((access(savePath, F_OK) == 0) && remove(savePath)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_REMOVE, savePath, strerror(errno));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_LINK, savePath, srcPath, strerror(errno));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_RENAME, destPath, srcPath, strerror(errno));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_RENAME, savePath, srcPath, strerror(errno));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_REMOVE, savePath, strerror(errno));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* successfully removed package */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_PKGOPS_REMOVED_GZPKG, a_pkgInst);
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 WaterlandpkgAddPackageToGzonlyList(char *a_pkgInst, char *a_rootPath)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry assertions */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* normalize root path */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry debugging info */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_PKGOPS_ADDGZPKG, a_pkgInst, a_rootPath);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * calculate paths to various objects
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* path to current "source" ingzonly file */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland len = snprintf(srcPath, sizeof (srcPath), "%s/%s",
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland a_rootPath, GLOBALZONE_ONLY_PACKAGE_FILE_PATH);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* path to new "destination" ingzonly file */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland len = snprintf(destPath, sizeof (destPath), "%s/%s.tmp",
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland a_rootPath, GLOBALZONE_ONLY_PACKAGE_FILE_PATH);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* path to temporary "saved" ingzonly file */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland len = snprintf(savePath, sizeof (savePath), "%s/%s.save",
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland a_rootPath, GLOBALZONE_ONLY_PACKAGE_FILE_PATH);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* open source file, creating if necessary */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((srcFP == (FILE *)NULL) && (errno == ENOENT)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* error if could not open/create file */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_PKGOPS_OPEN_GZONLY, srcPath, strerror(errno));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* open/create new destination file */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_PKGOPS_TMPOPEN, destPath, strerror(errno));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* add standard comment to beginning of file */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) strftime(timeb, sizeof (timeb), "%c\n", timep);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* put standard header at the beginning of the file */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fprintf(destFP, MSG_GZONLY_FILE_HEADER,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* read source/write destination; add package at appropriate location */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland while (fgets(line, sizeof (line), srcFP) != (char *)NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* strip off trailing newlines */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland while ((len > 0) && (line[len-1] == '\n')) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* ignore blank and comment lines */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((line[0] == '#') || (line[0] == '\0')) {
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 package not added yet, add to end of the file */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* close both files */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Now we want to make a copy of the old gzonly file as a
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((access(savePath, F_OK) == 0) && remove(savePath)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_REMOVE, savePath, strerror(errno));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_LINK, savePath, srcPath, strerror(errno));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_RENAME, destPath, srcPath, strerror(errno));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_RENAME, savePath, srcPath, strerror(errno));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_REMOVE, savePath, strerror(errno));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* successfully added package */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_PKGOPS_ADDED_GZPKG, a_pkgInst);
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 WaterlandpkginfoParamTruth(FILE *a_fp, char *a_param, char *a_value, boolean_t a_default)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry assertions */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* rewind the file to the beginning */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* search pkginfo file for the specified parameter */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* parameter not found - return default */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* parameter found but no value - return default */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else if (strcasecmp(param, a_value) == 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* paramter found - matches value */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* parameter found - does not match value */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* exit debugging info */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland a_param, a_value, a_default == B_TRUE ? "true" : "false",
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland param ? param : "?", result == B_TRUE ? "true" : "false");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if parameter value found, free results */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* return results of search */
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 * 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 * 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 WaterlandpkgGetPackageList(char ***r_pkgList, char **a_argv, int a_optind,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *a_categories, char **a_categoryList, struct pkgdev *a_pkgdev)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry assertions */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry debugging info */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_PKGOPS_GETPKGLIST_ARGS, a_pkgdev->dirname,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* reset returned package list handle */
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 /* generate package list from all packages in given category */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *r_pkgList = gpkglist(a_pkgdev->dirname, &all_pkgs[0],
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_PKGOPS_GPKGLIST_CATFAILED, a_categories);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_PKGOPS_GPKGLIST_CATOK, a_categories);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* generate package list from specified packages */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *r_pkgList = gpkglist(a_pkgdev->dirname, &a_argv[a_optind], NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if list generated return results */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* handle error from gpkglist */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_PKGOPS_GPKGLIST_UNKNOWN, errno);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * return string representing path to "global zone only file"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (GLOBALZONE_ONLY_PACKAGE_FILE_PATH);
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 /* entry assertions */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* do not duplicate entries */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (pkgPackageIsThisZone(a_pkgInst) == B_TRUE) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* add package name to internal list */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* handle out of memory error */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* add this entry to the end of the list */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland thisZonePackages[numThisZonePackages] = strdup(a_pkgInst);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (thisZonePackages[numThisZonePackages] == (char *)NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* make sure end of the list is properly terminated */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland thisZonePackages[numThisZonePackages] = (char *)NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* exit debugging info */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_PKGOPS_ADD_TZP, numThisZonePackages,
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 /* entry assertions */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * see if this package is in the "this zone only" list
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 /* path is not in "this zone only" list */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_PKGOPS_IS_NOT_THISZONE, a_pkgInst);
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 WaterlandpkgLocateHighestInst(char *r_path, int r_pathLen, char *r_pkgInst,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int r_pkgInstLen, char *a_rootPath, char *a_pkgInst)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland struct pkginfo *pinf = (struct pkginfo *)NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry assertions */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* normalize root path */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((a_rootPath == (char *)NULL) || (strcmp(a_rootPath, "/") == 0)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* construct path to package repository directory (eg. /var/sadm/pkg) */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) snprintf(pkgInstPath, sizeof (pkgInstPath), "%s%s", a_rootPath,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry debugging info */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_PKGOPS_LOCHIGH_ARGS, pkgInstPath, a_pkgInst);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* reset returned path/package instance so both ares empty */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* remove any architecture extension */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkgstrGetToken_r((char *)NULL, a_pkgInst, 0, ".",
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* make sure that the package name is valid and can be wild carded */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (pkgnmchk(pkgName, NULL, 0) || strchr(pkgName, '.')) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_PKGOPS_LOCHIGH_BAD_PKGNAME, pkgName);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* create wild card specification for this package instance */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) snprintf(pkgWild, sizeof (pkgWild), "%s.*", pkgName);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_PKGOPS_LOCHIGH_WILDCARD, pkgName, pkgWild);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * inspect the system to determine if any instances of the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * package being installed already exist on the system
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* allocate new pinfo structure for use in the pkginfo call */
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 echoDebug(DBG_PKGOPS_PKGINFO_RETURNED, pkgName, r);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* break out of loop of no package found */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (r != 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_PKGOPS_LOCHIGH_INSTANCE, npkgs,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* save path/instance name for this instance found */
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 echoDebug(DBG_PKGOPS_LOCHIGH_RETURN, npkgs, r_pkgInst, r_path);
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 WaterlandpkgTestInstalled(char *a_packageName, char *a_rootPath)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry assertions */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry debugging info */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_PKG_TEST_EXISTENCE, a_packageName, a_rootPath);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * create pkginfo command to execute:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * /usr/bin/pkginfo -q <packageName>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* execute command */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* return success if pkginfo returns "0" */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_PKG_INSTALLED, a_packageName, a_rootPath);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* package not installed */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_PKG_NOT_INSTALLED, a_packageName, a_rootPath);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * *****************************************************************************
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * static internal (private) functions
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * *****************************************************************************
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry assertions */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* free previously allocated space */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic struct pkginfo *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pinf = (struct pkginfo *)calloc(1, sizeof (struct pkginfo));