diff options
| author | David M. Syzdek <david@syzdek.net> | 2019-11-26 15:26:15 -0900 |
|---|---|---|
| committer | David M. Syzdek <david@syzdek.net> | 2019-11-26 15:26:15 -0900 |
| commit | c55bc5eac7853918aa13d5a6d0b4b0d6806da8ca (patch) | |
| tree | 4dd10be923b80af48664d2901bc9fd63f402bf34 | |
| parent | 17e5c73f2cbd99b9b8bce1dde130acce514f28cc (diff) | |
| download | ldap-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.c | 130 | ||||
| -rw-r--r-- | lib/libldapschema/lmemory.h | 5 |
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 | ||
| 459 | int 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 | |||
| 457 | void ldapschema_object_free(LDAPSchemaModel * obj) | 587 | void 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 | |||
| 73 | ldapschema_curalloc( | 73 | ldapschema_curalloc( |
| 74 | LDAPSchema * lsd ); | 74 | LDAPSchema * lsd ); |
| 75 | 75 | ||
| 76 | int | ||
| 77 | ldapschema_model_register( | ||
| 78 | LDAPSchema * lsd, | ||
| 79 | LDAPSchemaModel * mod ); | ||
| 80 | |||
| 76 | void | 81 | void |
| 77 | ldapschema_objectclass_free( | 82 | ldapschema_objectclass_free( |
| 78 | LDAPSchemaObjectclass * objectclass ); | 83 | LDAPSchemaObjectclass * objectclass ); |
