diff options
Diffstat (limited to 'lib/libldapschema/lerror.c')
| -rw-r--r-- | lib/libldapschema/lerror.c | 121 |
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 |
| 103 | int ldapschema_schema_err(LDAPSchema * lsd, LDAPSchemaModel * mod, const char * fmt, ... ) | 104 | int 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 | ||
| 180 | char ** ldapschema_schema_errors(LDAPSchema * lsd ) | 155 | char ** 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 | } |
