⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ntp_config.c

📁 网络时间协议NTP 源码 版本v4.2.0b 该源码用于linux平台下
💻 C
📖 第 1 页 / 共 4 页
字号:
/* * ntp_config.c - read and apply configuration information */#ifdef HAVE_CONFIG_H# include <config.h>#endif#ifdef HAVE_NETINFO# include <netinfo/ni.h>#endif#include "ntpd.h"#include "ntp_io.h"#include "ntp_unixtime.h"#include "ntp_refclock.h"#include "ntp_filegen.h"#include "ntp_stdlib.h"#include <ntp_random.h>#include <isc/net.h>#include <isc/result.h>#include <stdio.h>#include <ctype.h>#ifdef HAVE_SYS_PARAM_H#include <sys/param.h>#endif#include <signal.h>#ifndef SIGCHLD# define SIGCHLD SIGCLD#endif#if !defined(VMS)# ifdef HAVE_SYS_WAIT_H#  include <sys/wait.h># endif#endif /* VMS */#ifdef SYS_WINNT# include <io.h>HANDLE ResolverThreadHandle = NULL;#endif /* SYS_WINNT *//* * [Bug 467]: Some linux headers collide with CONFIG_PHONE and CONFIG_KEYS * so #include these later. */#include "ntp_config.h"#include "ntp_cmdargs.h"extern int priority_done;/* * These routines are used to read the configuration file at * startup time.  An entry in the file must fit on a single line. * Entries are processed as multiple tokens separated by white space * Lines are considered terminated when a '#' is encountered.  Blank * lines are ignored. *//* * Translation table - keywords to function index */struct keyword {	const char *text;	int keytype;};/* * Command keywords */static	struct keyword keywords[] = {	{ "automax",		CONFIG_AUTOMAX },	{ "broadcast",		CONFIG_BROADCAST },	{ "broadcastclient",	CONFIG_BROADCASTCLIENT },	{ "broadcastdelay",	CONFIG_BDELAY },	{ "calldelay",		CONFIG_CDELAY},#ifdef OPENSSL	{ "crypto",		CONFIG_CRYPTO },#endif /* OPENSSL */	{ "controlkey",		CONFIG_CONTROLKEY },	{ "disable",		CONFIG_DISABLE },	{ "driftfile",		CONFIG_DRIFTFILE },	{ "enable",		CONFIG_ENABLE },	{ "end",		CONFIG_END },	{ "filegen",		CONFIG_FILEGEN },	{ "fudge",		CONFIG_FUDGE },	{ "includefile",	CONFIG_INCLUDEFILE },	{ "keys",		CONFIG_KEYS },	{ "keysdir",		CONFIG_KEYSDIR },	{ "logconfig",		CONFIG_LOGCONFIG },	{ "logfile",		CONFIG_LOGFILE },	{ "manycastclient",	CONFIG_MANYCASTCLIENT },	{ "manycastserver",	CONFIG_MANYCASTSERVER },	{ "multicastclient",	CONFIG_MULTICASTCLIENT },	{ "peer",		CONFIG_PEER },	{ "phone",		CONFIG_PHONE },	{ "pidfile",		CONFIG_PIDFILE },	{ "discard",		CONFIG_DISCARD },	{ "requestkey",		CONFIG_REQUESTKEY },	{ "restrict",		CONFIG_RESTRICT },	{ "revoke",		CONFIG_REVOKE },	{ "server",		CONFIG_SERVER },	{ "setvar",		CONFIG_SETVAR },	{ "statistics",		CONFIG_STATISTICS },	{ "statsdir",		CONFIG_STATSDIR },	{ "tick",		CONFIG_ADJ },	{ "tinker",		CONFIG_TINKER },	{ "tos",		CONFIG_TOS },	{ "trap",		CONFIG_TRAP },	{ "trustedkey",		CONFIG_TRUSTEDKEY },	{ "ttl",		CONFIG_TTL },	{ "",			CONFIG_UNKNOWN }};/* * "peer", "server", "broadcast" modifier keywords */static	struct keyword mod_keywords[] = {	{ "autokey",		CONF_MOD_SKEY },	{ "burst",		CONF_MOD_BURST },	{ "iburst",		CONF_MOD_IBURST },	{ "key",		CONF_MOD_KEY },	{ "maxpoll",		CONF_MOD_MAXPOLL },	{ "minpoll",		CONF_MOD_MINPOLL },	{ "mode",		CONF_MOD_MODE },    /* refclocks */	{ "noselect",		CONF_MOD_NOSELECT },	{ "preempt",		CONF_MOD_PREEMPT },	{ "true",		CONF_MOD_TRUE },	{ "prefer",		CONF_MOD_PREFER },	{ "ttl",		CONF_MOD_TTL },     /* NTP peers */	{ "version",		CONF_MOD_VERSION },	{ "",			CONFIG_UNKNOWN }};/* * "restrict" modifier keywords */static	struct keyword res_keywords[] = {	{ "ignore",		CONF_RES_IGNORE },	{ "limited",		CONF_RES_LIMITED },	{ "kod",		CONF_RES_DEMOBILIZE },	{ "lowpriotrap",	CONF_RES_LPTRAP },	{ "mask",		CONF_RES_MASK },	{ "nomodify",		CONF_RES_NOMODIFY },	{ "nopeer",		CONF_RES_NOPEER },	{ "noquery",		CONF_RES_NOQUERY },	{ "noserve",		CONF_RES_NOSERVE },	{ "notrap",		CONF_RES_NOTRAP },	{ "notrust",		CONF_RES_NOTRUST },	{ "ntpport",		CONF_RES_NTPPORT },	{ "version",		CONF_RES_VERSION },	{ "",			CONFIG_UNKNOWN }};/* * "trap" modifier keywords */static	struct keyword trap_keywords[] = {	{ "port",		CONF_TRAP_PORT },	{ "interface",		CONF_TRAP_INTERFACE },	{ "",			CONFIG_UNKNOWN }};/* * "fudge" modifier keywords */static	struct keyword fudge_keywords[] = {	{ "flag1",		CONF_FDG_FLAG1 },	{ "flag2",		CONF_FDG_FLAG2 },	{ "flag3",		CONF_FDG_FLAG3 },	{ "flag4",		CONF_FDG_FLAG4 },	{ "refid",		CONF_FDG_REFID }, /* this mapping should be cleaned up (endianness, \0) - kd 20041031 */	{ "stratum",		CONF_FDG_STRATUM },	{ "time1",		CONF_FDG_TIME1 },	{ "time2",		CONF_FDG_TIME2 },	{ "",			CONFIG_UNKNOWN }};/* * "filegen" modifier keywords */static	struct keyword filegen_keywords[] = {	{ "disable",		CONF_FGEN_FLAG_DISABLE },	{ "enable",		CONF_FGEN_FLAG_ENABLE },	{ "file",		CONF_FGEN_FILE },	{ "link",		CONF_FGEN_FLAG_LINK },	{ "nolink",		CONF_FGEN_FLAG_NOLINK },	{ "type",		CONF_FGEN_TYPE },	{ "",			CONFIG_UNKNOWN }};/* * "type" modifier keywords */static	struct keyword fgen_types[] = {	{ "age",		FILEGEN_AGE   },	{ "day",		FILEGEN_DAY   },	{ "month",		FILEGEN_MONTH },	{ "none",		FILEGEN_NONE  },	{ "pid",		FILEGEN_PID   },	{ "week",		FILEGEN_WEEK  },	{ "year",		FILEGEN_YEAR  },	{ "",			CONFIG_UNKNOWN}};/* * "enable", "disable" modifier keywords */static struct keyword flags_keywords[] = {	{ "auth",		PROTO_AUTHENTICATE },	{ "bclient",		PROTO_BROADCLIENT },	{ "calibrate",		PROTO_CAL },	{ "kernel",		PROTO_KERNEL },	{ "monitor",		PROTO_MONITOR },	{ "ntp",		PROTO_NTP },	{ "stats",		PROTO_FILEGEN },	{ "",			CONFIG_UNKNOWN }};/* * "discard" modifier keywords */static struct keyword discard_keywords[] = {	{ "average",		CONF_DISCARD_AVERAGE },	{ "minimum",		CONF_DISCARD_MINIMUM },	{ "monitor",		CONF_DISCARD_MONITOR },	{ "",			CONFIG_UNKNOWN }};/* * "tinker" modifier keywords */static struct keyword tinker_keywords[] = {	{ "step",		CONF_CLOCK_MAX },	{ "panic",		CONF_CLOCK_PANIC },	{ "dispersion",		CONF_CLOCK_PHI },	{ "stepout",		CONF_CLOCK_MINSTEP },	{ "allan",		CONF_CLOCK_ALLAN },	{ "huffpuff",		CONF_CLOCK_HUFFPUFF },	{ "freq",		CONF_CLOCK_FREQ },	{ "",			CONFIG_UNKNOWN }};/* * "tos" modifier keywords */static struct keyword tos_keywords[] = {	{ "minclock",		CONF_TOS_MINCLOCK },	{ "maxclock",		CONF_TOS_MAXCLOCK },	{ "minsane",		CONF_TOS_MINSANE },	{ "floor",		CONF_TOS_FLOOR },	{ "ceiling",		CONF_TOS_CEILING },	{ "cohort",		CONF_TOS_COHORT },	{ "mindist",		CONF_TOS_MINDISP },	{ "maxdist",		CONF_TOS_MAXDIST },	{ "maxhop",		CONF_TOS_MAXHOP },	{ "beacon",		CONF_TOS_BEACON },	{ "orphan",		CONF_TOS_ORPHAN },	{ "",			CONFIG_UNKNOWN }};#ifdef OPENSSL/* * "crypto" modifier keywords */static struct keyword crypto_keywords[] = {	{ "cert",		CONF_CRYPTO_CERT },	{ "gqpar",		CONF_CRYPTO_GQPAR },	{ "host",		CONF_CRYPTO_RSA },	{ "ident",		CONF_CRYPTO_IDENT },	{ "iffpar",		CONF_CRYPTO_IFFPAR },	{ "leap",		CONF_CRYPTO_LEAP },	{ "mvpar",		CONF_CRYPTO_MVPAR },	{ "pw",			CONF_CRYPTO_PW },	{ "randfile",		CONF_CRYPTO_RAND },	{ "sign",		CONF_CRYPTO_SIGN },	{ "",			CONFIG_UNKNOWN }};#endif /* OPENSSL *//* * Address type selection, IPv4 or IPv4. * Used on various lines. */static struct keyword addr_type[] = {	{ "-4",			CONF_ADDR_IPV4 },	{ "-6",			CONF_ADDR_IPV6 },	{ "",			CONFIG_UNKNOWN }};/* * "logconfig" building blocks */struct masks {	const char	  *name;	unsigned long mask;};static struct masks logcfg_class[] = {	{ "clock",		NLOG_OCLOCK },	{ "peer",		NLOG_OPEER },	{ "sync",		NLOG_OSYNC },	{ "sys",		NLOG_OSYS },	{ (char *)0,	0 }};static struct masks logcfg_item[] = {	{ "info",		NLOG_INFO },	{ "allinfo",		NLOG_SYSINFO|NLOG_PEERINFO|NLOG_CLOCKINFO|NLOG_SYNCINFO },	{ "events",		NLOG_EVENT },	{ "allevents",		NLOG_SYSEVENT|NLOG_PEEREVENT|NLOG_CLOCKEVENT|NLOG_SYNCEVENT },	{ "status",		NLOG_STATUS },	{ "allstatus",		NLOG_SYSSTATUS|NLOG_PEERSTATUS|NLOG_CLOCKSTATUS|NLOG_SYNCSTATUS },	{ "statistics",		NLOG_STATIST },	{ "allstatistics",	NLOG_SYSSTATIST|NLOG_PEERSTATIST|NLOG_CLOCKSTATIST|NLOG_SYNCSTATIST },	{ "allclock",		(NLOG_INFO|NLOG_STATIST|NLOG_EVENT|NLOG_STATUS)<<NLOG_OCLOCK },	{ "allpeer",		(NLOG_INFO|NLOG_STATIST|NLOG_EVENT|NLOG_STATUS)<<NLOG_OPEER },	{ "allsys",		(NLOG_INFO|NLOG_STATIST|NLOG_EVENT|NLOG_STATUS)<<NLOG_OSYS },	{ "allsync",		(NLOG_INFO|NLOG_STATIST|NLOG_EVENT|NLOG_STATUS)<<NLOG_OSYNC },	{ "all",		NLOG_SYSMASK|NLOG_PEERMASK|NLOG_CLOCKMASK|NLOG_SYNCMASK },	{ (char *)0,	0 }};/* * Limits on things */#define MAXTOKENS	20	/* 20 tokens on line */#define MAXLINE		1024	/* maximum length of line */#define MAXPHONE	10	/* maximum number of phone strings */#define MAXPPS		20	/* maximum length of PPS device string */#define MAXINCLUDELEVEL	5	/* maximum include file levels *//* * Miscellaneous macros */#define STRSAME(s1, s2)	(*(s1) == *(s2) && strcmp((s1), (s2)) == 0)#define ISEOL(c)	((c) == '#' || (c) == '\n' || (c) == '\0')#define ISSPACE(c)	((c) == ' ' || (c) == '\t')#define STREQ(a, b)	(*(a) == *(b) && strcmp((a), (b)) == 0)#define KEY_TYPE_MD5	4/* * File descriptor used by the resolver save routines, and temporary file * name. */int call_resolver = 1;		/* ntp-genkeys sets this to 0, for example */static FILE *res_fp;#ifndef SYS_WINNTstatic char res_file[20];	/* enough for /tmp/ntpXXXXXX\0 */#define RES_TEMPFILE	"/tmp/ntpXXXXXX"#elsestatic char res_file[MAX_PATH];#endif /* SYS_WINNT *//* * Definitions of things either imported from or exported to outside */short default_ai_family = AF_UNSPEC;	/* Default either IPv4 or IPv6 */char const *progname;char	*sys_phone[MAXPHONE] = {NULL}; /* ACTS phone numbers */char	*keysdir = NTP_KEYSDIR;	/* crypto keys directory */#if defined(HAVE_SCHED_SETSCHEDULER)int	config_priority_override = 0;int	config_priority;#endifconst char *config_file;#ifdef HAVE_NETINFO struct netinfo_config_state *config_netinfo = NULL; int check_netinfo = 1;#endif /* HAVE_NETINFO */#ifdef SYS_WINNT char *alt_config_file; LPTSTR temp; char config_file_storage[MAX_PATH]; char alt_config_file_storage[MAX_PATH];#endif /* SYS_WINNT */#ifdef HAVE_NETINFO/* * NetInfo configuration state */struct netinfo_config_state {	void *domain;		/* domain with config */	ni_id config_dir;	/* ID config dir      */	int prop_index;		/* current property   */	int val_index;		/* current value      */	char **val_list;       	/* value list         */};#endif/* * Function prototypes */static	unsigned long get_pfxmatch P((char **, struct masks *));static	unsigned long get_match P((char *, struct masks *));static	unsigned long get_logmask P((char *));#ifdef HAVE_NETINFOstatic	struct netinfo_config_state *get_netinfo_config P((void));static	void free_netinfo_config P((struct netinfo_config_state *));static	int gettokens_netinfo P((struct netinfo_config_state *, char **, int *));#endifstatic	int gettokens P((FILE *, char *, char **, int *));static	int matchkey P((char *, struct keyword *, int));enum gnn_type {	t_UNK,		/* Unknown */	t_REF,		/* Refclock */	t_MSK,		/* Network Mask */	};static	int getnetnum P((const char *, struct sockaddr_storage *, int,			 enum gnn_type));static	void save_resolve P((char *, int, int, int, int, u_int, int,    keyid_t, u_char *));static	void do_resolve_internal P((void));static	void abort_resolve P((void));#if !defined(VMS) && !defined(SYS_WINNT)static	RETSIGTYPE catchchild P((int));#endif /* VMS *//* * get_pfxmatch - find value for prefixmatch * and update char * accordingly */static unsigned longget_pfxmatch(	char ** s,	struct masks *m	){	while (m->name) {		if (strncmp(*s, m->name, strlen(m->name)) == 0) {			*s += strlen(m->name);			return m->mask;		} else {			m++;		}	}	return 0;}/* * get_match - find logmask value */static unsigned longget_match(	char *s,	struct masks *m	){	while (m->name) {		if (strcmp(s, m->name) == 0) {			return m->mask;		} else {			m++;		}	}	return 0;}/* * get_logmask - build bitmask for ntp_syslogmask */static unsigned longget_logmask(	char *s	){	char *t;	unsigned long offset;	unsigned long mask;	t = s;	offset = get_pfxmatch(&t, logcfg_class);	mask   = get_match(t, logcfg_item);	if (mask)		return mask << offset;	else		msyslog(LOG_ERR, "logconfig: illegal argument %s - ignored", s);	return 0;}/* * getconfig - get command line options and read the configuration file */voidgetconfig(	int argc,	char *argv[]	){	register int i;	int c;	int errflg;	int status;	int istart;	int peerversion;	int minpoll;	int maxpoll;	int ttl;	long stratum;	unsigned long ul;	keyid_t peerkey;	u_char *peerkeystr;	u_long fudgeflag;	u_int peerflags;	int hmode;	struct sockaddr_storage peeraddr;	struct sockaddr_storage maskaddr;	FILE *fp[MAXINCLUDELEVEL+1];	FILE *includefile;	int includelevel = 0;	char line[MAXLINE];	char *(tokens[MAXTOKENS]);	int ntokens = 0;	int tok = CONFIG_UNKNOWN;	struct interface *localaddr;	struct refclockstat clock_stat;	FILEGEN *filegen;	/*	 * Initialize, initialize	 */	errflg = 0;	/* HMS: don't initialize debug to 0 here! */#ifndef SYS_WINNT	config_file = CONFIG_FILE;#else	temp = CONFIG_FILE;	if (!ExpandEnvironmentStrings((LPCTSTR)temp, (LPTSTR)config_file_storage, (DWORD)sizeof(config_file_storage))) {		msyslog(LOG_ERR, "ExpandEnvironmentStrings CONFIG_FILE failed: %m\n");		exit(1);	}	config_file = config_file_storage;	temp = ALT_CONFIG_FILE;	if (!ExpandEnvironmentStrings((LPCTSTR)temp, (LPTSTR)alt_config_file_storage, (DWORD)sizeof(alt_config_file_storage))) {		msyslog(LOG_ERR, "ExpandEnvironmentStrings ALT_CONFIG_FILE failed: %m\n");		exit(1);	}	alt_config_file = alt_config_file_storage;#endif /* SYS_WINNT */	progname = argv[0];	res_fp = NULL;	ntp_syslogmask = NLOG_SYNCMASK; /* set more via logconfig */	/*	 * install a non default variable with this daemon version	 */	(void) sprintf(line, "daemon_version=\"%s\"", Version);	set_sys_var(line, strlen(line)+1, RO);	/*	 * Say how we're setting the time of day	 */	(void) sprintf(line, "settimeofday=\"%s\"", set_tod_using);	set_sys_var(line, strlen(line)+1, RO);	/*	 * Initialize the loop.	 */	loop_config(LOOP_DRIFTINIT, 0.);	getCmdOpts(argc, argv);	if (	    (fp[0] = fopen(FindConfig(config_file), "r")) == NULL#ifdef HAVE_NETINFO	    /* If there is no config_file, try NetInfo. */	    && check_netinfo && !(config_netinfo = get_netinfo_config())#endif /* HAVE_NETINFO */	    ) {		fprintf(stderr, "getconfig: Couldn't open <%s>\n", FindConfig(config_file));		msyslog(LOG_INFO, "getconfig: Couldn't open <%s>", FindConfig(config_file));#ifdef SYS_WINNT		/* Under WinNT try alternate_config_file name, first NTP.CONF, then NTP.INI */		if ((fp[0] = fopen(FindConfig(alt_config_file), "r")) == NULL) {			/*			 * Broadcast clients can sometimes run without			 * a configuration file.			 */			fprintf(stderr, "getconfig: Couldn't open <%s>\n", FindConfig(alt_config_file));			msyslog(LOG_INFO, "getconfig: Couldn't open <%s>", FindConfig(alt_config_file));			return;		}#else  /* not SYS_WINNT */		return;#endif /* not SYS_WINNT */	}	for (;;) {		if (tok == CONFIG_END) 			break;		if (fp[includelevel])			tok = gettokens(fp[includelevel], line, tokens, &ntokens);#ifdef HAVE_NETINFO		else			tok = gettokens_netinfo(config_netinfo, tokens, &ntokens);#endif /* HAVE_NETINFO */		if (tok == CONFIG_UNKNOWN) {		    if (includelevel > 0) {			fclose(fp[includelevel--]);			continue;		    } else {			break;		    }		}		switch(tok) {		    case CONFIG_PEER:		    case CONFIG_SERVER:		    case CONFIG_MANYCASTCLIENT:		    case CONFIG_BROADCAST:			if (tok == CONFIG_PEER)			    hmode = MODE_ACTIVE;			else if (tok == CONFIG_SERVER)			    hmode = MODE_CLIENT;			else if (tok == CONFIG_MANYCASTCLIENT)			    hmode = MODE_CLIENT;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -