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