1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
|
/** BEGIN COPYRIGHT BLOCK
* Copyright 2001 Sun Microsystems, Inc.
* Portions copyright 1999, 2001-2003 Netscape Communications Corporation.
* All rights reserved.
* END COPYRIGHT BLOCK **/
/*
* Description (nsautherr.c)
*
* This module provides facilities for handling authentication
* errors.
*/
#include <string.h>
#include "base/systems.h"
#include "prprf.h"
#include "libaccess/nserror.h"
#include "libaccess/nsautherr.h"
/* Error message formats XXX internationalize XXX */
static char * nsaerrnomem = "insufficient dynamic memory";
static char * nsaerrinval = "invalid argument";
static char * nsaerropen = "error opening %s";
static char * nsaerrmkdir = "error creating %s";
static char * nsaerrname = "%s not found in database %s";
static char * unknownerr = "error code %d";
/*
* Description (nsadbErrorFmt)
*
* This function formats an authentication error message into a
* buffer provided by the caller. The authentication 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.
*
* Arguments:
*
* errp - error frame list pointer
* msgbuf - pointer to error message buffer
* maxlen - maximum length of generated message
* maxdepth - maximum depth for traceback
*/
NSAPI_PUBLIC void nsadbErrorFmt(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;
for (efp = errp->err_first; efp != 0; efp = efp->ef_next) {
/* Stop if the message buffer is full */
if (maxlen <= 0) break;
if (depth > 0) {
/* Put a newline between error frame messages */
*msgbuf++ = '\n';
if (--maxlen <= 0) break;
}
/* 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;
if (!strcmp(efp->ef_program, NSAuth_Program)) {
switch (efp->ef_retcode) {
case NSAERRNOMEM:
strncpy(msgbuf, nsaerrnomem, maxlen);
len = strlen(nsaerrnomem);
break;
case NSAERRINVAL:
/* Invalid function argument error: */
strncpy(msgbuf, nsaerrinval, maxlen);
len = strlen(nsaerrinval);
break;
case NSAERROPEN:
/* File open error: filename */
if (efp->ef_errc == 1) {
len = PR_snprintf(msgbuf, maxlen, nsaerropen,
efp->ef_errv[0], efp->ef_errv[1]);
}
break;
case NSAERRMKDIR:
/* error creating database directory: database name */
if (efp->ef_errc == 1) {
len = PR_snprintf(msgbuf, maxlen, nsaerrmkdir,
efp->ef_errv[0]);
}
break;
case NSAERRNAME:
/* user or group name not found: database, name */
if (efp->ef_errc == 2) {
len = PR_snprintf(msgbuf, maxlen, nsaerrname,
efp->ef_errv[0], efp->ef_errv[1]);
}
break;
default:
len = PR_snprintf(msgbuf, maxlen, unknownerr, efp->ef_retcode);
break;
}
}
else {
len = PR_snprintf(msgbuf, maxlen, unknownerr, efp->ef_retcode);
}
msgbuf += len;
maxlen -= len;
if (++depth >= maxdepth) break;
}
}
|