#include <stdio.h>
#include <limits.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <sys/types.h>
#include <locale.h>
#include <libintl.h>
#include <assert.h>
#include "libinst.h"
#include "messages.h"
static int
collectError(int *r_numZones, char **r_zoneNames, char *a_packageName,
depckl_t *a_dck, int a_depIndex, depckErrorRecord_t *a_eir,
int a_errIndex);
int
depchkReportErrors(depckl_t *a_dck)
{
char *packageName;
char *zonenames;
char msgbuf[4096];
int err;
int i;
int numzones = 0;
assert(a_dck != (depckl_t *)NULL);
echoDebug(DBG_DEPCHK_ENTRY);
zonenames = (char *)NULL;
for (i = 0; a_dck[i].name != (char *)NULL; i++) {
int j;
depckError_t *erc;
if (zonenames != (char *)NULL) {
free(zonenames);
zonenames = (char *)NULL;
}
erc = a_dck[i].record;
if (erc->er_numEntries == 0) {
continue;
}
for (j = 0; j < erc->er_numEntries; j++) {
int k;
depckErrorRecord_t *eir;
if (zonenames != (char *)NULL) {
free(zonenames);
zonenames = (char *)NULL;
}
eir = &erc->er_theEntries[j];
packageName = eir->ier_packageName;
for (k = 0; k < eir->ier_numZones; k++) {
int err;
err = collectError(&numzones, &zonenames,
packageName, a_dck, i, eir, k);
if (err != 0) {
if (zonenames != (char *)NULL) {
free(zonenames);
zonenames = (char *)NULL;
}
return (err);
}
}
if (a_dck[i].ignore_values == (char *)NULL) {
continue;
}
if (a_dck[i].err_msg == (char **)NULL) {
(void) snprintf(msgbuf, sizeof (msgbuf),
ERR_DEPENDENCY_IGNORED, a_dck[i].name,
packageName,
numzones == 1 ? "zone" : "zones",
zonenames ? zonenames : "?");
} else {
(void) snprintf(msgbuf, sizeof (msgbuf),
*a_dck[i].err_msg, "package",
packageName,
numzones == 1 ? "zone" : "zones",
zonenames ? zonenames : "??");
}
if (a_dck[i].depcklFunc != NULL) {
err = (a_dck[i].depcklFunc)(msgbuf,
packageName);
echoDebug(DBG_DEPCHK_REPORT_ERROR,
a_dck[i].ignore_values, err,
packageName, msgbuf);
if (err != 0) {
if (zonenames != (char *)NULL) {
free(zonenames);
zonenames = (char *)NULL;
}
return (err);
}
} else {
echoDebug(DBG_DEPCHK_IGNORE_ERROR,
a_dck[i].ignore_values, packageName,
msgbuf);
ptext(stderr, "\\n%s", msgbuf);
}
}
}
if (zonenames != (char *)NULL) {
free(zonenames);
zonenames = (char *)NULL;
}
return (0);
}
void
depchkRecordError(depckError_t *a_erc, char *a_pkginst,
char *a_zoneName, char *a_value)
{
depckErrorRecord_t *erc;
int i;
if (a_erc->er_numEntries == 0) {
depckErrorRecord_t *eir;
eir = (depckErrorRecord_t *)calloc(1,
sizeof (depckErrorRecord_t));
eir->ier_packageName = strdup(a_pkginst);
eir->ier_numZones = 1;
eir->ier_zones = (char **)calloc(1, sizeof (char **));
(eir->ier_zones)[eir->ier_numZones-1] = strdup(a_zoneName);
eir->ier_values = (char **)calloc(1, sizeof (char *));
(eir->ier_values)[eir->ier_numZones-1] = strdup(a_value);
a_erc->er_numEntries = 1;
a_erc->er_theEntries = eir;
echoDebug(DBG_DEPCHK_RECORD_ERROR, (long)a_erc, a_pkginst,
a_zoneName, a_value);
return;
}
for (i = 0; i < a_erc->er_numEntries; i++) {
erc = &a_erc->er_theEntries[i];
if (strcmp(erc->ier_packageName, a_pkginst) != 0) {
continue;
}
echoDebug(DBG_DEPCHK_RECORD_ZERROR, (long)a_erc, a_zoneName,
a_value, erc->ier_packageName, erc->ier_numZones,
erc->ier_zones[0]);
erc->ier_numZones++;
erc->ier_zones = (char **)realloc(erc->ier_zones,
sizeof (char **)*erc->ier_numZones);
(erc->ier_zones)[erc->ier_numZones-1] = strdup(a_zoneName);
erc->ier_values = (char **)realloc(erc->ier_values,
sizeof (char **)*erc->ier_numZones);
(erc->ier_values)[erc->ier_numZones-1] = strdup(a_value);
return;
}
echoDebug(DBG_DEPCHK_RECORD_PERROR, (long)a_erc,
a_erc->er_numEntries, a_pkginst, a_zoneName, a_value);
a_erc->er_numEntries++;
a_erc->er_theEntries = realloc(a_erc->er_theEntries,
sizeof (depckErrorRecord_t)*a_erc->er_numEntries);
erc = &a_erc->er_theEntries[a_erc->er_numEntries-1];
erc->ier_packageName = strdup(a_pkginst);
erc->ier_numZones = 1;
erc->ier_zones = (char **)calloc(1, sizeof (char *));
(erc->ier_zones)[erc->ier_numZones-1] = strdup(a_zoneName);
erc->ier_values = (char **)calloc(1, sizeof (char *));
(erc->ier_values)[erc->ier_numZones-1] = strdup(a_value);
}
static int
collectError(int *r_numZones, char **r_zoneNames, char *a_packageName,
depckl_t *a_dck, int a_depIndex, depckErrorRecord_t *a_eir,
int a_errIndex)
{
char msgbuf[4096];
char *zn = *r_zoneNames;
if (a_dck[a_depIndex].ignore_values == (char *)NULL) {
if (a_dck[a_depIndex].err_msg == (char **)NULL) {
(void) snprintf(msgbuf, sizeof (msgbuf),
ERR_DEPENDENCY_REPORT, a_eir->ier_values[a_errIndex],
"package", a_packageName,
"zone", a_eir->ier_zones[a_errIndex]);
} else {
(void) snprintf(msgbuf, sizeof (msgbuf),
*a_dck[a_depIndex].err_msg,
a_eir->ier_values[a_errIndex],
"package", a_packageName,
"zone", a_eir->ier_zones[a_errIndex]);
}
if (a_dck[a_depIndex].depcklFunc != NULL) {
int err;
err = (a_dck[a_depIndex].depcklFunc)(msgbuf,
a_packageName);
echoDebug(DBG_DEPCHK_COLLECT_ERROR, err, a_packageName,
msgbuf);
if (err != 0) {
return (err);
}
} else {
echoDebug(DBG_DEPCHK_COLLECT_IGNORE, a_packageName,
msgbuf);
ptext(stderr, "\\n%s", msgbuf);
}
return (0);
}
*r_numZones = (*r_numZones)+1;
if (zn == (char *)NULL) {
zn = strdup(a_eir->ier_zones[a_errIndex]);
} else {
char *p;
int len = strlen(zn)+strlen(a_eir->ier_zones[a_errIndex])+3;
p = calloc(1, len);
(void) snprintf(p, len, "%s, %s", zn,
a_eir->ier_zones[a_errIndex]);
free(zn);
zn = p;
}
*r_zoneNames = zn;
return (0);
}