/* $Header: /mit/nit/src/nip/RCS/file.c,v 1.4 89/12/13 01:52:11 probe Exp $
 *
 * Network Configuration Program
 *
 * Uses NIP to pick an internet address, gateways, etc, then sets them.
 *
 * by Mark Rosenstein, July 1987
 */

#include <stdio.h>
#include <strings.h>
#include <sys/types.h>
#include <sys/time.h>
#include <sys/file.h>
#include <sys/socket.h>
#include <net/if.h>
#include <netinet/in.h>
#include <netinet/if_ether.h>
#include <sys/ioctl.h>
#include <net/nit.h>
#include <net/nip.h>
#include "netconfig.h"

extern int debug;


struct nipinfo *parsefile(filename)
char	*filename;
{
    FILE *f;
    static struct nipinfo ni;
    char	field[64], addrbuf[64];
    u_long addr;

    if ((f = fopen(filename, "r")) == NULL) {
	fprintf(stderr, "cannot open config file %s\n", filename);
	return((struct nipinfo *) 0);
    }

    ni.ni_flags = 0;

    while (fscanf(f, "%s %s", field, addrbuf) == 2) {
	addr = inet_addr(addrbuf);
	if (!strcmp(field, "ADDRESS")) {
	    ni.ni_recommend = addr;
	    ni.ni_flags |= NI_RECOMMEND;
	} else if (!strcmp(field, "MASK")) {
	    ni.ni_netmask = addr;
	    ni.ni_flags |= NI_NETMASK;
	} else if (!strcmp(field, "BROADCAST")) {
	    ni.ni_broadcast = addr;
	    ni.ni_flags |= NI_BROADCAST;
	} else if (!strcmp(field, "NET")) {
	    ni.ni_netaddr = addr;
	    ni.ni_flags |= NI_NETADDR;
	} else if (!strcmp(field, "HIGHEST")) {
	    ni.ni_highest = addr;
	    ni.ni_flags |= NI_HIGHEST;
	} else if (!strcmp(field, "LOWEST")) {
	    ni.ni_lowest = addr;
	    ni.ni_flags |= NI_LOWEST;
	} else if (!strcmp(field, "GATEWAY")) {
	    ni.ni_gateway = addr;
	    ni.ni_flags |= NI_GATEWAY;
	}
    }

    if (debug) {
	printf("Values from file %s:\n", filename);
	printf("Net Address\t%s\n", inet_ntoa(ni.ni_netaddr));
	printf("Mask\t\t%s\n", inet_ntoa(ni.ni_netmask));
	printf("Broadcast\t%s\n", inet_ntoa(ni.ni_broadcast));
	printf("Lowest\t\t%s\n", inet_ntoa(ni.ni_lowest));
	printf("Highest\t\t%s\n", inet_ntoa(ni.ni_highest));
	printf("Recommend\t%s\n", inet_ntoa(ni.ni_recommend));
	printf("Gateway\t\t%s\n", inet_ntoa(ni.ni_gateway));
    }
    fclose(f);
    return(&ni);
}


writefile(filename, ni)
char	*filename;
struct nipinfo *ni;
{
    FILE	*f;

    if ((f = fopen(filename, "w")) == 0) {
	printf("Error writing conf file %s\n", filename);
	return(ERROR);
    }
#define dofield(NI_FLAG, name, ni_field) if (ni->ni_flags & NI_FLAG) fprintf(f, "%s\t%s\n", name, inet_ntoa(ni->ni_field))
    dofield(NI_NETADDR, "NET", ni_netaddr);
    dofield(NI_NETMASK, "MASK", ni_netmask);
    dofield(NI_BROADCAST, "BROADCAST", ni_broadcast);
    dofield(NI_HIGHEST, "HIGHEST", ni_highest);
    dofield(NI_LOWEST, "LOWEST", ni_lowest);
    dofield(NI_GATEWAY, "GATEWAY", ni_gateway);
    dofield(NI_RECOMMEND, "ADDRESS", ni_recommend);
#undef dofield
    fclose(f);
    return(0);
}
