BBN-Vax-TCP/src/util/mkgate.c

Compare this file to the similar file:
Show the results in this format:

#define BBNNET
#include <stdio.h>
#include "netlib.h"
#include <sys/types.h>
#include "net.h"
#include "ifcb.h"
/*
 * mkgate [-i infile] [-o outfile]
 *
 * Generates a binary gateway file from ascii.  Records are of the form:
 * 
 * [ <loc net> -> <for net> via <gateway> [ flags <flag> ] ] [ ; [ <comment> ] ]
 */
int eof = 0;
int nrecs = 0;
int lines = 0;
char defin[] = "/etc/net/gateway";
char defout[] = "/etc/net/gateway.bin";

#define NCHAR 80
char line[NCHAR] = "";
char *lp = line;
FILE *fd;
extern errno;
extern char *progname;

main(argc, argv)
int argc;
char *argv[];
{
	register char *s;
	register out;
	register char *infile, *outfile;
	char *backfile;
	int error = 0;
	int recs = 0;
	int flags;
	struct gway gate;
	netaddr addr;
	char *getword();
	char *scat();
	progname = *argv;

	infile = defin;
	outfile = defout;

	while (argc > 1 && argv[1][0] == '-') {
		switch (argv[1][1]) {

		case 'i':			/* input file */
			if (argc < 3)
				goto bad;
			infile = argv[2];
			break;

		case 'o':			/* output file */
			if (argc < 3)
				goto bad;
			outfile = argv[2];
			break;

		default: bad:
			ecmderr(0, "usage: %s [-i <infile>] [-o <outfile>]\n",
				argv[0]);
		}
		argv += 2; argc -= 2;
	}
	/*
	 * open input file
	 */
	if ((fd = fopen(infile, "r")) == NULL)
		ecmderr(errno, "Can't open input file \"%s\".\n", infile);
	/*
	 * if output file exists, try to back it up in outfile~
	 */
	backfile = scat(outfile, "~");
	if (access(outfile, 0) == 0) {
		unlink(backfile);
		if (link(outfile, backfile) < 0)
			ecmderr(errno, "Cannot backup \"%s\".\n", outfile);
		unlink(outfile);
	}

	if ((out = creat(outfile, 0644)) < 0)
		ecmderr(errno, "Can't create output file \"%s\".\n", outfile);
	/* 
	 * read the input file and generate output
	 */
	getword();
	for (;;) {
		/*
		 * ignore blank lines, exit on eof
		 */
		if ((s = getword()) == NULL && !eof)
			continue;
		else if (eof)
			break;
		/*
		 * check local network name
		 */
		if (isbadnet(gate.g_lnet = (net_t)getnet(s))) {
			cmderr(0, "\"%s\" line %d: bad local net \"%s\".\n",
				infile, lines, s);
			error++;
			break;
		}
		if ((s = getword()) == NULL || !seq(s, "->") || 
		    (s = getword()) == NULL) {
			badform(infile, lines);
			error++;
			break;
		}
		/*
		 * check foreign network name
		 */
		if (isbadnet(gate.g_fnet = (net_t)getnet(s))) {
			cmderr(0, "\"%s\" line %d: bad foreign net \"%s\".\n",
				infile, lines, s);
			error++;
			break;
		}
		if ((s = getword()) == NULL || !seq(s, "via") || 
		    (s = getword()) == NULL) {
			badform(infile, lines);
			error++;
			break;
		}
		/*
		 * check gateway name
		 */
		addr = getnhost(s, gate.g_lnet);
		if (isbadhost(addr)) {
			cmderr(0, "\"%s\" line %d: bad gateway \"%s\".\n",
				infile, lines, s);
			error++;
			break;
		}
		gate.g_local.s_addr = addr._na_l;
		/*
		 * check for flags
		 */
		if ((s = getword()) != NULL && seq(s, "flags")) {
			if ((s = getword()) == NULL) {
				badform(infile, lines);
				error++;
				break;
			}
			flags = atoi(s);
		}
		gate.g_flags = GWFORMAT | flags;
		gate.g_ifcb = NULL;
		flags = 0;
		/*
		 * write an output file record
		 */
		if (write(out, &gate, sizeof gate) != sizeof gate) {
			cmderr(errno, "Error writing output file \"%s\".\n",
				outfile);
			error++;
			break;
		} else
			recs++;
	}
	/*
	 * go to backup copy if any errors
	 */
	if (error) {
		unlink(outfile);
		link(backfile, outfile);
		unlink(outfile);
		exit(1);
	} else
		printf("Gateway file \"%s\" written from \"%s\", %d entries.\n",
			outfile, infile, recs);
}	
			
/*
 * get a token from the input file
 */
char *getword()
{
	char *word;  
	register c;

	/*
	 * skip separators
	 */
	for (;;)
		switch (*lp) {

		case ' ': case '\t':	/* token separators */
			lp++;
			break;
		
		case ';':		/* line separators */
		case '\n':
		case 0:
			if (fgets(line, NCHAR, fd) == NULL) 
				eof++;
			else {
				lines++;
				lp = line;
			}
			return(NULL);
		
		default:
			goto span;
		}

	/*
	 * span token until separator
	 */
span:
	word = lp;

	while ((c= *(++lp)) && c != ' ' && c != '\t' && c != ';' && c != '\n');
	*lp = 0;
	if (c != 0 && c != ';' && c != '\n')
		lp++;
	return(word);
}

badform(file, line)
char *file;
int line;
{
	cmderr(0, "\"%s\" line %d: syntax error.\n", file, line);
}