X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=blobdiff_plain;f=util%2Foid.c;h=a8c485b2b5d50eec3213b40e380b5b3ba96e090a;hp=95c5846f7b3ca57e63c03e355252a05afcf52f8d;hb=4d531a1a9131d69c3b6c27fbac42837e22cff61c;hpb=2c185557bb24fa795cee97d813074932e8cc6f78 diff --git a/util/oid.c b/util/oid.c index 95c5846..a8c485b 100644 --- a/util/oid.c +++ b/util/oid.c @@ -1,139 +1,8 @@ /* - * Copyright (c) 1995-1999, Index Data + * Copyright (c) 1995-2003, Index Data * See the file LICENSE for details. - * Sebastian Hammer, Adam Dickmeiss - * - * $Log: oid.c,v $ - * 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.59 2003-01-06 08:20:28 adam Exp $ */ /* @@ -141,13 +10,16 @@ * We could (and should?) extend this so that the user app can add new * entries to the list at initialization. */ +#if HAVE_CONFIG_H +#include +#endif #include #include #include -#include -#include +#include +#include static int z3950_prefix[] = { 1, 2, 840, 10003, -1 }; static int sr_prefix[] = { 1, 0, 10163, -1 }; @@ -159,17 +31,22 @@ 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}, "BER" }, {PROTO_GENERAL, CLASS_TRANSYN, VAL_ISO2709, {1,0,2709,1,1,-1}, "ISO2709"}, + {PROTO_GENERAL, CLASS_GENERAL, VAL_ISO_ILL_1, {1,0,10161,2,1,-1}, + "ISOILL-1"}, /* Z39.50v3 definitions */ {PROTO_Z3950, CLASS_ABSYN, VAL_APDU, {2,1,-1}, "Z-APDU"}, @@ -185,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}, @@ -193,12 +72,40 @@ static oident oids[] = "CIMI-attset"}, {PROTO_Z3950, CLASS_ATTSET, VAL_GEO, {3,9,-1}, "Geo-attset"}, - {PROTO_Z3950, CLASS_ATTSET, VAL_THESAURUS, {3,1000,81,1,-1}, + + {PROTO_Z3950, CLASS_ATTSET, VAL_ZBIG, {3,10,-1}, + "ZBIG"}, + {PROTO_Z3950, CLASS_ATTSET, VAL_UTIL, {3,11,-1}, + "Util"}, + {PROTO_Z3950, CLASS_ATTSET, VAL_XD1, {3,12,-1}, + "XD-1"}, + {PROTO_Z3950, CLASS_ATTSET, VAL_ZTHES, {3,13,-1}, + "Zthes"}, + {PROTO_Z3950, CLASS_ATTSET, VAL_FIN1, {3,14,-1}, + "Fin-1"}, + {PROTO_Z3950, CLASS_ATTSET, VAL_DAN1, {3,15,-1}, + "Dan-1"}, + {PROTO_Z3950, CLASS_ATTSET, VAL_HOLDINGS, {3,16,-1}, + "Holdings"}, + {PROTO_Z3950, CLASS_ATTSET, VAL_USMARC, {3,17,-1}, + "MARC"}, + {PROTO_Z3950, CLASS_ATTSET, VAL_BIB2, {3,18,-1}, + "Bib-2"}, + {PROTO_Z3950, CLASS_ATTSET, VAL_ZEEREX, {3,19,-1}, + "ZeeRex"}, + + {PROTO_Z3950, CLASS_ATTSET, VAL_THESAURUS, {3,1000,81,1,-1}, "Thesaurus-attset"}, + {PROTO_Z3950, CLASS_ATTSET, VAL_IDXPATH, {3,1000,81,2,-1}, + "IDXPATH"}, {PROTO_Z3950, CLASS_DIAGSET, VAL_BIB1, {4,1,-1}, "Bib-1"}, {PROTO_Z3950, CLASS_DIAGSET, VAL_DIAG1, {4,2,-1}, "Diag-1"}, + {PROTO_Z3950, CLASS_DIAGSET, VAL_DIAG_ES, {4,3,-1}, + "Diag-ES"}, + {PROTO_Z3950, CLASS_DIAGSET, VAL_DIAG_GENERAL, {4,3,-1}, + "Diag-General"}, {PROTO_Z3950, CLASS_RECSYN, VAL_UNIMARC, {5,1,-1}, "Unimarc"}, {PROTO_Z3950, CLASS_RECSYN, VAL_INTERMARC, {5,2,-1}, @@ -233,6 +140,18 @@ static oident oids[] = "Carmarc"}, {PROTO_Z3950, CLASS_RECSYN, VAL_MALMARC, {5,23,-1}, "Malmarc"}, + {PROTO_Z3950, CLASS_RECSYN, VAL_JPMARC, {5,24,-1}, + "JPmarc"}, + {PROTO_Z3950, CLASS_RECSYN, VAL_SWEMARC, {5,25,-1}, + "SWEmarc"}, + {PROTO_Z3950, CLASS_RECSYN, VAL_SIGLEMARC, {5,26,-1}, + "SIGLEmarc"}, + {PROTO_Z3950, CLASS_RECSYN, VAL_ISDSMARC, {5,27,-1}, + "ISDSmarc"}, + {PROTO_Z3950, CLASS_RECSYN, VAL_RUSMARC, {5,28,-1}, + "RUSmarc"}, + {PROTO_Z3950, CLASS_RECSYN, VAL_HUNMARC, {5,29,-1}, + "Hunmarc"}, {PROTO_Z3950, CLASS_RECSYN, VAL_EXPLAIN, {5,100,-1}, "Explain"}, {PROTO_Z3950, CLASS_RECSYN, VAL_SUTRS, {5,101,-1}, @@ -275,10 +194,6 @@ static oident oids[] = {PROTO_Z3950, CLASS_RECSYN, VAL_SQLRS, {5,111,-1}, "SQL-RS"}, -#if 0 - {PROTO_Z3950, CLASS_RECSYN, VAL_ID_SGML, {5,1000,81,1,-1}, - "ID-SGML" }, -#endif {PROTO_Z3950, CLASS_RECSYN, VAL_SOIF, {5,1000,81,2,-1}, "SOIF" }, {PROTO_Z3950, CLASS_RECSYN, VAL_TEXT_XML, {5,109,10,-1}, @@ -316,7 +231,8 @@ static oident oids[] = "exp. spec."}, {PROTO_Z3950, CLASS_EXTSERV, VAL_EXPORTINV, {9,7,-1}, "exp. inv."}, - + {PROTO_Z3950, CLASS_EXTSERV, VAL_ADMINSERVICE, {9,81,1,-1}, + "Admin"}, {PROTO_Z3950, CLASS_USERINFO,VAL_SEARCHRES1, {10,1,-1}, "searchResult-1"}, {PROTO_Z3950, CLASS_USERINFO,VAL_CHARLANG, {10,2,-1}, @@ -333,6 +249,8 @@ static oident oids[] = "Proxy" }, {PROTO_Z3950, CLASS_USERINFO,VAL_COOKIE, {10,1000,81,2,-1}, "Cookie" }, + {PROTO_Z3950, CLASS_USERINFO,VAL_CLIENT_IP, {10,1000,81,3,-1}, + "Client-IP" }, {PROTO_Z3950, CLASS_ELEMSPEC,VAL_ESPEC1, {11,1,-1}, "Espec-1"}, {PROTO_Z3950, CLASS_VARSET, VAL_VAR1, {12,1,-1}, @@ -349,6 +267,10 @@ static oident oids[] = "CIMI-schema"}, {PROTO_Z3950, CLASS_SCHEMA, VAL_UPDATEES, {13,6,-1}, "Update ES"}, + {PROTO_Z3950, CLASS_SCHEMA, VAL_HOLDINGS, {13,7,-1}, + "Holdings"}, + {PROTO_Z3950, CLASS_SCHEMA, VAL_ZTHES, {13,8,-1}, + "Zthes"}, {PROTO_Z3950, CLASS_SCHEMA, VAL_THESAURUS, {13,1000,81,1,-1}, "thesaurus-schema"}, {PROTO_Z3950, CLASS_SCHEMA, VAL_EXPLAIN, {13,1000,81,2,-1}, @@ -366,91 +288,23 @@ static oident oids[] = {PROTO_Z3950, CLASS_TAGSET, VAL_CIMI1, {14,6,-1}, "CIMI-tagset"}, {PROTO_Z3950, CLASS_TAGSET, VAL_THESAURUS, {14,1000,81,1,-1}, - "thesaurus-tagset"}, + "thesaurus-tagset"}, /* What is this Satan-spawn doing here? */ {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_Z3950, CLASS_TAGSET, VAL_ZTHES, {14,8,-1}, + "Zthes-tagset"}, + {PROTO_Z3950, CLASS_NEGOT, VAL_CHARNEG3, {15,3,-1}, + "CharSetandLanguageNegotiation-3"}, + {PROTO_Z3950, CLASS_USERINFO,VAL_CQL, {16, 2, -1}, + "CQL"}, + {PROTO_GENERAL, CLASS_GENERAL, VAL_UCS2, {1,0,10646,1,0,2,-1}, + "UCS-2"}, + {PROTO_GENERAL, CLASS_GENERAL, VAL_UCS4, {1,0,10646,1,0,4,-1}, + "UCS-4"}, + {PROTO_GENERAL, CLASS_GENERAL, VAL_UTF16, {1,0,10646,1,0,5,-1}, + "UTF-16"}, + {PROTO_GENERAL, CLASS_GENERAL, VAL_UTF8, {1,0,10646,1,0,8,-1}, + "UTF-8"}, {PROTO_NOP, CLASS_NOP, VAL_NOP, {-1}, 0 } }; @@ -514,16 +368,35 @@ void oid_transfer (struct oident *oident) } } -static void oid_init (void) +void oid_init (void) { - static int checked = 0; - - if (checked) - return; - oid_transfer (oids); - checked = 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) +{ + if (oid_init_flag) + { + oid_init_flag = 0; + nmem_mutex_destroy (&oid_mutex); + nmem_destroy (oid_nmem); + oid_nmem = 0; + } +} static struct oident *oid_getentbyoid_x(int *o) { @@ -560,9 +433,9 @@ int *oid_ent_to_oid(struct oident *ent, int *ret) for (ol = oident_table; ol; ol = ol->next) { struct oident *p = &ol->oident; - if ((ent->proto == p->proto || p->proto == PROTO_GENERAL) && - (ent->oclass == p->oclass || p->oclass == CLASS_GENERAL) && - ent->value == p->value) + if (ent->value == p->value && + (p->proto == PROTO_GENERAL || (ent->proto == p->proto && + (ent->oclass == p->oclass || ent->oclass == CLASS_GENERAL)))) { if (p->proto == PROTO_Z3950) oid_oidcpy(ret, z3950_prefix); @@ -593,15 +466,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 *) malloc (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; @@ -611,12 +484,11 @@ struct oident *oid_addent (int *oid, enum oid_proto proto, int i; sprintf (desc_str, "%d", *oid); - for (i = 1; oid[i] >= 0; i++) + for (i = 1; i < 12 && oid[i] >= 0; i++) sprintf (desc_str+strlen(desc_str), ".%d", oid[i]); desc = desc_str; } - oident->desc = (char *) malloc (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 @@ -625,7 +497,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; } @@ -662,7 +534,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; } @@ -686,3 +560,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); +}