]> git.sur5r.net Git - openldap/blob - servers/ldapd/error.c
a93590fc3e93772797ccfc3bf0c2dde75ab78996
[openldap] / servers / ldapd / error.c
1 /*
2  * Copyright (c) 1990 Regents of the University of Michigan.
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms are permitted
6  * provided that this notice is preserved and that due credit is given
7  * to the University of Michigan at Ann Arbor. The name of the University
8  * may not be used to endorse or promote products derived from this
9  * software without specific prior written permission. This software
10  * is provided ``as is'' without express or implied warranty.
11  */
12
13 #include "portable.h"
14
15 #include <stdio.h>
16
17 #include <ac/ctype.h>
18 #include <ac/socket.h>
19
20 #include <quipu/ds_error.h>
21 #include <quipu/attrvalue.h>
22 #include <quipu/name.h>
23 #include <quipu/commonarg.h>
24
25 #include "lber.h"
26 #include "ldap.h"
27 #include "ldap_log.h"
28 #include "common.h"                     /* get ldap_dn_print() */
29
30 void
31 print_error( struct DSError *e )
32 {
33         PS      ps;
34
35         if ( (ps = ps_alloc( std_open )) == NULLPS ) {
36                 fprintf( stderr, "error in ps_alloc\n" );
37                 return;
38         }
39         if ( std_setup( ps, stderr ) == NOTOK ) {
40                 fprintf( stderr, "error in std_setup = %d", ps->ps_errno );
41                 return;
42         }
43
44         ds_error( ps, e );
45
46         ps_flush( ps );
47         ps_free( ps );
48 }
49
50 int
51 x500err2ldaperr( struct DSError *e, char **matched )
52 {
53         int             ldaperr = LDAP_OTHER;
54         static PS       ps;
55
56         Debug( LDAP_DEBUG_TRACE, "x500err2ldaperr\n", 0, 0, 0 );
57
58         *matched = NULL;
59         switch ( e->dse_type ) {
60         case DSE_ATTRIBUTEERROR:
61 #if ISODEPACKAGE == IC || ISODEPACKAGE == XT
62                 switch ( e->ERR_ATTRIBUTE.DSE_at_plist->DSE_at_what ) {
63 #else
64                 switch ( e->ERR_ATTRIBUTE.DSE_at_plist.DSE_at_what ) {
65 #endif
66                 case DSE_AT_NOSUCHATTRIBUTE:
67                         ldaperr = LDAP_NO_SUCH_ATTRIBUTE;
68                         break;
69                 case DSE_AT_INVALIDATTRIBUTESYNTAX:
70                         ldaperr = LDAP_INVALID_SYNTAX;
71                         break;
72                 case DSE_AT_UNDEFINEDATTRIBUTETYPE:
73                         ldaperr = LDAP_UNDEFINED_TYPE;
74                         break;
75                 case DSE_AT_INAPPROPRIATEMATCHING:
76                         ldaperr = LDAP_INAPPROPRIATE_MATCHING;
77                         break;
78                 case DSE_AT_CONSTRAINTVIOLATION:
79                         ldaperr = LDAP_CONSTRAINT_VIOLATION;
80                         break;
81                 case DSE_AT_TYPEORVALUEEXISTS:
82                         ldaperr = LDAP_TYPE_OR_VALUE_EXISTS;
83                         break;
84                 default:
85                         break;
86                 }
87                 break;
88
89         case DSE_NAMEERROR:
90                 switch( e->ERR_NAME.DSE_na_problem ) {
91                 case DSE_NA_NOSUCHOBJECT:
92                         ldaperr = LDAP_NO_SUCH_OBJECT;
93                         break;
94                 case DSE_NA_ALIASPROBLEM:
95                         ldaperr = LDAP_ALIAS_PROBLEM;
96                         break;
97                 case DSE_NA_INVALIDATTRIBUTESYNTAX:
98                         ldaperr = LDAP_INVALID_SYNTAX;
99                         break;
100                 case DSE_NA_ALIASDEREFERENCE:
101                         ldaperr = LDAP_ALIAS_DEREF_PROBLEM;
102                         break;
103                 default:
104                         break;
105                 }
106
107                 if ( e->ERR_NAME.DSE_na_matched == NULLDN ) {
108                         break;
109                 }
110
111                 if ( ps == NULL ) {
112                         ps = ps_alloc( str_open );
113                         str_setup( ps, NULLCP, 0, 0 );
114                 }
115                 ldap_dn_print( ps, e->ERR_NAME.DSE_na_matched, NULLDN, EDBOUT );
116                 *ps->ps_ptr = '\0';
117
118                 *matched = (char *) strdup( ps->ps_base );
119
120                 ps->ps_ptr = ps->ps_base;
121                 ps->ps_cnt = ps->ps_bufsiz;
122                 break;
123
124         case DSE_SERVICEERROR:
125                 switch( e->ERR_SERVICE.DSE_sv_problem ) {
126                 case DSE_SV_BUSY:
127                         ldaperr = LDAP_BUSY;
128                         break;
129                 case DSE_SV_UNAVAILABLE:
130                         ldaperr = LDAP_UNAVAILABLE;
131                         break;
132                 case DSE_SV_UNWILLINGTOPERFORM:
133                         ldaperr = LDAP_UNWILLING_TO_PERFORM;
134                         break;
135                 case DSE_SV_TIMELIMITEXCEEDED:
136                         ldaperr = LDAP_TIMELIMIT_EXCEEDED;
137                         break;
138                 case DSE_SV_ADMINLIMITEXCEEDED:
139                         ldaperr = LDAP_SIZELIMIT_EXCEEDED;
140                         break;
141                 case DSE_SV_LOOPDETECT:
142                         ldaperr = LDAP_LOOP_DETECT;
143                         break;
144                 default:
145                         break;
146                 }
147                 break;
148
149         case DSE_SECURITYERROR:
150                 switch( e->ERR_SECURITY.DSE_sc_problem ) {
151                 case DSE_SC_AUTHENTICATION:
152                         ldaperr = LDAP_INAPPROPRIATE_AUTH;
153                         break;
154                 case DSE_SC_INVALIDCREDENTIALS:
155                         ldaperr = LDAP_INVALID_CREDENTIALS;
156                         break;
157                 case DSE_SC_ACCESSRIGHTS:
158                         ldaperr = LDAP_INSUFFICIENT_ACCESS;
159                         break;
160                 default:
161                         break;
162                 }
163                 break;
164
165         case DSE_UPDATEERROR:
166                 switch( e->ERR_UPDATE.DSE_up_problem ) {
167                 case DSE_UP_NAMINGVIOLATION:
168                         ldaperr = LDAP_NAMING_VIOLATION;
169                         break;
170                 case DSE_UP_OBJECTCLASSVIOLATION:
171                         ldaperr = LDAP_OBJECT_CLASS_VIOLATION;
172                         break;
173                 case DSE_UP_NOTONNONLEAF:
174                         ldaperr = LDAP_NOT_ALLOWED_ON_NONLEAF;
175                         break;
176                 case DSE_UP_NOTONRDN:
177                         ldaperr = LDAP_NOT_ALLOWED_ON_RDN;
178                         break;
179                 case DSE_UP_ALREADYEXISTS:
180                         ldaperr = LDAP_ALREADY_EXISTS;
181                         break;
182                 case DSE_UP_NOOBJECTCLASSMODS:
183                         ldaperr = LDAP_NO_OBJECT_CLASS_MODS;
184                         break;
185                 default:
186                         break;
187                 }
188                 break;
189
190         default:
191                 break;
192         }
193
194         return( ldaperr );
195 }