1/*	$NetBSD: cmd_args.c,v 1.7 2021/01/03 15:33:05 roy Exp $	*/
2
3/*
4 * cmd_args.c = command-line argument processing
5 */
6#ifdef HAVE_CONFIG_H
7# include <config.h>
8#endif
9
10#include "ntpd.h"
11#include "ntp_stdlib.h"
12#include "ntp_config.h"
13#include "ntp_cmdargs.h"
14
15#include "ntpd-opts.h"
16
17/*
18 * Definitions of things either imported from or exported to outside
19 */
20extern char const *progname;
21
22#ifdef HAVE_NETINFO
23extern int	check_netinfo;
24#endif
25
26
27/*
28 * getCmdOpts - apply most command line options
29 *
30 * A few options are examined earlier in ntpd.c ntpdmain() and
31 * ports/winnt/ntpd/ntservice.c main().
32 */
33void
34getCmdOpts(
35	int	argc,
36	char **	argv
37	)
38{
39	extern const char *config_file;
40	int errflg;
41
42	/*
43	 * Initialize, initialize
44	 */
45	errflg = 0;
46
47	if (ipv4_works && ipv6_works) {
48		if (HAVE_OPT( IPV4 ))
49			ipv6_works = 0;
50		else if (HAVE_OPT( IPV6 ))
51			ipv4_works = 0;
52	} else if (!ipv4_works && !ipv6_works) {
53		msyslog(LOG_ERR, "Neither IPv4 nor IPv6 networking detected, fatal.");
54		exit(1);
55	} else if (HAVE_OPT( IPV4 ) && !ipv4_works)
56		msyslog(LOG_WARNING, "-4/--ipv4 ignored, IPv4 networking not found.");
57	else if (HAVE_OPT( IPV6 ) && !ipv6_works)
58		msyslog(LOG_WARNING, "-6/--ipv6 ignored, IPv6 networking not found.");
59
60	if (HAVE_OPT( AUTHREQ ))
61		proto_config(PROTO_AUTHENTICATE, 1, 0., NULL);
62	else if (HAVE_OPT( AUTHNOREQ ))
63		proto_config(PROTO_AUTHENTICATE, 0, 0., NULL);
64
65	if (HAVE_OPT( BCASTSYNC ))
66		proto_config(PROTO_BROADCLIENT, 1, 0., NULL);
67
68	if (HAVE_OPT( CONFIGFILE )) {
69		config_file = OPT_ARG( CONFIGFILE );
70#ifdef HAVE_NETINFO
71		check_netinfo = 0;
72#endif
73	}
74
75	if (HAVE_OPT( DRIFTFILE ))
76	    stats_config(STATS_FREQ_FILE, OPT_ARG( DRIFTFILE ), 0);
77
78	if (HAVE_OPT( PANICGATE ))
79		allow_panic = TRUE;
80
81	if (HAVE_OPT( FORCE_STEP_ONCE ))
82		force_step_once = TRUE;
83
84#ifdef HAVE_DROPROOT
85	if (HAVE_OPT( JAILDIR )) {
86		droproot = 1;
87		chrootdir = OPT_ARG( JAILDIR );
88	}
89#endif
90
91	if (HAVE_OPT( KEYFILE ))
92		getauthkeys(OPT_ARG( KEYFILE ));
93
94	if (HAVE_OPT( PIDFILE ))
95	    stats_config(STATS_PID_FILE, OPT_ARG( PIDFILE ), 0);
96
97	if (HAVE_OPT( QUIT ))
98		mode_ntpdate = TRUE;
99
100	if (HAVE_OPT( PROPAGATIONDELAY ))
101		do {
102			double tmp;
103			const char *my_ntp_optarg = OPT_ARG( PROPAGATIONDELAY );
104
105			if (sscanf(my_ntp_optarg, "%lf", &tmp) != 1) {
106				msyslog(LOG_ERR,
107					"command line broadcast delay value %s undecodable",
108					my_ntp_optarg);
109			} else {
110				proto_config(PROTO_BROADDELAY, 0, tmp, NULL);
111			}
112		} while (0);
113
114	if (HAVE_OPT( STATSDIR ))
115	    stats_config(STATS_STATSDIR, OPT_ARG( STATSDIR ), 0);
116
117	if (HAVE_OPT( TRUSTEDKEY )) {
118		int		ct = STACKCT_OPT(  TRUSTEDKEY );
119		const char**	pp = STACKLST_OPT( TRUSTEDKEY );
120
121		do  {
122			u_long tkey;
123			const char* p = *pp++;
124
125			tkey = (int)atol(p);
126			if (tkey == 0 || tkey > NTP_MAXKEY) {
127				msyslog(LOG_ERR,
128				    "command line trusted key %s is invalid",
129				    p);
130			} else {
131				authtrust(tkey, 1);
132			}
133		} while (--ct > 0);
134	}
135
136#ifdef HAVE_DROPROOT
137	if (HAVE_OPT( USER )) {
138		droproot = 1;
139		user = estrdup(OPT_ARG( USER ));
140		group = strrchr(user, ':');
141		if (group != NULL) {
142			size_t	len;
143
144			*group++ = '\0'; /* get rid of the ':' */
145			len = group - user;
146			group = estrdup(group);
147			user = erealloc(user, len);
148		}
149	}
150#endif
151
152	if (HAVE_OPT( VAR )) {
153		int		ct;
154		const char **	pp;
155		const char *	v_assign;
156
157		ct = STACKCT_OPT(  VAR );
158		pp = STACKLST_OPT( VAR );
159
160		do  {
161			v_assign = *pp++;
162			set_sys_var(v_assign, strlen(v_assign) + 1, RW);
163		} while (--ct > 0);
164	}
165
166	if (HAVE_OPT( DVAR )) {
167		int		ct = STACKCT_OPT(  DVAR );
168		const char**	pp = STACKLST_OPT( DVAR );
169
170		do  {
171			const char* my_ntp_optarg = *pp++;
172
173			set_sys_var(my_ntp_optarg, strlen(my_ntp_optarg)+1,
174			    (u_short) (RW | DEF));
175		} while (--ct > 0);
176	}
177
178	if (HAVE_OPT( SLEW ))
179		loop_config(LOOP_MAX, 600);
180
181	if (HAVE_OPT( UPDATEINTERVAL )) {
182		long val = OPT_VALUE_UPDATEINTERVAL;
183
184		if (val >= 0) {
185			interface_interval = val;
186			if (interface_interval == 0)
187				disable_dynamic_updates = 1;
188		} else {
189			fprintf(stderr,
190				"command line interface update interval %ld must not be negative\n",
191				val);
192			msyslog(LOG_ERR,
193				"command line interface update interval %ld must not be negative",
194				val);
195			errflg++;
196		}
197	}
198
199
200	/* save list of servers from cmd line for config_peers() use */
201	if (argc > 0) {
202		cmdline_server_count = argc;
203		cmdline_servers = argv;
204	}
205
206	/* display usage & exit with any option processing errors */
207	if (errflg)
208		optionUsage(&ntpdOptions, 2);	/* does not return */
209}
210