aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorDavid M. Syzdek <david@syzdek.net>2019-11-26 15:26:15 -0900
committerDavid M. Syzdek <david@syzdek.net>2019-11-26 15:26:15 -0900
commitc55bc5eac7853918aa13d5a6d0b4b0d6806da8ca (patch)
tree4dd10be923b80af48664d2901bc9fd63f402bf34
parent17e5c73f2cbd99b9b8bce1dde130acce514f28cc (diff)
downloadldap-utils-c55bc5eac7853918aa13d5a6d0b4b0d6806da8ca.tar.gz
ldap-utils-c55bc5eac7853918aa13d5a6d0b4b0d6806da8ca.tar.bz2
ldap-utils-c55bc5eac7853918aa13d5a6d0b4b0d6806da8ca.tar.xz
ldap-utils-c55bc5eac7853918aa13d5a6d0b4b0d6806da8ca.zip
libldapschema: adding ldapschema_model_register()
-rw-r--r--lib/libldapschema/lmemory.c130
-rw-r--r--lib/libldapschema/lmemory.h5
2 files changed, 135 insertions, 0 deletions
diff --git a/lib/libldapschema/lmemory.c b/lib/libldapschema/lmemory.c
index 839286e..6a54ff5 100644
--- a/lib/libldapschema/lmemory.c
+++ b/lib/libldapschema/lmemory.c
@@ -50,6 +50,8 @@
50#include <stdlib.h> 50#include <stdlib.h>
51 51
52#include "lspec.h" 52#include "lspec.h"
53#include "lsort.h"
54#include "lerror.h"
53 55
54 56
55///////////////// 57/////////////////
@@ -454,6 +456,134 @@ void ldapschema_model_free(LDAPSchemaModel * model)
454} 456}
455 457
456 458
459int ldapschema_model_register(LDAPSchema * lsd, LDAPSchemaModel * mod)
460{
461 int err;
462 size_t names_len;
463 size_t idx;
464 size_t * list_lenp;
465 char ** names;
466 const char * spec_name;
467 const char * desc;
468 LDAPSchemaAlias * alias;
469 LDAPSchemaAlias *** listp;
470 LDAPSchemaPointer objptr;
471
472 assert(lsd != NULL);
473 assert(mod != NULL);
474
475 desc = NULL;
476 names = NULL;
477 names_len = 0;
478 spec_name = NULL;
479 objptr.model = mod;
480
481 // determines model specific list and search keys
482 switch(mod->type)
483 {
484 case LDAPSCHEMA_ATTRIBUTETYPE:
485 listp = &lsd->attrs;
486 list_lenp = &lsd->attrs_len;
487 names = objptr.attributetype->names;
488 names_len = objptr.attributetype->names_len;
489 spec_name = ((mod->spec)) ? mod->spec->name : NULL;
490 break;
491
492 case LDAPSCHEMA_SYNTAX:
493 listp = &lsd->syntaxes;
494 list_lenp = &lsd->syntaxes_len;
495 desc = mod->desc;
496 break;
497
498 case LDAPSCHEMA_MATCHINGRULE:
499 listp = &lsd->mtchngrls;
500 list_lenp = &lsd->mtchngrls_len;
501 names = objptr.matchingrule->names;
502 names_len = objptr.matchingrule->names_len;
503 spec_name = ((mod->spec)) ? mod->spec->name : NULL;
504 break;
505
506 case LDAPSCHEMA_OBJECTCLASS:
507 listp = &lsd->objclses;
508 list_lenp = &lsd->objclses_len;
509 names = objptr.objectclass->names;
510 names_len = objptr.objectclass->names_len;
511 spec_name = ((mod->spec)) ? mod->spec->name : NULL;
512 break;
513
514 default:
515 assert(0);
516 return(0);
517 };
518
519 // adds model to OID list
520 if ((err = ldapschema_insert(lsd, (void ***)&lsd->oids, &lsd->oids_len, mod, ldapschema_compar_models)) > 0)
521 return(err);
522 if (err == -1)
523 {
524 ldapschema_schema_err(lsd, mod, "server defines duplicate OID '%s'", mod->oid);
525 if ((err = ldapschema_append(lsd,(void ***)&lsd->dups, &lsd->dups_len, mod)) != LDAP_SUCCESS)
526 return(err);
527 };
528
529 // adds model into model specific list using OID
530 if ((alias = malloc(sizeof(LDAPSchemaAlias *))) == NULL)
531 return(lsd->errcode = LDAPSCHEMA_NO_MEMORY);
532 alias->alias = mod->oid;
533 alias->model = mod;
534 if ((err = ldapschema_insert(lsd, (void ***)listp, list_lenp, alias, ldapschema_compar_aliases)) > 0)
535 {
536 free(alias);
537 return(err);
538 };
539 if (err == -1)
540 {
541 ldapschema_schema_err(lsd, mod, " model with duplicate oid '%s' found", mod->oid);
542 free(alias);
543 };
544
545 // adds model into model specific list using desc
546 if ((desc))
547 {
548 if ((alias = malloc(sizeof(LDAPSchemaAlias *))) == NULL)
549 return(lsd->errcode = LDAPSCHEMA_NO_MEMORY);
550 alias->alias = desc;
551 alias->model = mod;
552 if ((err = ldapschema_insert(lsd, (void ***)listp, list_lenp, alias, ldapschema_compar_aliases)) > 0)
553 {
554 free(alias);
555 return(err);
556 };
557 if (err == -1)
558 {
559 ldapschema_schema_err(lsd, mod, " model with duplicate desc '%s' found", mod->oid);
560 free(alias);
561 };
562 };
563
564 // adds model into model specific list using names
565 for(idx = 0; (idx < names_len); idx++)
566 {
567 if ((alias = malloc(sizeof(LDAPSchemaAlias *))) == NULL)
568 return(lsd->errcode = LDAPSCHEMA_NO_MEMORY);
569 alias->alias = names[idx];
570 alias->model = mod;
571 if ((err = ldapschema_insert(lsd, (void ***)listp, list_lenp, alias, ldapschema_compar_aliases)) > 0)
572 {
573 free(alias);
574 return(err);
575 };
576 if (err == -1)
577 {
578 ldapschema_schema_err(lsd, mod, " object with duplicate name '%s' found", names[idx]);
579 free(alias);
580 };
581 };
582
583 return(0);
584}
585
586
457void ldapschema_object_free(LDAPSchemaModel * obj) 587void ldapschema_object_free(LDAPSchemaModel * obj)
458{ 588{
459 size_t ext; 589 size_t ext;
diff --git a/lib/libldapschema/lmemory.h b/lib/libldapschema/lmemory.h
index f9f024b..a5887e7 100644
--- a/lib/libldapschema/lmemory.h
+++ b/lib/libldapschema/lmemory.h
@@ -73,6 +73,11 @@ LDAPSchemaCur
73ldapschema_curalloc( 73ldapschema_curalloc(
74 LDAPSchema * lsd ); 74 LDAPSchema * lsd );
75 75
76int
77ldapschema_model_register(
78 LDAPSchema * lsd,
79 LDAPSchemaModel * mod );
80
76void 81void
77ldapschema_objectclass_free( 82ldapschema_objectclass_free(
78 LDAPSchemaObjectclass * objectclass ); 83 LDAPSchemaObjectclass * objectclass );