Initial import from FreeBSD RELENG_4:
[games.git] / contrib / ntp / ntpd / cmd_args.c
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 /*
13  * Definitions of things either imported from or exported to outside
14  */
15 extern char const *progname;
16 int     listen_to_virtual_ips = 0;
17
18 static const char *ntp_options = "aAbc:dD:f:gk:l:LmnN:p:P:qr:s:t:v:V:x";
19
20 #ifdef HAVE_NETINFO
21 extern int      check_netinfo;
22 #endif
23
24
25 /*
26  * getstartup - search through the options looking for a debugging flag
27  */
28 void
29 getstartup(
30         int argc,
31         char *argv[]
32         )
33 {
34         int errflg;
35         extern int priority_done;
36         int c;
37
38 #ifdef DEBUG
39         debug = 0;              /* no debugging by default */
40 #endif
41
42         /*
43          * This is a big hack.  We don't really want to read command line
44          * configuration until everything else is initialized, since
45          * the ability to configure the system may depend on storage
46          * and the like having been initialized.  Except that we also
47          * don't want to initialize anything until after detaching from
48          * the terminal, but we won't know to do that until we've
49          * parsed the command line.  Do that now, crudely, and do it
50          * again later.  Our ntp_getopt() is explicitly reusable, by the
51          * way.  Your own mileage may vary.
52          *
53          * This hack is even called twice (to allow complete logging to file)
54          */
55         errflg = 0;
56         progname = argv[0];
57
58         /*
59          * Decode argument list
60          */
61         while ((c = ntp_getopt(argc, argv, ntp_options)) != EOF)
62             switch (c) {
63 #ifdef DEBUG
64                 case 'd':
65                     ++debug;
66                     break;
67                 case 'D':
68                     debug = (int)atol(ntp_optarg);
69                     printf("Debug1: %s -> %x = %d\n", ntp_optarg, debug, debug);
70                     break;
71 #else
72                 case 'd':
73                 case 'D':
74                     msyslog(LOG_ERR, "ntpd not compiled with -DDEBUG option - no DEBUG support");
75                     fprintf(stderr, "ntpd not compiled with -DDEBUG option - no DEBUG support");
76                     ++errflg;
77                     break;
78 #endif
79                 case 'L':
80                     listen_to_virtual_ips = 1;
81                     break;
82                 case 'l':
83                         {
84                                 FILE *new_file;
85
86                                 new_file = fopen(ntp_optarg, "a");
87                                 if (new_file != NULL) {
88                                         NLOG(NLOG_SYSINFO)
89                                                 msyslog(LOG_NOTICE, "logging to file %s", ntp_optarg);
90                                         if (syslog_file != NULL &&
91                                                 fileno(syslog_file) != fileno(new_file))
92                                                 (void)fclose(syslog_file);
93
94                                         syslog_file = new_file;
95                                         syslogit = 0;
96                                 }
97                                 else
98                                         msyslog(LOG_ERR,
99                                                 "Cannot open log file %s",
100                                                 ntp_optarg);
101                         }
102                         break;
103
104                 case 'n':
105                 case 'q':
106                     ++nofork;
107                     break;
108
109                 case 'N':
110                     priority_done = strcmp(ntp_optarg, "high");
111                     break;
112                         
113                 case '?':
114                     ++errflg;
115                     break;
116
117                 default:
118                         break;
119                 }
120
121         if (errflg || ntp_optind != argc) {
122                 (void) fprintf(stderr, "usage: %s [ -abdgmnqx ] [ -c config_file ] [ -e e_delay ]\n", progname);
123                 (void) fprintf(stderr, "\t\t[ -f freq_file ] [ -k key_file ] [ -l log_file ]\n");
124                 (void) fprintf(stderr, "\t\t[ -p pid_file ] [ -r broad_delay ] [ -s statdir ]\n");
125                 (void) fprintf(stderr, "\t\t[ -t trust_key ] [ -v sys_var ] [ -V default_sysvar ]\n");
126 #if defined(HAVE_SCHED_SETSCHEDULER)
127                 (void) fprintf(stderr, "\t\t[ -P fixed_process_priority ]\n");
128 #endif
129                 exit(2);
130         }
131         ntp_optind = 0; /* reset ntp_optind to restart ntp_getopt */
132
133 #ifdef DEBUG
134         if (debug) {
135 #ifdef HAVE_SETVBUF
136                 static char buf[BUFSIZ];
137                 setvbuf(stdout, buf, _IOLBF, BUFSIZ);
138 #else
139                 setlinebuf(stdout);
140 #endif
141         }
142 #endif
143 }
144
145 /*
146  * getCmdOpts - get command line options
147  */
148 void
149 getCmdOpts(
150         int argc,
151         char *argv[]
152         )
153 {
154         extern char *config_file;
155         int errflg;
156         int c;
157
158         /*
159          * Initialize, initialize
160          */
161         errflg = 0;
162 #ifdef DEBUG
163         debug = 0;
164 #endif  /* DEBUG */
165
166         progname = argv[0];
167
168         /*
169          * Decode argument list
170          */
171         while ((c = ntp_getopt(argc, argv, ntp_options)) != EOF) {
172                 switch (c) {
173                     case 'a':
174                         proto_config(PROTO_AUTHENTICATE, 1, 0.);
175                         break;
176
177                     case 'A':
178                         proto_config(PROTO_AUTHENTICATE, 0, 0.);
179                         break;
180
181                     case 'b':
182                         proto_config(PROTO_BROADCLIENT, 1, 0.);
183                         break;
184
185                     case 'c':
186                         config_file = ntp_optarg;
187 #ifdef HAVE_NETINFO
188                         check_netinfo = 0;
189 #endif
190                         break;
191
192                     case 'd':
193 #ifdef DEBUG
194                         debug++;
195 #else
196                         errflg++;
197 #endif  /* DEBUG */
198                         break;
199
200                     case 'D':
201 #ifdef DEBUG
202                         debug = (int)atol(ntp_optarg);
203                         printf("Debug2: %s -> %x = %d\n", ntp_optarg, debug, debug);
204 #else
205                         errflg++;
206 #endif  /* DEBUG */
207                         break;
208
209                     case 'f':
210                         stats_config(STATS_FREQ_FILE, ntp_optarg);
211                         break;
212
213                     case 'g':
214                         allow_panic = TRUE;
215                         break;
216
217                     case 'k':
218                         getauthkeys(ntp_optarg);
219                         break;
220
221                     case 'L':   /* already done at pre-scan */
222                     case 'l':   /* already done at pre-scan */
223                         break;
224
225                     case 'm':
226                         proto_config(PROTO_MULTICAST_ADD, htonl(INADDR_NTP), 0.);
227                         sys_bclient = 1;
228                         break;
229
230                     case 'n':   /* already done at pre-scan */
231                         break;
232
233                     case 'N':   /* already done at pre-scan */
234                         break;
235
236                     case 'p':
237                         stats_config(STATS_PID_FILE, ntp_optarg);
238                         break;
239
240                     case 'P':
241 #if defined(HAVE_SCHED_SETSCHEDULER)
242                         config_priority = (int)atol(ntp_optarg);
243                         config_priority_override = 1;
244 #else
245                         errflg++;
246 #endif
247                         break;
248
249                     case 'q':
250                         mode_ntpdate = TRUE;
251                         break;
252
253                     case 'r':
254                         do {
255                                 double tmp;
256
257                                 if (sscanf(ntp_optarg, "%lf", &tmp) != 1) {
258                                         msyslog(LOG_ERR,
259                                                 "command line broadcast delay value %s undecodable",
260                                                 ntp_optarg);
261                                 } else {
262                                         proto_config(PROTO_BROADDELAY, 0, tmp);
263                                 }
264                         } while (0);
265                         break;
266                         
267                     case 's':
268                         stats_config(STATS_STATSDIR, ntp_optarg);
269                         break;
270                         
271                     case 't':
272                         do {
273                                 u_long tkey;
274                                 
275                                 tkey = (int)atol(ntp_optarg);
276                                 if (tkey <= 0 || tkey > NTP_MAXKEY) {
277                                         msyslog(LOG_ERR,
278                                             "command line trusted key %s is invalid",
279                                             ntp_optarg);
280                                 } else {
281                                         authtrust(tkey, 1);
282                                 }
283                         } while (0);
284                         break;
285
286                     case 'v':
287                     case 'V':
288                         set_sys_var(ntp_optarg, strlen(ntp_optarg)+1,
289                             RW | ((c == 'V') ? DEF : 0));
290                         break;
291
292                     case 'x':
293                         allow_step = FALSE;
294                         break;
295
296                     default:
297                         errflg++;
298                         break;
299                 }
300         }
301
302         if (errflg || ntp_optind != argc) {
303                 (void) fprintf(stderr, "usage: %s [ -abdgmnx ] [ -c config_file ] [ -e e_delay ]\n", progname);
304                 (void) fprintf(stderr, "\t\t[ -f freq_file ] [ -k key_file ] [ -l log_file ]\n");
305                 (void) fprintf(stderr, "\t\t[ -p pid_file ] [ -r broad_delay ] [ -s statdir ]\n");
306                 (void) fprintf(stderr, "\t\t[ -t trust_key ] [ -v sys_var ] [ -V default_sysvar ]\n");
307 #if defined(HAVE_SCHED_SETSCHEDULER)
308                 (void) fprintf(stderr, "\t\t[ -P fixed_process_priority ]\n");
309 #endif
310                 exit(2);
311         }
312         return;
313 }