/*
 * $RCSfile: hostbyname.c,v $
 *
 * x-kernel v3.3
 *
 * Copyright (c) 1993,1991,1990,1996  Arizona Board of Regents
 *
 * $Log: hostbyname.c,v $
 * Revision 1.2  1996/01/29 19:46:05  slm
 * Updated copyright and version.
 *
 * Revision 1.1  1995/07/28  21:41:44  slm
 * Initial revision
 *
 * Revision 1.3.1.1.1.1  1994/10/27  20:51:48  hkaram
 * New branch
 *
 * Revision 1.3.1.1  1994/01/31  22:54:37  menze
 * made xknameresolve static
 */

/*
 *   a simple-minded procedure for mapping names to addresses
 */

#include "xkernel.h"
#include "romopt.h"

#define DNS_MAP_SIZE           20
#define MAX_XKHOST_NAMELENGTH  64

static struct namenumber {
    char h_name[MAX_XKHOST_NAMELENGTH];
    IPhost h_addr; } hostnametable[DNS_MAP_SIZE];
static initialized = 0;

#ifdef __STDC__

static XkReturn addnametotable(char **, int, int, void *);
static XkReturn xknameresolve(char *, IPhost *a);

#endif

#define min(a,b) ((a)<(b) ? (a):(b))

static XkReturn addnametotable(str, nfields, line, arg)
char **str;
int nfields, line;
VOID *arg;
{
    char hn[MAX_XKHOST_NAMELENGTH];
    int i;

    bzero(hn, MAX_XKHOST_NAMELENGTH);
    strncpy(hn, str[1], min(strlen(str[1]), MAX_XKHOST_NAMELENGTH));
    for (i=0; i<DNS_MAP_SIZE; i++) {
        if (!strcmp(hostnametable[i].h_name, hn))
            /* don't overwrite existing entries; should really print warning */
            break;
        else if (!hostnametable[i].h_name[0]) {
            strcpy(hostnametable[i].h_name, hn);
            str2ipHost(&hostnametable[i].h_addr, str[2]);
            break;
        }
    }
    return XK_SUCCESS;
}

static XkReturn
xknameresolve(n, a) char *n; IPhost *a;
{
    int i;

    for (i=0; i<DNS_MAP_SIZE; i++) {
        if (!strcmp(hostnametable[i].h_name, n)) {
	    *a = hostnametable[i].h_addr;
	    return XK_SUCCESS;
	}
    }
    return XK_FAILURE;
}

/* looking for lines like
 *
 *   dns umbra 192.12.69.97
 *
 */

XkReturn
xk_gethostbyname(namestr, addr)
char *namestr;
IPhost *addr;
{
    char hn[MAX_XKHOST_NAMELENGTH];
    RomOpt options[] = { {"", 3, addnametotable} };

    if (!initialized) {
        bzero((char *)hostnametable, sizeof(hostnametable));
        findRomOpts("dns", options, 1, 0);
        initialized = 1;
    }

    bzero(hn, MAX_XKHOST_NAMELENGTH);
    strncpy(hn, namestr, min(strlen(namestr), MAX_XKHOST_NAMELENGTH));
    return xknameresolve(hn, addr);
}
