154359Sroberto/*
254359Sroberto * ntptime_config.c
354359Sroberto *
454359Sroberto * What follows is a simplified version of the config parsing code
554359Sroberto * in ntpd/ntp_config.c.  We only parse a subset of the configuration
654359Sroberto * syntax, and don't bother whining about things we don't understand.
754359Sroberto *
854359Sroberto */
954359Sroberto
1054359Sroberto#ifdef HAVE_CONFIG_H
1154359Sroberto# include <config.h>
1254359Sroberto#endif
1354359Sroberto
1454359Sroberto#include "ntp_fp.h"
1554359Sroberto#include "ntp.h"
1654359Sroberto#include "ntp_io.h"
1754359Sroberto#include "ntp_unixtime.h"
1854359Sroberto#include "ntp_filegen.h"
1954359Sroberto#include "ntpdate.h"
2054359Sroberto#include "ntp_syslog.h"
2154359Sroberto#include "ntp_stdlib.h"
2254359Sroberto
2382498Sroberto#include <stdio.h>
2482498Sroberto#include <signal.h>
2582498Sroberto#include <ctype.h>
2682498Sroberto
2754359Sroberto/*
2854359Sroberto * These routines are used to read the configuration file at
2954359Sroberto * startup time.  An entry in the file must fit on a single line.
3054359Sroberto * Entries are processed as multiple tokens separated by white space
3154359Sroberto * Lines are considered terminated when a '#' is encountered.  Blank
3254359Sroberto * lines are ignored.
3354359Sroberto */
3454359Sroberto
3554359Sroberto/*
3654359Sroberto * Configuration file name
3754359Sroberto */
3854359Sroberto#ifndef CONFIG_FILE
3954359Sroberto# ifndef SYS_WINNT
4054359Sroberto#  define	CONFIG_FILE "/etc/ntp.conf"
4154359Sroberto# else /* SYS_WINNT */
4254359Sroberto#  define	CONFIG_FILE 	"%windir%\\ntp.conf"
4354359Sroberto#  define	ALT_CONFIG_FILE "%windir%\\ntp.ini"
4454359Sroberto# endif /* SYS_WINNT */
4554359Sroberto#endif /* not CONFIG_FILE */
4654359Sroberto
4754359Sroberto/*
4854359Sroberto *
4954359Sroberto * We understand the following configuration entries and defaults.
5054359Sroberto *
5154359Sroberto * peer [ addr ] [ version 3 ] [ key 0 ] [ minpoll 6 ] [ maxpoll 10 ]
5254359Sroberto * server [ addr ] [ version 3 ] [ key 0 ] [ minpoll 6 ] [ maxpoll 10 ]
5354359Sroberto * keys file_name
5454359Sroberto */
5554359Sroberto
5654359Sroberto#define CONFIG_UNKNOWN		0
5754359Sroberto
5854359Sroberto#define CONFIG_PEER 		1
5954359Sroberto#define CONFIG_SERVER		2
6054359Sroberto#define CONFIG_KEYS		8
6154359Sroberto
6254359Sroberto#define CONF_MOD_VERSION	1
6354359Sroberto#define CONF_MOD_KEY		2
6454359Sroberto#define CONF_MOD_MINPOLL	3
6554359Sroberto#define CONF_MOD_MAXPOLL	4
6654359Sroberto#define CONF_MOD_PREFER 	5
6754359Sroberto#define CONF_MOD_BURST		6
6854359Sroberto#define CONF_MOD_SKEY		7
6954359Sroberto#define CONF_MOD_TTL		8
7054359Sroberto#define CONF_MOD_MODE		9
7154359Sroberto
7254359Sroberto/*
7354359Sroberto * Translation table - keywords to function index
7454359Sroberto */
7554359Srobertostruct keyword {
7654359Sroberto	const char *text;
7754359Sroberto	int keytype;
7854359Sroberto};
7954359Sroberto
8054359Sroberto/*
8154359Sroberto * Command keywords
8254359Sroberto */
8354359Srobertostatic	struct keyword keywords[] = {
8454359Sroberto	{ "peer",       CONFIG_PEER },
8554359Sroberto	{ "server",     CONFIG_SERVER },
8654359Sroberto	{ "keys",       CONFIG_KEYS },
8754359Sroberto	{ "",           CONFIG_UNKNOWN }
8854359Sroberto};
8954359Sroberto
9054359Sroberto/*
9154359Sroberto * "peer", "server", "broadcast" modifier keywords
9254359Sroberto */
9354359Srobertostatic	struct keyword mod_keywords[] = {
9454359Sroberto	{ "version",    CONF_MOD_VERSION },
9554359Sroberto	{ "key",    CONF_MOD_KEY },
9654359Sroberto	{ "minpoll",    CONF_MOD_MINPOLL },
9754359Sroberto	{ "maxpoll",    CONF_MOD_MAXPOLL },
9854359Sroberto	{ "prefer", CONF_MOD_PREFER },
9954359Sroberto	{ "burst",  CONF_MOD_BURST },
10054359Sroberto	{ "autokey",    CONF_MOD_SKEY },
10154359Sroberto	{ "mode",   CONF_MOD_MODE },    /* reference clocks */
10254359Sroberto	{ "ttl",    CONF_MOD_TTL },     /* NTP peers */
10354359Sroberto	{ "",       CONFIG_UNKNOWN }
10454359Sroberto};
10554359Sroberto
10654359Sroberto/*
10754359Sroberto * Limits on things
10854359Sroberto */
10954359Sroberto#define MAXTOKENS	20	/* 20 tokens on line */
11054359Sroberto#define MAXLINE 	1024	/* maximum length of line */
11154359Sroberto#define MAXFILENAME 128 /* maximum length of a file name (alloca()?) */
11254359Sroberto
11354359Sroberto/*
11454359Sroberto * Miscellaneous macros
11554359Sroberto */
11654359Sroberto#define STRSAME(s1, s2) 	(*(s1) == *(s2) && strcmp((s1), (s2)) == 0)
11754359Sroberto#define ISEOL(c)		((c) == '#' || (c) == '\n' || (c) == '\0')
11854359Sroberto#define ISSPACE(c)		((c) == ' ' || (c) == '\t')
11954359Sroberto#define STREQ(a, b) 	(*(a) == *(b) && strcmp((a), (b)) == 0)
12054359Sroberto
12154359Sroberto/*
12254359Sroberto * Systemwide parameters and flags
12354359Sroberto */
12454359Srobertoextern struct server **sys_servers;	/* the server list */
12554359Srobertoextern int sys_numservers; 	/* number of servers to poll */
12654359Srobertoextern char *key_file;
12754359Sroberto
12854359Sroberto/*
12954359Sroberto * Function prototypes
13054359Sroberto */
13154359Srobertostatic	int gettokens	P((FILE *, char *, char **, int *));
13254359Srobertostatic	int matchkey	P((char *, struct keyword *));
13354359Srobertostatic	int getnetnum	P((const char *num, struct sockaddr_in *addr,
13454359Sroberto			   int complain));
13554359Sroberto
13654359Sroberto
13754359Sroberto/*
13854359Sroberto * loadservers - load list of NTP servers from configuration file
13954359Sroberto */
14054359Srobertovoid
14154359Srobertoloadservers(
14254359Sroberto	char *cfgpath
14354359Sroberto	)
14454359Sroberto{
14554359Sroberto	register int i;
14654359Sroberto	int errflg;
14754359Sroberto	int peerversion;
14854359Sroberto	int minpoll;
14954359Sroberto	int maxpoll;
15054359Sroberto	/* int ttl; */
15154359Sroberto	int srvcnt;
15254359Sroberto	/* u_long peerkey; */
15354359Sroberto	int peerflags;
15454359Sroberto	struct sockaddr_in peeraddr;
15554359Sroberto	FILE *fp;
15654359Sroberto	char line[MAXLINE];
15754359Sroberto	char *(tokens[MAXTOKENS]);
15854359Sroberto	int ntokens;
15954359Sroberto	int tok;
16054359Sroberto	const char *config_file;
16154359Sroberto#ifdef SYS_WINNT
16254359Sroberto	char *alt_config_file;
16354359Sroberto	LPTSTR temp;
16454359Sroberto	char config_file_storage[MAX_PATH];
16554359Sroberto	char alt_config_file_storage[MAX_PATH];
16654359Sroberto#endif /* SYS_WINNT */
16754359Sroberto	struct server *server, *srvlist;
16854359Sroberto
16954359Sroberto	/*
17054359Sroberto	 * Initialize, initialize
17154359Sroberto	 */
17254359Sroberto	srvcnt = 0;
17354359Sroberto	srvlist = 0;
17454359Sroberto	errflg = 0;
17554359Sroberto#ifdef DEBUG
17654359Sroberto	debug = 0;
17754359Sroberto#endif	/* DEBUG */
17854359Sroberto#ifndef SYS_WINNT
17954359Sroberto	config_file = cfgpath ? cfgpath : CONFIG_FILE;
18054359Sroberto#else
18154359Sroberto	if (cfgpath) {
18254359Sroberto		config_file = cfgpath;
18354359Sroberto	} else {
18454359Sroberto		temp = CONFIG_FILE;
18554359Sroberto		if (!ExpandEnvironmentStrings((LPCTSTR)temp, (LPTSTR)config_file_storage, (DWORD)sizeof(config_file_storage))) {
18654359Sroberto			msyslog(LOG_ERR, "ExpandEnvironmentStrings CONFIG_FILE failed: %m\n");
18754359Sroberto			exit(1);
18854359Sroberto		}
18954359Sroberto		config_file = config_file_storage;
19054359Sroberto	}
19154359Sroberto
19254359Sroberto	temp = ALT_CONFIG_FILE;
19354359Sroberto	if (!ExpandEnvironmentStrings((LPCTSTR)temp, (LPTSTR)alt_config_file_storage, (DWORD)sizeof(alt_config_file_storage))) {
19454359Sroberto		msyslog(LOG_ERR, "ExpandEnvironmentStrings ALT_CONFIG_FILE failed: %m\n");
19554359Sroberto		exit(1);
19654359Sroberto	}
19754359Sroberto	alt_config_file = alt_config_file_storage;
19854359SrobertoM
19954359Sroberto#endif /* SYS_WINNT */
20054359Sroberto
20154359Sroberto	if ((fp = fopen(FindConfig(config_file), "r")) == NULL)
20254359Sroberto	{
20354359Sroberto		fprintf(stderr, "getconfig: Couldn't open <%s>\n", FindConfig(config_file));
20454359Sroberto		msyslog(LOG_INFO, "getconfig: Couldn't open <%s>", FindConfig(config_file));
20554359Sroberto#ifdef SYS_WINNT
20654359Sroberto		/* Under WinNT try alternate_config_file name, first NTP.CONF, then NTP.INI */
20754359Sroberto
20854359Sroberto		if ((fp = fopen(FindConfig(alt_config_file), "r")) == NULL) {
20954359Sroberto
21054359Sroberto			/*
21154359Sroberto			 * Broadcast clients can sometimes run without
21254359Sroberto			 * a configuration file.
21354359Sroberto			 */
21454359Sroberto
21554359Sroberto			fprintf(stderr, "getconfig: Couldn't open <%s>\n", FindConfig(alt_config_file));
21654359Sroberto			msyslog(LOG_INFO, "getconfig: Couldn't open <%s>", FindConfig(alt_config_file));
21754359Sroberto			return;
21854359Sroberto		}
21954359Sroberto#else  /* not SYS_WINNT */
22054359Sroberto		return;
22154359Sroberto#endif /* not SYS_WINNT */
22254359Sroberto	}
22354359Sroberto
22454359Sroberto	while ((tok = gettokens(fp, line, tokens, &ntokens))
22554359Sroberto	       != CONFIG_UNKNOWN) {
22654359Sroberto		switch(tok) {
22754359Sroberto		    case CONFIG_PEER:
22854359Sroberto		    case CONFIG_SERVER:
22954359Sroberto
23054359Sroberto			if (ntokens < 2) {
23154359Sroberto				msyslog(LOG_ERR,
23254359Sroberto					"No address for %s, line ignored",
23354359Sroberto					tokens[0]);
23454359Sroberto				break;
23554359Sroberto			}
23654359Sroberto
23754359Sroberto			if (!getnetnum(tokens[1], &peeraddr, 1)) {
23854359Sroberto				/* Resolve now, or lose! */
23954359Sroberto				break;
24054359Sroberto			} else {
24154359Sroberto				errflg = 0;
24254359Sroberto
24354359Sroberto				/* Shouldn't be able to specify multicast */
24454359Sroberto				if (IN_CLASSD(ntohl(peeraddr.sin_addr.s_addr))
24554359Sroberto				    || ISBADADR(&peeraddr)) {
24654359Sroberto					msyslog(LOG_ERR,
24754359Sroberto						"attempt to configure invalid address %s",
24854359Sroberto						ntoa(&peeraddr));
24954359Sroberto					break;
25054359Sroberto				}
25154359Sroberto			}
25254359Sroberto
25354359Sroberto			peerversion = NTP_VERSION;
25454359Sroberto			minpoll = NTP_MINDPOLL;
25554359Sroberto			maxpoll = NTP_MAXDPOLL;
25654359Sroberto			/* peerkey = 0; */
25754359Sroberto			peerflags = 0;
25854359Sroberto			/* ttl = 0; */
25954359Sroberto			for (i = 2; i < ntokens; i++)
26054359Sroberto			    switch (matchkey(tokens[i], mod_keywords)) {
26154359Sroberto				case CONF_MOD_VERSION:
26254359Sroberto				    if (i >= ntokens-1) {
26354359Sroberto					    msyslog(LOG_ERR,
26454359Sroberto						    "peer/server version requires an argument");
26554359Sroberto					    errflg = 1;
26654359Sroberto					    break;
26754359Sroberto				    }
26854359Sroberto				    peerversion = atoi(tokens[++i]);
26954359Sroberto				    if ((u_char)peerversion > NTP_VERSION
27054359Sroberto					|| (u_char)peerversion < NTP_OLDVERSION) {
27154359Sroberto					    msyslog(LOG_ERR,
27254359Sroberto						    "inappropriate version number %s, line ignored",
27354359Sroberto						    tokens[i]);
27454359Sroberto					    errflg = 1;
27554359Sroberto				    }
27654359Sroberto				    break;
27754359Sroberto
27854359Sroberto				case CONF_MOD_KEY:
27954359Sroberto				    if (i >= ntokens-1) {
28054359Sroberto					    msyslog(LOG_ERR,
28154359Sroberto						    "key: argument required");
28254359Sroberto					    errflg = 1;
28354359Sroberto					    break;
28454359Sroberto				    }
28554359Sroberto				    ++i;
28654359Sroberto				    /* peerkey = (int)atol(tokens[i]); */
28754359Sroberto				    peerflags |= FLAG_AUTHENABLE;
28854359Sroberto				    break;
28954359Sroberto
29054359Sroberto				case CONF_MOD_MINPOLL:
29154359Sroberto				    if (i >= ntokens-1) {
29254359Sroberto					    msyslog(LOG_ERR,
29354359Sroberto						    "minpoll: argument required");
29454359Sroberto					    errflg = 1;
29554359Sroberto					    break;
29654359Sroberto				    }
29754359Sroberto				    minpoll = atoi(tokens[++i]);
29854359Sroberto				    if (minpoll < NTP_MINPOLL)
29954359Sroberto					minpoll = NTP_MINPOLL;
30054359Sroberto				    break;
30154359Sroberto
30254359Sroberto				case CONF_MOD_MAXPOLL:
30354359Sroberto				    if (i >= ntokens-1) {
30454359Sroberto					    msyslog(LOG_ERR,
30554359Sroberto						    "maxpoll: argument required"
30654359Sroberto						    );
30754359Sroberto					    errflg = 1;
30854359Sroberto					    break;
30954359Sroberto				    }
31054359Sroberto				    maxpoll = atoi(tokens[++i]);
31154359Sroberto				    if (maxpoll > NTP_MAXPOLL)
31254359Sroberto					maxpoll = NTP_MAXPOLL;
31354359Sroberto				    break;
31454359Sroberto
31554359Sroberto				case CONF_MOD_PREFER:
31654359Sroberto				    peerflags |= FLAG_PREFER;
31754359Sroberto				    break;
31854359Sroberto
31954359Sroberto				case CONF_MOD_BURST:
32054359Sroberto				    peerflags |= FLAG_BURST;
32154359Sroberto				    break;
32254359Sroberto
32354359Sroberto				case CONF_MOD_SKEY:
32454359Sroberto				    peerflags |= FLAG_SKEY | FLAG_AUTHENABLE;
32554359Sroberto				    break;
32654359Sroberto
32754359Sroberto				case CONF_MOD_TTL:
32854359Sroberto				    if (i >= ntokens-1) {
32954359Sroberto					    msyslog(LOG_ERR,
33054359Sroberto						    "ttl: argument required");
33154359Sroberto					    errflg = 1;
33254359Sroberto					    break;
33354359Sroberto				    }
33454359Sroberto				    ++i;
33554359Sroberto				    /* ttl = atoi(tokens[i]); */
33654359Sroberto				    break;
33754359Sroberto
33854359Sroberto				case CONF_MOD_MODE:
33954359Sroberto				    if (i >= ntokens-1) {
34054359Sroberto					    msyslog(LOG_ERR,
34154359Sroberto						    "mode: argument required");
34254359Sroberto					    errflg = 1;
34354359Sroberto					    break;
34454359Sroberto				    }
34554359Sroberto				    ++i;
34654359Sroberto				    /* ttl = atoi(tokens[i]); */
34754359Sroberto				    break;
34854359Sroberto
34954359Sroberto				case CONFIG_UNKNOWN:
35054359Sroberto				    errflg = 1;
35154359Sroberto				    break;
35254359Sroberto			    }
35354359Sroberto			if (minpoll > maxpoll) {
35454359Sroberto				msyslog(LOG_ERR, "config error: minpoll > maxpoll");
35554359Sroberto				errflg = 1;
35654359Sroberto			}
35754359Sroberto			if (errflg == 0) {
35854359Sroberto				server = (struct server *)emalloc(sizeof(struct server));
35954359Sroberto				memset((char *)server, 0, sizeof(struct server));
36054359Sroberto				server->srcadr = peeraddr;
36154359Sroberto				server->version = peerversion;
36254359Sroberto				server->dispersion = PEER_MAXDISP;
36354359Sroberto				server->next_server = srvlist;
36454359Sroberto				srvlist = server;
36554359Sroberto				srvcnt++;
36654359Sroberto			}
36754359Sroberto			break;
36854359Sroberto
36954359Sroberto			case CONFIG_KEYS:
37054359Sroberto			if (ntokens >= 2) {
37154359Sroberto				key_file = (char *) emalloc(strlen(tokens[1]) + 1);
37254359Sroberto				strcpy(key_file, tokens[1]);
37354359Sroberto			}
37454359Sroberto			break;
37554359Sroberto		}
37654359Sroberto	}
37754359Sroberto	(void) fclose(fp);
37854359Sroberto
37954359Sroberto	/* build final list */
38054359Sroberto	sys_numservers = srvcnt;
38154359Sroberto	sys_servers = (struct server **)
38254359Sroberto	    emalloc(sys_numservers * sizeof(struct server *));
38354359Sroberto	for(i=0;i<sys_numservers;i++) {
38454359Sroberto		sys_servers[i] = srvlist;
38554359Sroberto		srvlist = srvlist->next_server;
38654359Sroberto	}
38754359Sroberto}
38854359Sroberto
38954359Sroberto
39054359Sroberto
39154359Sroberto/*
39254359Sroberto * gettokens - read a line and return tokens
39354359Sroberto */
39454359Srobertostatic int
39554359Srobertogettokens(
39654359Sroberto	FILE *fp,
39754359Sroberto	char *line,
39854359Sroberto	char **tokenlist,
39954359Sroberto	int *ntokens
40054359Sroberto	)
40154359Sroberto{
40254359Sroberto	register char *cp;
40354359Sroberto	register int eol;
40454359Sroberto	register int ntok;
40554359Sroberto	register int quoted = 0;
40654359Sroberto
40754359Sroberto	/*
40854359Sroberto	 * Find start of first token
40954359Sroberto	 */
41054359Sroberto	again:
41154359Sroberto	while ((cp = fgets(line, MAXLINE, fp)) != NULL) {
41254359Sroberto		cp = line;
41354359Sroberto		while (ISSPACE(*cp))
41454359Sroberto			cp++;
41554359Sroberto		if (!ISEOL(*cp))
41654359Sroberto			break;
41754359Sroberto	}
41854359Sroberto	if (cp == NULL) {
41954359Sroberto		*ntokens = 0;
42054359Sroberto		return CONFIG_UNKNOWN;	/* hack.  Is recognized as EOF */
42154359Sroberto	}
42254359Sroberto
42354359Sroberto	/*
42454359Sroberto	 * Now separate out the tokens
42554359Sroberto	 */
42654359Sroberto	eol = 0;
42754359Sroberto	ntok = 0;
42854359Sroberto	while (!eol) {
42954359Sroberto		tokenlist[ntok++] = cp;
43054359Sroberto		while (!ISEOL(*cp) && (!ISSPACE(*cp) || quoted))
43154359Sroberto			quoted ^= (*cp++ == '"');
43254359Sroberto
43354359Sroberto		if (ISEOL(*cp)) {
43454359Sroberto			*cp = '\0';
43554359Sroberto			eol = 1;
43654359Sroberto		} else {		/* must be space */
43754359Sroberto			*cp++ = '\0';
43854359Sroberto			while (ISSPACE(*cp))
43954359Sroberto				cp++;
44054359Sroberto			if (ISEOL(*cp))
44154359Sroberto				eol = 1;
44254359Sroberto		}
44354359Sroberto		if (ntok == MAXTOKENS)
44454359Sroberto			eol = 1;
44554359Sroberto	}
44654359Sroberto
44754359Sroberto	/*
44854359Sroberto	 * Return the match
44954359Sroberto	 */
45054359Sroberto	*ntokens = ntok;
45154359Sroberto	ntok = matchkey(tokenlist[0], keywords);
45254359Sroberto	if (ntok == CONFIG_UNKNOWN)
45354359Sroberto		goto again;
45454359Sroberto	return ntok;
45554359Sroberto}
45654359Sroberto
45754359Sroberto
45854359Sroberto
45954359Sroberto/*
46054359Sroberto * matchkey - match a keyword to a list
46154359Sroberto */
46254359Srobertostatic int
46354359Srobertomatchkey(
46454359Sroberto	register char *word,
46554359Sroberto	register struct keyword *keys
46654359Sroberto	)
46754359Sroberto{
46854359Sroberto	for (;;) {
46954359Sroberto		if (keys->keytype == CONFIG_UNKNOWN) {
47054359Sroberto			return CONFIG_UNKNOWN;
47154359Sroberto		}
47254359Sroberto		if (STRSAME(word, keys->text))
47354359Sroberto			return keys->keytype;
47454359Sroberto		keys++;
47554359Sroberto	}
47654359Sroberto}
47754359Sroberto
47854359Sroberto
47954359Sroberto/*
48054359Sroberto * getnetnum - return a net number (this is crude, but careful)
48154359Sroberto */
48254359Srobertostatic int
48354359Srobertogetnetnum(
48454359Sroberto	const char *num,
48554359Sroberto	struct sockaddr_in *addr,
48654359Sroberto	int complain
48754359Sroberto	)
48854359Sroberto{
48954359Sroberto	register const char *cp;
49054359Sroberto	register char *bp;
49154359Sroberto	register int i;
49254359Sroberto	register int temp;
49354359Sroberto	char buf[80];		/* will core dump on really stupid stuff */
49454359Sroberto	u_int32 netnum;
49554359Sroberto
49654359Sroberto	/* XXX ELIMINATE replace with decodenetnum */
49754359Sroberto	cp = num;
49854359Sroberto	netnum = 0;
49954359Sroberto	for (i = 0; i < 4; i++) {
50054359Sroberto		bp = buf;
50154359Sroberto		while (isdigit((int)*cp))
50254359Sroberto			*bp++ = *cp++;
50354359Sroberto		if (bp == buf)
50454359Sroberto			break;
50554359Sroberto
50654359Sroberto		if (i < 3) {
50754359Sroberto			if (*cp++ != '.')
50854359Sroberto				break;
50954359Sroberto		} else if (*cp != '\0')
51054359Sroberto			break;
51154359Sroberto
51254359Sroberto		*bp = '\0';
51354359Sroberto		temp = atoi(buf);
51454359Sroberto		if (temp > 255)
51554359Sroberto			break;
51654359Sroberto		netnum <<= 8;
51754359Sroberto		netnum += temp;
51854359Sroberto#ifdef DEBUG
51954359Sroberto		if (debug > 3)
52054359Sroberto			printf("getnetnum %s step %d buf %s temp %d netnum %lu\n",
52154359Sroberto			   num, i, buf, temp, (u_long)netnum);
52254359Sroberto#endif
52354359Sroberto	}
52454359Sroberto
52554359Sroberto	if (i < 4) {
52654359Sroberto		if (complain)
52754359Sroberto			msyslog(LOG_ERR,
52854359Sroberto				"getnetnum: \"%s\" invalid host number, line ignored",
52954359Sroberto				num);
53054359Sroberto#ifdef DEBUG
53154359Sroberto		if (debug > 3)
53254359Sroberto			printf(
53354359Sroberto				"getnetnum: \"%s\" invalid host number, line ignored\n",
53454359Sroberto				num);
53554359Sroberto#endif
53654359Sroberto		return 0;
53754359Sroberto	}
53854359Sroberto
53954359Sroberto	/*
54054359Sroberto	 * make up socket address.	Clear it out for neatness.
54154359Sroberto	 */
54254359Sroberto	memset((void *)addr, 0, sizeof(struct sockaddr_in));
54354359Sroberto	addr->sin_family = AF_INET;
54454359Sroberto	addr->sin_port = htons(NTP_PORT);
54554359Sroberto	addr->sin_addr.s_addr = htonl(netnum);
54654359Sroberto#ifdef DEBUG
54754359Sroberto	if (debug > 1)
54854359Sroberto		printf("getnetnum given %s, got %s (%lx)\n",
54954359Sroberto		   num, ntoa(addr), (u_long)netnum);
55054359Sroberto#endif
55154359Sroberto	return 1;
55254359Sroberto}
553