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_cmdargs.h"
11:
12: #include "ntpd-opts.h"
13:
14: /*
15: * Definitions of things either imported from or exported to outside
16: */
17: extern char const *progname;
18: extern const char *specific_interface;
19:
20: #ifdef HAVE_NETINFO
21: extern int check_netinfo;
22: #endif
23:
24:
25: /*
26: * getCmdOpts - get command line options
27: */
28: void
29: getCmdOpts(
30: int argc,
31: char *argv[]
32: )
33: {
34: extern const char *config_file;
35: int errflg;
36: tOptions *myOptions = &ntpdOptions;
37:
38: /*
39: * Initialize, initialize
40: */
41: errflg = 0;
42:
43: if (ipv4_works && ipv6_works) {
44: if (HAVE_OPT( IPV4 ))
45: ipv6_works = 0;
46: else if (HAVE_OPT( IPV6 ))
47: ipv4_works = 0;
48: } else if (!ipv4_works && !ipv6_works) {
49: msyslog(LOG_ERR, "Neither IPv4 nor IPv6 networking detected, fatal.");
50: exit(1);
51: } else if (HAVE_OPT( IPV4 ) && !ipv4_works)
52: msyslog(LOG_WARNING, "-4/--ipv4 ignored, IPv4 networking not found.");
53: else if (HAVE_OPT( IPV6 ) && !ipv6_works)
54: msyslog(LOG_WARNING, "-6/--ipv6 ignored, IPv6 networking not found.");
55:
56: if (HAVE_OPT( AUTHREQ ))
57: proto_config(PROTO_AUTHENTICATE, 1, 0., NULL);
58: else if (HAVE_OPT( AUTHNOREQ ))
59: proto_config(PROTO_AUTHENTICATE, 0, 0., NULL);
60:
61: if (HAVE_OPT( BCASTSYNC ))
62: proto_config(PROTO_BROADCLIENT, 1, 0., NULL);
63:
64: if (HAVE_OPT( CONFIGFILE )) {
65: config_file = OPT_ARG( CONFIGFILE );
66: #ifdef HAVE_NETINFO
67: check_netinfo = 0;
68: #endif
69: }
70:
71: if (HAVE_OPT( DRIFTFILE ))
72: stats_config(STATS_FREQ_FILE, OPT_ARG( DRIFTFILE ));
73:
74: if (HAVE_OPT( PANICGATE ))
75: allow_panic = TRUE;
76:
77: #ifdef HAVE_DROPROOT
78: if (HAVE_OPT( JAILDIR )) {
79: droproot = 1;
80: chrootdir = OPT_ARG( JAILDIR );
81: }
82: #endif
83:
84: if (HAVE_OPT( KEYFILE ))
85: getauthkeys(OPT_ARG( KEYFILE ));
86:
87: if (HAVE_OPT( PIDFILE ))
88: stats_config(STATS_PID_FILE, OPT_ARG( PIDFILE ));
89:
90: if (HAVE_OPT( QUIT ))
91: mode_ntpdate = TRUE;
92:
93: if (HAVE_OPT( PROPAGATIONDELAY ))
94: do {
95: double tmp;
96: const char *my_ntp_optarg = OPT_ARG( PROPAGATIONDELAY );
97:
98: if (sscanf(my_ntp_optarg, "%lf", &tmp) != 1) {
99: msyslog(LOG_ERR,
100: "command line broadcast delay value %s undecodable",
101: my_ntp_optarg);
102: } else {
103: proto_config(PROTO_BROADDELAY, 0, tmp, NULL);
104: }
105: } while (0);
106:
107: if (HAVE_OPT( STATSDIR ))
108: stats_config(STATS_STATSDIR, OPT_ARG( STATSDIR ));
109:
110: if (HAVE_OPT( TRUSTEDKEY )) {
111: int ct = STACKCT_OPT( TRUSTEDKEY );
112: const char** pp = STACKLST_OPT( TRUSTEDKEY );
113:
114: do {
115: u_long tkey;
116: const char* p = *pp++;
117:
118: tkey = (int)atol(p);
119: if (tkey == 0 || tkey > NTP_MAXKEY) {
120: msyslog(LOG_ERR,
121: "command line trusted key %s is invalid",
122: p);
123: } else {
124: authtrust(tkey, 1);
125: }
126: } while (--ct > 0);
127: }
128:
129: #ifdef HAVE_DROPROOT
130: if (HAVE_OPT( USER )) {
131: droproot = 1;
132: user = estrdup(OPT_ARG( USER ));
133: group = rindex(user, ':');
134: if (group)
135: *group++ = '\0'; /* get rid of the ':' */
136: }
137: #endif
138:
139: if (HAVE_OPT( VAR )) {
140: int ct = STACKCT_OPT( VAR );
141: const char** pp = STACKLST_OPT( VAR );
142:
143: do {
144: const char* my_ntp_optarg = *pp++;
145:
146: set_sys_var(my_ntp_optarg, strlen(my_ntp_optarg)+1,
147: (u_short) (RW));
148: } while (--ct > 0);
149: }
150:
151: if (HAVE_OPT( DVAR )) {
152: int ct = STACKCT_OPT( DVAR );
153: const char** pp = STACKLST_OPT( DVAR );
154:
155: do {
156: const char* my_ntp_optarg = *pp++;
157:
158: set_sys_var(my_ntp_optarg, strlen(my_ntp_optarg)+1,
159: (u_short) (RW | DEF));
160: } while (--ct > 0);
161: }
162:
163: if (HAVE_OPT( SLEW )) {
164: clock_max = 600;
165: kern_enable = 0;
166: }
167: if (HAVE_OPT( UPDATEINTERVAL )) {
168: long val = OPT_VALUE_UPDATEINTERVAL;
169:
170: if (val >= 0)
171: interface_interval = val;
172: else {
173: fprintf(stderr,
174: "command line interface update interval %ld must not be negative\n",
175: val);
176: msyslog(LOG_ERR,
177: "command line interface update interval %ld must not be negative",
178: val);
179: errflg++;
180: }
181: }
182: #ifdef SIM
183:
184: /* SK:
185: * The simulator no longer takes any command line arguments. Hence,
186: * all the code that was here has been removed.
187: */
188:
189: #endif /* SIM */
190:
191: if (errflg || argc) {
192: if (argc)
193: fprintf(stderr, "argc after processing is <%d>\n", argc);
194: optionUsage(myOptions, 2);
195: }
196: return;
197: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>