/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License (the "License").
* You may not use this file except in compliance with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* See the License for the specific language governing permissions
* and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at usr/src/OPENSOLARIS.LICENSE.
* If applicable, add the following below this CDDL HEADER, with the
* fields enclosed by brackets "[]" replaced with your own identifying
* information: Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*/
/* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
/* All Rights Reserved */
/*
*/
/* 5-20-92 newroot support added */
#include <stdio.h>
#include <limits.h>
#include <ctype.h>
#include <errno.h>
#include <string.h>
#include <pkgstrct.h>
#include <pkginfo.h>
#include <pkglocs.h>
#include <stdlib.h>
#include <unistd.h>
#include "libadm.h"
/*
* This looks in a directory that might be the top level directory of a
* package. It tests a temporary install directory first and then for a
* standard directory. This looks a little confusing, so here's what's
* happening. If this pkginfo is being openned in a script during a pkgadd
* which is updating an existing package, the original pkginfo file is in a
* directory that has been renamed from <pkginst> to .save.<pkginst>. If the
* pkgadd fails it will be renamed back to <pkginst>. We are always interested
* in the OLD pkginfo data because the new pkginfo data is already in our
* environment. For that reason, we try to open the backup first - that has
* the old data. This returns the first accessible path in "path" and a "1"
* if an appropriate pkginfo file was found. It returns a 0 if no type of
* pkginfo was located.
*/
int
{
int len = 0;
/* Construct the temporary pkginfo file name. */
pkginst);
return (0);
/*
* This isn't a temporary directory, so we look for a
* regular one.
*/
pkginst);
return (0);
return (0); /* doesn't appear to be a package */
}
return (1);
}
/*
* This opens the appropriate pkginfo file for a particular package.
*/
FILE *
{
return (fp);
}
char *
{
int c, n;
int idx = 0;
return (NULL);
}
for (;;) { /* For each entry in the file fp */
n = 0;
/* Get the next token. */
ch = (char)c;
break;
if (++n < VALSIZ)
}
/* If it's the end of the file, exit the for() loop */
if (c == EOF) {
return (NULL); /* No more entries left */
/* If it's end of line, look for the next parameter. */
} else if (c == NEWLINE)
continue;
/* At this point copy points to the end of a valid parameter. */
else {
/* If parameter is NULL, we return whatever we got. */
if (param[0] == '\0') {
/* If this doesn't match the parameter, drop thru. */
/* Otherwise, this is our boy. */
else
}
n = 0;
/* Now read the parameter value. */
ch = (char)c;
continue; /* Ignore leading white space */
/*
* Take last end quote 'verbatim' if anything
* other than space, newline and escape.
* Example:
* PARAM1="zonename="test-zone""
* Here in this example the letter 't' inside
* the value is followed by '"', this makes
* the previous end quote candidate '"',
* a part of value and the end quote
* disqualfies. Reset check_end_quote.
* PARAM2="value"<== newline here
* PARAM3="value"\
* "continued"<== newline here.
* Check for end quote continues.
*/
if (!escape) {
/*
* The end quote candidate qualifies.
* Eat any trailing spaces.
*/
if (check_end_quote) {
n = idx;
}
break; /* End of entry */
}
/*
* The end quote if exists, doesn't qualify.
* Eat end quote and trailing spaces if any.
* Value spans to next line.
*/
if (check_end_quote) {
n = idx;
} else if (copy) {
copy--; /* Eat previous esc */
n--;
}
continue;
} else {
/* Handle quotes */
if (begline) {
/* Starting quote */
continue;
} else if (quoted) {
/*
* This is the candidate
* for end quote. Check
* to see it qualifies.
*/
idx = n;
}
}
else if (escape)
}
if (mempt) {
(n+VALSIZ)*sizeof (char));
if (!mempt)
return (NULL);
} else {
sizeof (char));
if (!mempt)
return (NULL);
}
}
}
/*
* Don't allow trailing white space.
* NOTE : White space in the middle is OK, since this may
* be a list. At some point it would be a good idea to let
* this function know how to validate such a list. -- JST
*
* Now while there's a parametric value and it ends in a
* space and the actual remaining string length is still
* greater than 0, back over the space.
*/
copy--;
if (quoted) {
if (mempt)
return (NULL);
}
if (copy) {
*copy = '\0';
break;
}
if (c == EOF) {
return (NULL);
}
}
if (!mempt)
else
return (mempt);
}
char *
{
if (!pkgdir)
pkgdir = get_PKGLOC();
if (!pkg) {
/* request to close file */
if (fp) {
}
return (NULL);
}
if (!param) {
return (NULL);
}
if (pkgfile)
else
/* different filename implies need for different fp */
}
if (!fp) {
return (NULL);
}
/*
* if parameter is a null string, then the user is requesting us
* to find the value of the next available parameter for this
* package and to copy the parameter name into the provided string;
* if it is not, then it is a request for a specified parameter, in
* which case we rewind the file to start search from beginning
*/
if (param[0]) {
/* new parameter request, so reset file position */
return (NULL);
}
/* remove all whitespace from value */
while (*value) {
value++;
}
*copy = '\0';
}
return (pt);
}
return (NULL);
}
/*
* This routine sets adm_pkgloc and adm_pkgadm which are the
* replacement location for PKGLOC and PKGADM.
*/
static void canonize_name(char *);
void
{
} else {
}
pkgdir = Adm_pkgloc;
}
char *
get_PKGLOC(void)
{
if (Adm_pkgloc[0] == NULL)
return (PKGLOC);
else
return (Adm_pkgloc);
}
char *
get_PKGOLD(void)
{
if (Adm_pkgold[0] == NULL)
return (PKGOLD);
else
return (Adm_pkgold);
}
char *
get_PKGADM(void)
{
if (Adm_pkgadm[0] == NULL)
return (PKGADM);
else
return (Adm_pkgadm);
}
void
{
}
void
{
}
static void
{
int level;
/* Remove references such as "./" and "../" and "//" */
level = 0;
do {
level++;
last += 2;
if (*last)
last++;
--pt; /* point to previous '/' */
while (level--) {
return;
;
}
if (*pt == '/')
pt++;
} else {
pt++;
if (*pt == '/') {
pt++;
}
}
}
*pt = '\0';
}
void
{
}
char *
{
return (pkg_inst_root);
}