summaryrefslogtreecommitdiffstats
path: root/lib/libaccess/aclerror.cpp
diff options
context:
space:
mode:
authorcvsadm <cvsadm>2005-01-21 00:44:34 +0000
committercvsadm <cvsadm>2005-01-21 00:44:34 +0000
commitb2093e3016027d6b5cf06b3f91f30769bfc099e2 (patch)
treecf58939393a9032182c4fbc4441164a9456e82f8 /lib/libaccess/aclerror.cpp
downloadds-ldapserver7x.tar.gz
ds-ldapserver7x.tar.xz
ds-ldapserver7x.zip
Moving NSCP Directory Server from DirectoryBranch to TRUNK, initial drop. (foxworth)ldapserver7x
Diffstat (limited to 'lib/libaccess/aclerror.cpp')
-rw-r--r--lib/libaccess/aclerror.cpp246
1 files changed, 246 insertions, 0 deletions
diff --git a/lib/libaccess/aclerror.cpp b/lib/libaccess/aclerror.cpp
new file mode 100644
index 00000000..2cbf2874
--- /dev/null
+++ b/lib/libaccess/aclerror.cpp
@@ -0,0 +1,246 @@
+/** 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 <base/nsassert.h>
+#include "libaccess/nserror.h"
+#include "libaccess/nsautherr.h"
+#include "libaccess/aclerror.h"
+#include <libaccess/dbtlibaccess.h>
+#include <libaccess/aclerror.h>
+
+#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);
+}