/** BEGIN COPYRIGHT BLOCK
* Copyright 2001 Sun Microsystems, Inc.
* Portions copyright 1999, 2001-2003 Netscape Communications Corporation.
* All rights reserved.
* END COPYRIGHT BLOCK **/
/*
* Description (aclerror.c)
*
* This module provides error-handling facilities for ACL-related
* errors.
*/
#include "base/systems.h"
#ifdef NSPR20
#include "prprf.h"
#else
#include "nspr/prprf.h"
#endif
#include
#include "libaccess/nserror.h"
#include "libaccess/nsautherr.h"
#include "libaccess/aclerror.h"
#include
#include
#define aclerrnomem XP_GetAdminStr(DBT_AclerrfmtAclerrnomem)
#define aclerropen XP_GetAdminStr(DBT_AclerrfmtAclerropen)
#define aclerrdupsym1 XP_GetAdminStr(DBT_AclerrfmtAclerrdupsym1)
#define aclerrdupsym3 XP_GetAdminStr(DBT_AclerrfmtAclerrdupsym3)
#define aclerrsyntax XP_GetAdminStr(DBT_AclerrfmtAclerrsyntax)
#define aclerrundef XP_GetAdminStr(DBT_AclerrfmtAclerrundef)
#define aclaclundef XP_GetAdminStr(DBT_AclerrfmtAclaclundef)
#define aclerradb XP_GetAdminStr(DBT_AclerrfmtAclerradb)
#define aclerrparse1 XP_GetAdminStr(DBT_AclerrfmtAclerrparse1)
#define aclerrparse2 XP_GetAdminStr(DBT_AclerrfmtAclerrparse2)
#define aclerrparse3 XP_GetAdminStr(DBT_AclerrfmtAclerrparse3)
#define aclerrnorlm XP_GetAdminStr(DBT_AclerrfmtAclerrnorlm)
#define unknownerr XP_GetAdminStr(DBT_AclerrfmtUnknownerr)
#define aclerrinternal XP_GetAdminStr(DBT_AclerrfmtAclerrinternal)
#define aclerrinval XP_GetAdminStr(DBT_AclerrfmtAclerrinval)
#define aclerrfail XP_GetAdminStr(DBT_AclerrfmtAclerrfail)
#define aclerrio XP_GetAdminStr(DBT_AclerrfmtAclerrio)
/*
* Description (aclErrorFmt)
*
* This function formats an ACL error message into a buffer provided
* by the caller. The ACL error information is passed in an error
* list structure. The caller can indicate how many error frames
* should be processed. A newline is inserted between messages for
* different error frames. The error frames on the error list are
* all freed, regardless of the maximum depth for traceback.
*
* Arguments:
*
* errp - error frame list pointer
* msgbuf - pointer to error message buffer
* maxlen - maximum length of generated message
* maxdepth - maximum depth for traceback
*/
void aclErrorFmt(NSErr_t * errp, char * msgbuf, int maxlen, int maxdepth)
{
NSEFrame_t * efp; /* error frame pointer */
int len; /* length of error message text */
int depth = 0; /* current depth */
msgbuf[0] = 0;
while ((efp = errp->err_first) != 0) {
/* Stop if the message buffer is full */
if (maxlen <= 0) break;
if (depth > 0) {
/* Put a newline & tab between error frame messages */
*msgbuf++ = '\n';
if (--maxlen <= 0) break;
*msgbuf++ = '\t';
if (--maxlen <= 0) break;
}
if (!strcmp(efp->ef_program, ACL_Program)) {
/* Identify the facility generating the error and the id number */
len = PR_snprintf(msgbuf, maxlen,
"[%s%d] ", efp->ef_program, efp->ef_errorid);
msgbuf += len;
maxlen -= len;
if (maxlen <= 0) break;
len = 0;
switch (efp->ef_retcode) {
case ACLERRFAIL:
case ACLERRNOMEM:
case ACLERRINTERNAL:
case ACLERRINVAL:
switch (efp->ef_errc) {
case 3:
PR_snprintf(msgbuf, maxlen, efp->ef_errv[0], efp->ef_errv[1], efp->ef_errv[2]);
break;
case 2:
PR_snprintf(msgbuf, maxlen, efp->ef_errv[0], efp->ef_errv[1]);
break;
case 1:
strncpy(msgbuf, efp->ef_errv[0], maxlen);
break;
default:
NS_ASSERT(0); /* don't break -- continue into case 0 */
case 0:
switch (efp->ef_retcode) {
case ACLERRFAIL:
strncpy(msgbuf, XP_GetAdminStr(DBT_AclerrfmtAclerrfail), maxlen);
break;
case ACLERRNOMEM:
strncpy(msgbuf, aclerrnomem, maxlen);
break;
case ACLERRINTERNAL:
strncpy(msgbuf, aclerrinternal, maxlen);
break;
case ACLERRINVAL:
strncpy(msgbuf, aclerrinval, maxlen);
break;
}
break;
}
msgbuf[maxlen-1] = '\0';
len = strlen(msgbuf);
break;
case ACLERROPEN:
/* File open error: filename, system_errmsg */
if (efp->ef_errc == 2) {
len = PR_snprintf(msgbuf, maxlen, aclerropen,
efp->ef_errv[0], efp->ef_errv[1]);
}
break;
case ACLERRDUPSYM:
/* Duplicate symbol */
if (efp->ef_errc == 1) {
/* Duplicate symbol: filename, line#, symbol */
len = PR_snprintf(msgbuf, maxlen, aclerrdupsym1,
efp->ef_errv[0]);
}
else if (efp->ef_errc == 3) {
/* Duplicate symbol: symbol */
len = PR_snprintf(msgbuf, maxlen, aclerrdupsym3,
efp->ef_errv[0], efp->ef_errv[1],
efp->ef_errv[2]);
}
break;
case ACLERRSYNTAX:
if (efp->ef_errc == 2) {
/* Syntax error: filename, line# */
len = PR_snprintf(msgbuf, maxlen, aclerrsyntax,
efp->ef_errv[0], efp->ef_errv[1]);
}
break;
case ACLERRUNDEF:
if (efp->ef_errorid == ACLERR3800) {
/* Undefined symbol: acl, method/database name */
len = PR_snprintf(msgbuf, maxlen, aclaclundef,
efp->ef_errv[0], efp->ef_errv[1],
efp->ef_errv[2]);
}
else if (efp->ef_errc == 3) {
/* Undefined symbol: filename, line#, symbol */
len = PR_snprintf(msgbuf, maxlen, aclerrundef,
efp->ef_errv[0], efp->ef_errv[1],
efp->ef_errv[2]);
}
break;
case ACLERRADB:
if (efp->ef_errc == 2) {
/* Authentication database error: DB name, symbol */
len = PR_snprintf(msgbuf, maxlen, aclerradb,
efp->ef_errv[0], efp->ef_errv[1]);
}
break;
case ACLERRPARSE:
if (efp->ef_errc == 2) {
/* Parse error: filename, line# */
len = PR_snprintf(msgbuf, maxlen, aclerrparse2,
efp->ef_errv[0], efp->ef_errv[1]);
}
else if (efp->ef_errc == 3) {
/* Parse error: filename, line#, token */
len = PR_snprintf(msgbuf, maxlen, aclerrparse3,
efp->ef_errv[0], efp->ef_errv[1],
efp->ef_errv[2]);
}
else if (efp->ef_errc == 1) {
/* Parse error: line or pointer */
len = PR_snprintf(msgbuf, maxlen, aclerrparse1,
efp->ef_errv[0]);
}
break;
case ACLERRNORLM:
if (efp->ef_errc == 1) {
/* No realm: name */
len = PR_snprintf(msgbuf, maxlen, aclerrnorlm,
efp->ef_errv[0]);
}
break;
case ACLERRIO:
if (efp->ef_errc == 2) {
len = PR_snprintf(msgbuf, maxlen, aclerrio,
efp->ef_errv[0], efp->ef_errv[1]);
}
break;
default:
len = PR_snprintf(msgbuf, maxlen, unknownerr, efp->ef_retcode);
break;
}
}
else if (!strcmp(efp->ef_program, NSAuth_Program)) {
nsadbErrorFmt(errp, msgbuf, maxlen, maxdepth - depth);
}
else {
len = PR_snprintf(msgbuf, maxlen, unknownerr, efp->ef_retcode);
}
msgbuf += len;
maxlen -= len;
/* Free this frame */
nserrFFree(errp, efp);
if (++depth >= maxdepth) break;
}
/* Free any remaining error frames */
nserrDispose(errp);
}