X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=blobdiff_plain;f=util%2Foid.c;h=1a0ecbb9de18eaae1fff274b2832b8fbaeeae64b;hp=e5567a554eeb7505d6dcba813c6b999d1b121f5d;hb=5381b2f81bb793e364cd5b2a910e026ce84d9d05;hpb=b86dedd714b84b52d7f1bfe71555d08367c2c179 diff --git a/util/oid.c b/util/oid.c index e5567a5..1a0ecbb 100644 --- a/util/oid.c +++ b/util/oid.c @@ -1,162 +1,8 @@ /* - * Copyright (c) 1995-2000, Index Data + * Copyright (c) 1995-2003, Index Data * See the file LICENSE for details. * - * $Log: oid.c,v $ - * 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.64 2003-07-18 19:54:30 mike Exp $ */ /* @@ -186,18 +32,20 @@ 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,2,10161,2,1,-1}, + {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}, @@ -214,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}, @@ -237,9 +87,18 @@ static oident oids[] = "Dan-1"}, {PROTO_Z3950, CLASS_ATTSET, VAL_HOLDINGS, {3,16,-1}, "Holdings"}, - - {PROTO_Z3950, CLASS_ATTSET, VAL_THESAURUS, {3,1000,81,1,-1}, + {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"}, +#if 0 /* This is the spawn of Satan. Use Zthes-1 instead */ + {PROTO_Z3950, CLASS_ATTSET, VAL_THESAURUS, {3,1000,81,1,-1}, "Thesaurus-attset"}, +#endif /*0*/ + {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}, @@ -365,8 +224,10 @@ static oident oids[] = "Per'd query"}, {PROTO_Z3950, CLASS_EXTSERV, VAL_ITEMORDER, {9,4,-1}, "Item order"}, - {PROTO_Z3950, CLASS_EXTSERV, VAL_DBUPDATE0, {9,5,1,-1}, - "DB. Update (old version)"}, + {PROTO_Z3950, CLASS_EXTSERV, VAL_DBUPDATE0, {9,5,-1}, + "DB. Update (first version)"}, + {PROTO_Z3950, CLASS_EXTSERV, VAL_DBUPDATE1, {9,5,1,-1}, + "DB. Update (second version)"}, {PROTO_Z3950, CLASS_EXTSERV, VAL_DBUPDATE, {9,5,1,1,-1}, "DB. Update"}, {PROTO_Z3950, CLASS_EXTSERV, VAL_EXPORTSPEC, {9,6,-1}, @@ -430,91 +291,25 @@ 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}, + "OCLC-userInfo"}, + {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_Z3950, CLASS_USERINFO,VAL_OCLCUI, {10, 1000, 17, 1, -1}, + "CQL"}, {PROTO_NOP, CLASS_NOP, VAL_NOP, {-1}, 0 } }; @@ -567,41 +362,45 @@ static int match_prefix(int *look, int *prefix) return 0; } -void oid_transfer (struct oident *oident) +void oid_transfer (struct oident *oidentp) { - while (*oident->oidsuffix >= 0) + while (*oidentp->oidsuffix >= 0) { - oid_addent (oident->oidsuffix, oident->proto, - oident->oclass, - oident->desc, oident->value); - oident++; + oid_addent (oidentp->oidsuffix, oidentp->proto, + oidentp->oclass, + oidentp->desc, oidentp->value); + oidentp++; } } 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) @@ -639,9 +438,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); @@ -672,15 +471,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; @@ -690,12 +489,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 *) 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 @@ -704,7 +502,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; } @@ -741,7 +539,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; } @@ -765,3 +565,49 @@ 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); +} + +int *oid_name_to_oid(oid_class oclass, const char *name, int *oid) { + struct oident ent; + + /* Translate syntax to oid_val */ + oid_value value = oid_getvalbyname(name); + + /* Build it into an oident */ + ent.proto = PROTO_Z3950; + ent.oclass = oclass; + ent.value = value; + + /* Translate to an array of int */ + return oid_ent_to_oid(&ent, oid); +} + +char *oid_to_dotstring(const int *oid, char *oidbuf) { + char tmpbuf[20]; + int i; + + oidbuf[0] = '\0'; + for (i = 0; oid[i] != -1; i++) { + sprintf(tmpbuf, "%d", oid[i]); + if (i > 0) strcat(oidbuf, "."); + strcat(oidbuf, tmpbuf); + } + + return oidbuf; +} + +char *oid_name_to_dotstring(oid_class oclass, const char *name, char *oidbuf) { + int oid[OID_SIZE]; + + (void) oid_name_to_oid(oclass, name, oid); + return oid_to_dotstring(oid, oidbuf); +} +