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