X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=blobdiff_plain;f=util%2Foid.c;h=aefa1e1fd81c325ea74bea00d8d70be31bc93af2;hp=a37d65a056e27c69782eb0d1f5ce588b1bec58e3;hb=506058d7a9f17fcc88f899d92476fe59cc09bdfb;hpb=ada24b27e68c3a29b7c56147d8aedff0ebdba897 diff --git a/util/oid.c b/util/oid.c index a37d65a..aefa1e1 100644 --- a/util/oid.c +++ b/util/oid.c @@ -1,166 +1,8 @@ /* - * Copyright (c) 1995-2001, Index Data + * Copyright (c) 1995-2002, Index Data * See the file LICENSE for details. * - * $Log: oid.c,v $ - * Revision 1.45 2001-05-16 07:25:59 adam - * Modified oid_ent_to_oid so that if proto is general, then class - * is ignored (only oid value is compared). - * - * Revision 1.44 2000/10/02 13:58:50 adam - * Added some OID's. - * - * Revision 1.43 2000/03/14 09:21:08 ian - * Added Admin Extended Service OID - * - * Revision 1.42 2000/02/29 13:44:55 adam - * Check for config.h (currently not generated). - * - * Revision 1.41 2000/01/10 15:16:53 adam - * Added several OID's. - * - * Revision 1.40 2000/01/06 14:59:13 adam - * Added oid_init/oid_exit. Changed oid_exit. - * - * Revision 1.39 1999/12/16 23:36:19 adam - * Implemented ILL protocol. Minor updates ASN.1 compiler. - * - * Revision 1.38 1999/11/30 13:47:12 adam - * Improved installation. Moved header files to include/yaz. - * - * Revision 1.37 1999/09/13 12:51:15 adam - * Added CLIENT IP OID. - * - * Revision 1.36 1999/05/27 13:02:20 adam - * Assigned OID for old DB Update (VAL_DBUPDATE0). - * - * Revision 1.35 1999/04/20 09:56:49 adam - * Added 'name' paramter to encoder/decoder routines (typedef Odr_fun). - * Modified all encoders/decoders to reflect this change. - * - * Revision 1.34 1999/04/15 09:19:43 adam - * Added COOKIE UserInfo OID. - * - * Revision 1.33 1999/04/09 12:16:11 adam - * Added OtherInfo private OID proxy. - * - * Revision 1.32 1999/02/18 10:30:46 quinn - * Changed ES: Update OID - * - * Revision 1.31 1998/12/03 11:33:05 adam - * Added OID's for XML. - * - * Revision 1.30 1998/10/18 07:48:56 adam - * Fixed oid_getentbyoid so that it returns NULL when parsed oid is NULL. - * - * Revision 1.29 1998/10/14 13:32:35 adam - * Added include of string.h. - * - * Revision 1.28 1998/10/13 16:01:53 adam - * Implemented support for dynamic object identifiers. - * Function oid_getvalbyname now accepts raw OID's as well as traditional - * names. - * - * Revision 1.27 1998/05/18 10:10:02 adam - * Added Explain-schema and Explain-tagset to OID database. - * - * Revision 1.26 1998/03/20 14:46:06 adam - * Added UNIverse Resource Reports. - * - * Revision 1.25 1998/02/10 15:32:03 adam - * Added new Object Identifiers. - * - * Revision 1.24 1997/09/29 13:19:00 adam - * Added function, oid_ent_to_oid, to replace the function - * oid_getoidbyent, which is not thread safe. - * - * Revision 1.23 1997/09/09 10:10:19 adam - * Another MSV5.0 port. Changed projects to include proper - * library/include paths. - * Server starts server in test-mode when no options are given. - * - * Revision 1.22 1997/08/29 13:34:58 quinn - * Added thesaurus oids - * - * Revision 1.21 1997/08/19 08:46:05 quinn - * Added Thesaurus OID - * - * Revision 1.20 1997/07/28 12:34:43 adam - * Added new OID entries (RVDM). - * - * Revision 1.19 1997/05/02 08:39:41 quinn - * Support for private OID table added. Thanks to Ronald van der Meer - * - * Revision 1.18 1997/04/30 08:52:12 quinn - * Null - * - * Revision 1.17 1996/10/10 12:35:23 quinn - * Added Update extended service. - * - * Revision 1.16 1996/10/09 15:55:02 quinn - * Added SearchInfoReport - * - * Revision 1.15 1996/10/07 15:29:43 quinn - * Added SOIF support - * - * Revision 1.14 1996/02/20 17:58:28 adam - * Added const to oid_getvalbyname. - * - * Revision 1.13 1996/02/20 16:37:33 quinn - * Using yaz_matchstr in oid_getvalbyname - * - * Revision 1.12 1996/01/02 08:57:53 quinn - * Changed enums in the ASN.1 .h files to #defines. Changed oident.class to oclass - * - * Revision 1.11 1995/12/13 16:03:35 quinn - * *** empty log message *** - * - * Revision 1.10 1995/11/28 09:30:44 quinn - * Work. - * - * Revision 1.9 1995/11/13 09:27:53 quinn - * Fiddling with the variant stuff. - * - * Revision 1.8 1995/10/12 10:34:56 quinn - * Added Espec-1. - * - * Revision 1.7 1995/10/10 16:27:12 quinn - * *** empty log message *** - * - * Revision 1.6 1995/09/29 17:12:35 quinn - * Smallish - * - * Revision 1.5 1995/09/29 17:01:51 quinn - * More Windows work - * - * Revision 1.4 1995/09/27 15:03:03 quinn - * Modified function heads & prototypes. - * - * Revision 1.3 1995/09/12 11:32:06 quinn - * Added a looker-upper by name. - * - * Revision 1.2 1995/08/21 09:11:16 quinn - * Smallish fixes to suppport new formats. - * - * Revision 1.1 1995/05/29 08:17:13 quinn - * iMoved oid to util to support comstack. - * - * Revision 1.5 1995/05/22 11:30:16 quinn - * Adding Z39.50-1992 stuff to proto.c. Adding zget.c - * - * Revision 1.4 1995/05/16 08:50:22 quinn - * License, documentation, and memory fixes - * - * Revision 1.3 1995/04/11 11:52:02 quinn - * Fixed possible buf in proto.c - * - * Revision 1.2 1995/03/29 15:39:38 quinn - * Adding some resource control elements, and a null-check to getentbyoid - * - * Revision 1.1 1995/03/27 08:32:12 quinn - * Added OID database - * - * + * $Id: oid.c,v 1.52 2002-01-29 13:47:33 adam Exp $ */ /* @@ -190,11 +32,13 @@ struct oident_list { static struct oident_list *oident_table = NULL; static int oid_value_dynamic = VAL_DYNAMIC; static int oid_init_flag = 0; +static NMEM_MUTEX oid_mutex = 0; +static NMEM oid_nmem = 0; /* * OID database */ -static oident oids[] = +static oident standard_oids[] = { /* General definitions */ {PROTO_GENERAL, CLASS_TRANSYN, VAL_BER, {2,1,1,-1}, @@ -218,6 +62,8 @@ static oident oids[] = "CCL-1"}, {PROTO_Z3950, CLASS_ATTSET, VAL_GILS, {3,5,-1}, "GILS-attset"}, + {PROTO_Z3950, CLASS_ATTSET, VAL_GILS, {3,5,-1}, + "GILS"}, {PROTO_Z3950, CLASS_ATTSET, VAL_STAS, {3,6,-1}, "STAS-attset"}, {PROTO_Z3950, CLASS_ATTSET, VAL_COLLECT1, {3,7,-1}, @@ -437,88 +283,6 @@ static oident oids[] = "thesaurus-tagset"}, {PROTO_Z3950, CLASS_TAGSET, VAL_EXPLAIN, {14,1000,81,2,-1}, "Explain-tagset"}, - - - /* SR definitions. Note that some of them aren't defined by the - standard (yet), but are borrowed from Z3950v3 */ - {PROTO_SR, CLASS_ABSYN, VAL_APDU, {2,1,-1}, "SR-APDU" }, - - {PROTO_SR, CLASS_APPCTX, VAL_BASIC_CTX, {1,1,-1}, "SR-BASIC" }, - - {PROTO_SR, CLASS_ATTSET, VAL_BIB1, {3,1,-1}, "Bib-1" }, - {PROTO_SR, CLASS_ATTSET, VAL_EXP1, {3,2,-1}, "Exp-1" }, - {PROTO_SR, CLASS_ATTSET, VAL_EXT1, {3,3,-1}, "Ext-1" }, - {PROTO_SR, CLASS_ATTSET, VAL_CCL1, {3,4,-1}, "CCL-1" }, - {PROTO_SR, CLASS_ATTSET, VAL_GILS, {3,5,-1}, "GILS" }, - {PROTO_SR, CLASS_ATTSET, VAL_STAS, {3,6,-1}, "STAS", }, - {PROTO_SR, CLASS_ATTSET, VAL_COLLECT1, {3,7,-1}, "Collections-attset"}, - {PROTO_SR, CLASS_ATTSET, VAL_CIMI1, {3,8,-1}, "CIMI-attset"}, - {PROTO_SR, CLASS_ATTSET, VAL_GEO, {3,9,-1}, "Geo-attset"}, - - {PROTO_SR, CLASS_DIAGSET, VAL_BIB1, {4,1,-1}, "Bib-1" }, - {PROTO_SR, CLASS_DIAGSET, VAL_DIAG1, {4,2,-1}, "Diag-1" }, - - {PROTO_SR, CLASS_RECSYN, VAL_UNIMARC, {5,1,-1}, "Unimarc" }, - {PROTO_SR, CLASS_RECSYN, VAL_INTERMARC, {5,2,-1}, "Intermarc" }, - {PROTO_SR, CLASS_RECSYN, VAL_CCF, {5,3,-1}, "CCF" }, - {PROTO_SR, CLASS_RECSYN, VAL_USMARC, {5,10,-1}, "USmarc" }, - {PROTO_SR, CLASS_RECSYN, VAL_UKMARC, {5,11,-1}, "UKmarc" }, - {PROTO_SR, CLASS_RECSYN, VAL_NORMARC, {5,12,-1}, "Normarc" }, - {PROTO_SR, CLASS_RECSYN, VAL_LIBRISMARC,{5,13,-1}, "Librismarc" }, - {PROTO_SR, CLASS_RECSYN, VAL_DANMARC, {5,14,-1}, "Danmarc" }, - {PROTO_SR, CLASS_RECSYN, VAL_FINMARC, {5,15,-1}, "Finmarc" }, - {PROTO_SR, CLASS_RECSYN, VAL_MAB, {5,16,-1}, "MAB" }, - {PROTO_SR, CLASS_RECSYN, VAL_CANMARC, {5,17,-1}, "Canmarc" }, - {PROTO_SR, CLASS_RECSYN, VAL_MAB, {5,16,-1}, "MAB" }, - {PROTO_SR, CLASS_RECSYN, VAL_CANMARC, {5,17,-1}, "Canmarc" }, - {PROTO_SR, CLASS_RECSYN, VAL_SBN, {5,18,-1}, "SBN" }, - {PROTO_SR, CLASS_RECSYN, VAL_PICAMARC, {5,19,-1}, "Picamarc" }, - {PROTO_SR, CLASS_RECSYN, VAL_AUSMARC, {5,20,-1}, "Ausmarc" }, - {PROTO_SR, CLASS_RECSYN, VAL_IBERMARC, {5,21,-1}, "Ibermarc" }, - {PROTO_SR, CLASS_RECSYN, VAL_CATMARC, {5,22,-1}, "Catmarc" }, - {PROTO_SR, CLASS_RECSYN, VAL_MALMARC, {5,23,-1}, "Malmarc" }, - {PROTO_SR, CLASS_RECSYN, VAL_EXPLAIN, {5,100,-1}, "Explain" }, - {PROTO_SR, CLASS_RECSYN, VAL_SUTRS, {5,101,-1}, "SUTRS" }, - {PROTO_SR, CLASS_RECSYN, VAL_OPAC, {5,102,-1}, "OPAC" }, - {PROTO_SR, CLASS_RECSYN, VAL_SUMMARY, {5,103,-1}, "Summary" }, - {PROTO_SR, CLASS_RECSYN, VAL_GRS0, {5,104,-1}, "GRS-0" }, - {PROTO_SR, CLASS_RECSYN, VAL_GRS1, {5,105,-1}, "GRS-1" }, - {PROTO_SR, CLASS_RECSYN, VAL_EXTENDED, {5,106,-1}, "Extended" }, - {PROTO_SR, CLASS_RECSYN, VAL_FRAGMENT, {5,107,-1}, "Fragment" }, - - {PROTO_SR, CLASS_RESFORM, VAL_RESOURCE1, {7,1,-1}, "Resource-1" }, - {PROTO_SR, CLASS_RESFORM, VAL_RESOURCE2, {7,2,-1}, "Resource-2" }, - - {PROTO_SR, CLASS_ACCFORM, VAL_PROMPT1, {8,1,-1}, "Prompt-1" }, - {PROTO_SR, CLASS_ACCFORM, VAL_DES1, {8,2,-1}, "Des-1" }, - {PROTO_SR, CLASS_ACCFORM, VAL_KRB1, {8,3,-1}, "Krb-1" }, - - {PROTO_SR, CLASS_EXTSERV, VAL_PRESSET, {9,1,-1}, "Pers. set" }, - {PROTO_SR, CLASS_EXTSERV, VAL_PQUERY, {9,2,-1}, "Pers. query" }, - {PROTO_SR, CLASS_EXTSERV, VAL_PCQUERY, {9,3,-1}, "Per'd query" }, - {PROTO_SR, CLASS_EXTSERV, VAL_ITEMORDER, {9,4,-1}, "Item order" }, - {PROTO_SR, CLASS_EXTSERV, VAL_DBUPDATE, {9,5,-1}, "DB. Update" }, - {PROTO_SR, CLASS_EXTSERV, VAL_EXPORTSPEC,{9,6,-1}, "exp. spec." }, - {PROTO_SR, CLASS_EXTSERV, VAL_EXPORTINV, {9,7,-1}, "exp. inv." }, - - {PROTO_SR, CLASS_ELEMSPEC,VAL_ESPEC1, {11,1,-1}, "Espec-1" }, - - {PROTO_SR, CLASS_VARSET, VAL_VAR1, {12,1,-1}, "Variant-1" }, - - {PROTO_SR, CLASS_SCHEMA, VAL_WAIS, {13,1,-1}, "WAIS-schema" }, - {PROTO_SR, CLASS_SCHEMA, VAL_GILS, {13,2,-1}, "GILS-schema" }, - {PROTO_SR, CLASS_SCHEMA, VAL_COLLECT1, {13,3,-1}, "Collections-schema" }, - {PROTO_SR, CLASS_SCHEMA, VAL_GEO, {13,4,-1}, "Geo-schema" }, - {PROTO_SR, CLASS_SCHEMA, VAL_CIMI1, {13,5,-1}, "CIMI-schema" }, - - {PROTO_SR, CLASS_TAGSET, VAL_SETM, {14,1,-1}, "TagsetM" }, - {PROTO_SR, CLASS_TAGSET, VAL_SETG, {14,2,-1}, "TagsetG" }, - - {PROTO_SR, CLASS_TAGSET, VAL_STAS, {14,3,-1}, "STAS-tagset" }, - {PROTO_SR, CLASS_TAGSET, VAL_GILS, {14,4,-1}, "GILS-tagset" }, - {PROTO_SR, CLASS_TAGSET, VAL_COLLECT1, {14,5,-1}, "Collections-tagset"}, - {PROTO_SR, CLASS_TAGSET, VAL_CIMI1, {14,6,-1}, "CIMI-tagset" }, - {PROTO_NOP, CLASS_NOP, VAL_NOP, {-1}, 0 } }; @@ -584,28 +348,32 @@ void oid_transfer (struct oident *oident) void oid_init (void) { - if (oid_init_flag) - return; - /* oid_transfer is thread safe, so there's nothing wrong in having - two threads calling it simultaniously. On the other hand - no thread may exit oid_init before all OID's bave been - transferred - which is why checked is set after oid_transfer... - */ - oid_transfer (oids); - oid_init_flag = 1; + if (oid_init_flag == 0) + { + /* oid_transfer is thread safe, so there's nothing wrong in having + two threads calling it simultaniously. On the other hand + no thread may exit oid_init before all OID's bave been + transferred - which is why checked is set after oid_transfer... + */ + nmem_mutex_create (&oid_mutex); + nmem_mutex_enter (oid_mutex); + if (!oid_nmem) + oid_nmem = nmem_create (); + nmem_mutex_leave (oid_mutex); + oid_transfer (standard_oids); + oid_init_flag = 1; + } } void oid_exit (void) { - while (oident_table) + if (oid_init_flag) { - struct oident_list *this_p = oident_table; - oident_table = oident_table->next; - - xfree (this_p->oident.desc); - xfree (this_p); + oid_init_flag = 0; + nmem_mutex_destroy (&oid_mutex); + nmem_destroy (oid_nmem); + oid_nmem = 0; } - oid_init_flag = 0; } static struct oident *oid_getentbyoid_x(int *o) @@ -676,15 +444,15 @@ struct oident *oid_addent (int *oid, enum oid_proto proto, enum oid_class oclass, const char *desc, int value) { - struct oident *oident; + struct oident *oident = 0; - nmem_critical_enter (); - oident = oid_getentbyoid_x (oid); + nmem_mutex_enter (oid_mutex); if (!oident) { char desc_str[200]; struct oident_list *oident_list; - oident_list = (struct oident_list *) xmalloc (sizeof(*oident_list)); + oident_list = (struct oident_list *) + nmem_malloc (oid_nmem, sizeof(*oident_list)); oident = &oident_list->oident; oident->proto = proto; oident->oclass = oclass; @@ -698,8 +466,7 @@ struct oident *oid_addent (int *oid, enum oid_proto proto, sprintf (desc_str+strlen(desc_str), ".%d", oid[i]); desc = desc_str; } - oident->desc = (char *) xmalloc (strlen(desc)+1); - strcpy (oident->desc, desc); + oident->desc = nmem_strdup (oid_nmem, desc); if (value == VAL_DYNAMIC) oident->value = (enum oid_value) (++oid_value_dynamic); else @@ -708,7 +475,7 @@ struct oident *oid_addent (int *oid, enum oid_proto proto, oident_list->next = oident_table; oident_table = oident_list; } - nmem_critical_leave (); + nmem_mutex_leave (oid_mutex); return oident; } @@ -745,7 +512,9 @@ static oid_value oid_getval_raw(const char *name) } oid[i] = val; oid[i+1] = -1; - oident = oid_addent (oid, PROTO_GENERAL, CLASS_GENERAL, NULL, + oident = oid_getentbyoid_x (oid); + if (!oident) + oident = oid_addent (oid, PROTO_GENERAL, CLASS_GENERAL, NULL, VAL_DYNAMIC); return oident->value; } @@ -769,3 +538,12 @@ void oid_setprivateoids(oident *list) { oid_transfer (list); } + +void oid_trav (void (*func)(struct oident *oidinfo, void *vp), void *vp) +{ + struct oident_list *ol; + + oid_init (); + for (ol = oident_table; ol; ol = ol->next) + (*func)(&ol->oident, vp); +}