#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
#include <unistd.h>
#include <locale.h>
#include <libintl.h>
#include <pkglocs.h>
#include <pkglib.h>
#include "libinst.h"
int cl_NClasses = -1;
static int cl_handle = -1;
struct cl_attr **cl_Classes = NULL;
static int new_order;
static struct cl_attr *new_cl_attr(char *cl_name);
static unsigned s_verify(char *class_name), d_verify(char *class_name);
static unsigned s_pathtype(char *class_name);
#define MALSIZ 64
#define ERR_MEMORY "memory allocation failure"
static struct cl_attr *
new_cl_attr(char *cl_name)
{
struct cl_attr *class, **class_ptr;
if (cl_handle == -1) {
cl_handle = ar_create(MALSIZ, sizeof (struct cl_attr),
"package class");
if (cl_handle == -1) {
progerr(gettext(ERR_MEMORY));
return (NULL);
}
}
class_ptr = (struct cl_attr **)ar_next_avail(cl_handle);
if (class_ptr == NULL || *class_ptr == NULL) {
progerr(gettext(ERR_MEMORY));
return (NULL);
}
class = *class_ptr;
strcpy(class->name, cl_name);
class->inst_script = NULL;
class->rem_script = NULL;
class->src_verify = s_verify(cl_name);
class->dst_verify = d_verify(cl_name);
class->relpath_2_CAS = s_pathtype(cl_name);
return (class);
}
void
addlist(struct cl_attr ***listp, char *item)
{
int i;
if (*listp) {
for (i = 0; (*listp)[i]; i++)
if (strcmp(item, (*listp)[i]->name) == 0)
return;
} else {
i = 0;
}
if (new_cl_attr(item) == NULL)
quit(99);
(*listp) = (struct cl_attr **)ar_get_head(cl_handle);
}
int
setlist(struct cl_attr ***plist, char *slist)
{
struct cl_attr **list, *struct_ptr;
char *pt;
int n;
int i;
int sn = -1;
(void) s_verify(NULL);
(void) d_verify(NULL);
(void) s_pathtype(NULL);
n = 0;
cl_handle = -1;
pt = strtok(slist, " \t\n");
while (pt) {
if (sn == -1 && strcmp(pt, "none") == 0)
sn = n;
if ((struct_ptr = new_cl_attr(pt)) == NULL)
quit(99);
n++;
pt = strtok(NULL, " \t\n");
if (pt && sn != -1)
if (strcmp(pt, "none") == 0)
pt = strtok(NULL, " \t\n");
}
new_order = 0;
list = (struct cl_attr **)ar_get_head(cl_handle);
if (sn > 0) {
struct_ptr = list[sn];
for (i = sn; i > 0; i--)
list[i] = list[i - 1];
list[0] = struct_ptr;
new_order++;
}
*plist = list;
return (n);
}
void
cl_sets(char *slist)
{
char *list_ptr;
if (slist && *slist) {
list_ptr = qstrdup(slist);
if (list_ptr && *list_ptr) {
cl_NClasses = setlist(&cl_Classes, list_ptr);
if (new_order)
cl_putl("CLASSES", cl_Classes);
}
}
}
int
cl_getn(void)
{
return (cl_NClasses);
}
void
cl_putl(char *parm_name, struct cl_attr **list)
{
int i;
size_t j;
char *pt = NULL;
if (list && *list) {
j = 1;
for (i = 0; list[i]; i++)
j += strlen(list[i]->name) + 1;
pt = calloc(j, sizeof (char));
(void) strcpy(pt, list[0]->name);
for (i = 1; list[i]; i++) {
(void) strcat(pt, " ");
(void) strcat(pt, list[i]->name);
}
if (parm_name && *parm_name)
putparam(parm_name, pt);
free(pt);
}
}
int
cl_idx(char *cl_nam)
{
int n;
for (n = 0; n < cl_NClasses; n++)
if (strcmp(cl_Classes[n]->name, cl_nam) == 0)
return (n);
return (-1);
}
unsigned
cl_svfy(int idx)
{
if (cl_Classes && idx >= 0 && idx < cl_NClasses)
return (cl_Classes[idx]->src_verify);
return (0);
}
unsigned
cl_dvfy(int idx)
{
if (cl_Classes && idx >= 0 && idx < cl_NClasses)
return (cl_Classes[idx]->dst_verify);
return (0);
}
unsigned
cl_pthrel(int idx)
{
if (cl_Classes && idx >= 0 && idx < cl_NClasses)
return (cl_Classes[idx]->relpath_2_CAS);
return (0);
}
char *
cl_nam(int idx)
{
if (cl_Classes && idx >= 0 && idx < cl_NClasses)
return (cl_Classes[idx]->name);
return (NULL);
}
void
cl_setl(struct cl_attr **cl_lst)
{
int i;
int sn = -1;
struct cl_attr *pt;
if (cl_lst) {
for (cl_NClasses = 0; cl_lst[cl_NClasses]; cl_NClasses++)
if (strcmp(cl_lst[cl_NClasses]->name, "none") == 0)
if (sn == -1)
sn = cl_NClasses;
if (sn > 0) {
pt = cl_lst[sn];
for (i = sn; i > 0; i--)
cl_lst[i] = cl_lst[i - 1];
cl_lst[0] = pt;
}
i = 1;
while (i < cl_NClasses) {
if (strcmp(cl_lst[i]->name, "none") == 0)
for (sn = i; sn < (cl_NClasses - 1); sn++)
cl_lst[sn] = cl_lst[sn + 1];
i++;
}
cl_Classes = cl_lst;
} else {
cl_Classes = NULL;
cl_NClasses = -1;
}
}
static unsigned
is_in_env(char *class_name, char *paramname, char **paramvalue, int *noentry)
{
unsigned retval = 0;
char *test_class;
if (class_name && *class_name) {
if (!(*noentry) && *paramvalue == NULL) {
*paramvalue = getenv(paramname);
if (*paramvalue == NULL)
(*noentry)++;
}
if (!(*noentry)) {
int n;
n = strlen(class_name);
test_class = *paramvalue;
while (test_class = strstr(test_class, class_name)) {
if (isspace(*(test_class + n)) ||
*(test_class + n) == '\0') {
retval = 1;
break;
}
if (*(++test_class) == '\0')
break;
}
}
}
return (retval);
}
static unsigned
s_verify(char *class_name)
{
static int noentry;
static char *noverify;
if (class_name == NULL) {
noentry = 0;
noverify = NULL;
} else {
if (is_in_env(class_name, "PKG_SRC_NOVERIFY", &noverify,
&noentry))
return (NOVERIFY);
else
return (DEFAULT);
}
return (0);
}
void
cl_def_dverify(int idx)
{
if (cl_Classes && idx >= 0 && idx < cl_NClasses)
cl_Classes[idx]->dst_verify = DEFAULT;
}
static unsigned
d_verify(char *class_name)
{
static int noentry;
static char *qkverify;
if (class_name == NULL) {
noentry = 0;
qkverify = NULL;
} else {
if (is_in_env(class_name, "PKG_DST_QKVERIFY", &qkverify,
&noentry))
return (QKVERIFY);
else
return (DEFAULT);
}
return (0);
}
static unsigned
s_pathtype(char *class_name)
{
static int noentry;
static char *type_list;
if (class_name == NULL) {
noentry = 0;
type_list = NULL;
} else {
if (is_in_env(class_name, "PKG_CAS_PASSRELATIVE", &type_list,
&noentry))
return (REL_2_CAS);
else
return (DEFAULT);
}
return (0);
}