/* $Novell: nameandoid.c,v 1.13 2003/05/12 12:56:33 $ */
/**************************************************************************
*  Novell Software Developer Kit
*
*  Copyright (C) 2002-2003 Novell, Inc. All Rights Reserved.
*
*  THIS WORK IS SUBJECT TO U.S. AND INTERNATIONAL COPYRIGHT LAWS AND TREATIES.
*  USE AND REDISTRIBUTION OF THIS WORK IS SUBJECT TO THE LICENSE AGREEMENT
*  ACCOMPANYING THE SOFTWARE DEVELOPER KIT (SDK) THAT CONTAINS THIS WORK.
*  PURSUANT TO THE SDK LICENSE AGREEMENT, NOVELL HEREBY GRANTS TO DEVELOPER A
*  ROYALTY-FREE, NON-EXCLUSIVE LICENSE TO INCLUDE NOVELL'S SAMPLE CODE IN ITS
*  PRODUCT. NOVELL GRANTS DEVELOPER WORLDWIDE DISTRIBUTION RIGHTS TO MARKET,
*  DISTRIBUTE, OR SELL NOVELL'S SAMPLE CODE AS A COMPONENT OF DEVELOPER'S
*  PRODUCTS. NOVELL SHALL HAVE NO OBLIGATIONS TO DEVELOPER OR DEVELOPER'S
*  CUSTOMERS WITH RESPECT TO THIS CODE.
*
***************************************************************************
   nameandoid.c 
***************************************************************************
   Description:  nameandoid.c shows how to get an oid from its name or get 
                 a name from its oid. A single Novell eDirectory syntax may
                 have multiple matches of LDAP syntaxes. nameandoid.c does
                 a table lookup. Extensions and controls supported by Novell
                 eDirectory are also included in the table.
 
                 The names and oids are defined in:
                   1. LDAP RFC 2252: Lightweight Directory Access Protocol(v3)
                   2. Internet Draft: draft-sermersheim-nds-ldap-schema-**.txt
                   3. Internet Draft: draft-khan-ldapext-replica-mgmt-**.txt
                   4. Internet Draft: draft-rharrision-lburp-**.txt
                   5. Internet Draft: draft-smith-psearch-ldap-**.txt
                   6. Internet Draft: draft-ietf-ldapext-ldapv3-vlv-**.txt


   sample runs:  $ nameandoid SYN_STREAM
                 
                   oid: 1.3.6.1.4.1.1466.115.121.1.5
                   Descriptive name: Binary
                   Novell eDirectory syntax name: SYN_STREAM
                   Reference: RFC 2252: Lightweight Directory Access Protocol(v3)                  

                 $ nameandoid "Directory String"
 
                   oid: 1.3.6.1.4.1.1466.115.121.1.15
                   Descriptive name: Directory String
                   Novell eDirectory syntax name: SYN_CI_STRING
                   Reference: RFC 2252: Lightweight Directory Access Protocol(v3)

                 $ nameandoid "Add Replica Request"

                   oid: 2.16.840.1.113719.1.27.100.7
                   Descriptive name: Add Replica Request
                   Reference: Internet Draft: draft-khan-ldapext-replica-mgmt-**.txt

                 $ nameandoid "Persistent Search"

                   oid: 2.16.840.1.113730.3.4.3
                   Descriptive name: Persistent Search
                   Reference: Internet Draft: draft-ietf-ldapext-psearch-**.txt

                 $ nameandoid "1.3.6.1.4.1.1466.115.121.1.1"

                   oid: 1.3.6.1.4.1.1466.115.121.1.1
                   Descriptive name: ACI Item
                   Novell eDirectory syntax name: SYN_OCTET_STRING
                   Reference: RFC 2252: Lightweight Directory Access Protocol(v3)

******************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <ldap_oids.h>
#if defined(N_PLAT_NLM) && defined(LIBC)
#include <screen.h>
#endif

void printNameAndOID(int);

static char usage[] =
"\n Usage:   nameandoid <name/OID> "
"\n Example: nameandoid \"SYN_STREAM\""
"\n or"
"\n Example: nameandoid \"Directory String\""
"\n or"
"\n Example: nameandoid \"ADD_REPLICA_REQ\""
"\n or"
"\n Example: nameandoid \"Persistent Search\""
"\n or"
"\n Example: nameandoid \"1.3.6.1.4.1.1466.115.121.1.1\""
"\n"
"\n Note:    Name can be a descriptive name, a Novell eDirectory"
"\n          syntax name, a control name, or a extension name"
"\n          supported by Novell eDirectory\n";

int main( int argc, char **argv)
{
    int  i, type, found = 0;
    size_t len;
    char *value;
    
    #if defined(N_PLAT_NLM) && defined(LIBC)
    setscreenmode(SCR_NO_MODE);              /* Don't clear screen on exit */
    #endif

    if (argc != 2) {
        printf("%s", usage);
        return(1);
    }

    value = argv[1];
    len = strlen(value);

    if (len == 0) {
        printf("%s", usage);
        return(1);
    }
    else {      
        for (i = 0; i < (int)len; i++) {
            if ( !isdigit(value[i]) && (value[i]!='.')) {
                type = 0;
                break;
            }
            else
                type = 1;                       
        }
        
        if ( type == 0) {     /* from name to oid */
            for ( i = 0; i < TOTAL_LEN; i++ ) {
                if (  (strcmp( value, namesandoids[i][1]) == 0) 
                    ||(strcmp( value, namesandoids[i][2]) == 0)) {
                        found = 1;
                        printNameAndOID(i);
                }
            }
        }
        else { /* from oid to name */
            for ( i = 0; i < TOTAL_LEN; i++ ) {
                if ( strcmp( value, namesandoids[i][3]) == 0 ) {
                    found = 1;
                    printNameAndOID(i);
                }
            }
        }            

        if(!found)      
            printf("Unknown %s%s\n", type? "oid: ":"name: ", value);
    }   

    return( 0 );
}

void printNameAndOID( int index) {        
    char *dName = namesandoids[index][1];
    char *sName = namesandoids[index][2];    
    char *oid   = namesandoids[index][3];
    char *ref   = namesandoids[index][4];
        
    if (*oid)   printf("oid: %s\n", oid);
    if (*dName) printf("Descriptive name: %s\n", dName);
    if (*sName)  printf("Novell eDirectory syntax name: %s\n", sName );           
    if (*ref)   printf("Reference: %s\n", ref );    
    printf("\n");
}

