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