aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/lib/libldapschema/lerror.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/libldapschema/lerror.c')
-rw-r--r--lib/libldapschema/lerror.c121
1 files changed, 66 insertions, 55 deletions
diff --git a/lib/libldapschema/lerror.c b/lib/libldapschema/lerror.c
index 0cef955..45cac7b 100644
--- a/lib/libldapschema/lerror.c
+++ b/lib/libldapschema/lerror.c
@@ -51,6 +51,7 @@
51#include <stdlib.h> 51#include <stdlib.h>
52 52
53#include "lmemory.h" 53#include "lmemory.h"
54#include "lsort.h"
54 55
55 56
56///////////////// 57/////////////////
@@ -102,73 +103,47 @@ int ldapschema_errno( LDAPSchema * lsd )
102/// @see ldapschema_free, ldapschema_initialize, ldapschema_err2string 103/// @see ldapschema_free, ldapschema_initialize, ldapschema_err2string
103int ldapschema_schema_err(LDAPSchema * lsd, LDAPSchemaModel * mod, const char * fmt, ... ) 104int ldapschema_schema_err(LDAPSchema * lsd, LDAPSchemaModel * mod, const char * fmt, ... )
104{ 105{
105 char buff[512]; 106 char buff[512];
106 va_list args; 107 va_list args;
107 char * str; 108 char * str;
108 const char * type; 109 char ** tmplist;
109 size_t len; 110 char *** listp;
111 int err;
110 112
111 assert(lsd != NULL); 113 assert(lsd != NULL);
112 assert(fmt != NULL); 114 assert(fmt != NULL);
113 115
114 116 // determines which list
115 // initialize errors if first error 117 listp = &lsd->schema_errs;
116 if (!(lsd->schema_errs))
117 {
118 if ((lsd->schema_errs = malloc(sizeof(char *)*2)) == NULL)
119 return(lsd->errcode = LDAPSCHEMA_NO_MEMORY);
120 lsd->schema_errs[0] = NULL;
121 };
122
123 // determine object type
124 if ((mod)) 118 if ((mod))
125 { 119 listp = &mod->errors;
126 switch(mod->type)
127 {
128 case LDAPSCHEMA_ATTRIBUTETYPE: type = "attributeType"; break;
129 case LDAPSCHEMA_OBJECTCLASS: type = "objectClass"; break;
130 case LDAPSCHEMA_SYNTAX: type = "ldapSyntax"; break;
131 case LDAPSCHEMA_MATCHINGRULE: type = "matchingRules"; break;
132 default: type = "unknown"; break;
133 };
134 } else
135 {
136 type = "";
137 };
138 120
139 // save definition if first error for object 121 // initialize errors if first error
140 if (lsd->schema_errs_cur != mod) 122 if (!(*listp))
141 { 123 {
142 lsd->schema_errs_cnt++; 124 if ((*listp = malloc(sizeof(char *)*2)) == NULL)
143 snprintf(buff, sizeof(buff), "%s %zu: ", type, lsd->schema_errs_cnt);
144 len = strlen(buff);
145 snprintf(&buff[len], sizeof(buff)-len, "definition: %s", mod->definition);
146 if ((str = strdup(buff)) == NULL)
147 return(lsd->errcode = LDAPSCHEMA_NO_MEMORY);
148 if ((lsd->schema_errs = ldapschema_value_add(lsd->schema_errs, str, NULL)) == NULL)
149 {
150 free(str);
151 return(lsd->errcode = LDAPSCHEMA_NO_MEMORY); 125 return(lsd->errcode = LDAPSCHEMA_NO_MEMORY);
152 }; 126 bzero(*listp, sizeof(char *)*2);
153 }; 127 };
154 128
155 // create error header
156 snprintf(buff, sizeof(buff), "%s %zu: ", type, lsd->schema_errs_cnt);
157 len = strlen(buff);
158
159 // process error message 129 // process error message
160 va_start(args, fmt); 130 va_start(args, fmt);
161 vsnprintf(&buff[len], sizeof(buff)-len, fmt, args); 131 vsnprintf(buff, sizeof(buff), fmt, args);
162 va_end(args); 132 va_end(args);
163 133
164 // save error 134 // save error
165 if ((str = strdup(buff)) == NULL) 135 if ((str = strdup(buff)) == NULL)
166 return(lsd->errcode = LDAPSCHEMA_NO_MEMORY); 136 return(lsd->errcode = LDAPSCHEMA_NO_MEMORY);
167 if ((lsd->schema_errs = ldapschema_value_add(lsd->schema_errs, str, NULL)) == NULL) 137 if ((tmplist = ldapschema_value_add(*listp, str, NULL)) == NULL)
168 { 138 {
169 free(str); 139 free(str);
170 return(lsd->errcode = LDAPSCHEMA_NO_MEMORY); 140 return(lsd->errcode = LDAPSCHEMA_NO_MEMORY);
171 }; 141 };
142 *listp = tmplist;
143
144 // adds object to error list
145 if ((err = ldapschema_insert(lsd, (void ***)&lsd->objerrs, &lsd->objerrs_len, mod, ldapschema_compar_models)) > 0)
146 return(lsd->errcode);
172 147
173 // set error code 148 // set error code
174 lsd->errcode = LDAPSCHEMA_SCHEMA_ERROR; 149 lsd->errcode = LDAPSCHEMA_SCHEMA_ERROR;
@@ -179,28 +154,64 @@ int ldapschema_schema_err(LDAPSchema * lsd, LDAPSchemaModel * mod, const char *
179 154
180char ** ldapschema_schema_errors(LDAPSchema * lsd ) 155char ** ldapschema_schema_errors(LDAPSchema * lsd )
181{ 156{
182 char ** errs; 157 int len;
183 size_t len; 158 size_t x;
184 size_t pos; 159 size_t y;
160 char buff[256];
161 char * str;
162 char ** errs;
163 char ** tmperrs;
164 LDAPSchemaModel * mod;
185 165
186 assert(lsd != NULL); 166 assert(lsd != NULL);
187 167
188 if (!(lsd->schema_errs)) 168 // if not errors, exit
169 if ( (!(lsd->schema_errs)) && (!(lsd->objerrs)) )
189 return(NULL); 170 return(NULL);
190 171
191 for(len = 0; ((lsd->schema_errs[len])); len++); 172 // initialize list
192 if ((errs = malloc(sizeof(char *)*(len+1))) == NULL) 173 if ((errs = malloc(sizeof(char *)*2)) == NULL)
193 return(NULL); 174 return(NULL);
175 errs[0] = NULL;
176 len = 0;
194 177
195 for(pos = 0; pos < len; pos++) 178 // copy server errors
179 for(x = 0; (((lsd->schema_errs)) && ((lsd->schema_errs[x]))); x++)
196 { 180 {
197 if ((errs[pos] = strdup(lsd->schema_errs[pos])) == NULL) 181 snprintf(buff, sizeof(buff), "server: %s", lsd->schema_errs[x]);
182 if ((str = strdup(buff)) == NULL)
183 {
184 ldapschema_value_free(errs);
185 return(NULL);
186 };
187 if ((tmperrs = ldapschema_value_add(errs, str, &len)) == NULL)
198 { 188 {
199 ldapschema_value_free(errs); 189 ldapschema_value_free(errs);
200 return(NULL); 190 return(NULL);
201 }; 191 };
192 errs = tmperrs;
193 };
194
195 // loop through objects and copy errors
196 for(x = 0; x < lsd->objerrs_len; x++)
197 {
198 mod = lsd->objerrs[x].model;
199 for(y = 0; ((mod->errors[y])); y++)
200 {
201 snprintf(buff, sizeof(buff), "%s: %s: %s", ldapschema_type_name(mod->type), mod->oid, mod->errors[y]);
202 if ((str = strdup(buff)) == NULL)
203 {
204 ldapschema_value_free(errs);
205 return(NULL);
206 };
207 if ((tmperrs = ldapschema_value_add(errs, str, &len)) == NULL)
208 {
209 ldapschema_value_free(errs);
210 return(NULL);
211 };
212 errs = tmperrs;
213 };
202 }; 214 };
203 errs[pos] = NULL;
204 215
205 return(errs); 216 return(errs);
206} 217}