]> CyberLeo.Net >> Repos - FreeBSD/releng/9.2.git/blob - contrib/ntp/ntpd/cmd_args.c
- Copy stable/9 to releng/9.2 as part of the 9.2-RELEASE cycle.
[FreeBSD/releng/9.2.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 #ifdef SIM
13 # include "ntpsim.h"
14 # include "ntpdsim-opts.h"
15 # define OPTSTRUCT      ntpdsimOptions
16 #else
17 # include "ntpd-opts.h"
18 # define OPTSTRUCT      ntpdOptions
19 #endif /* SIM */
20
21 /*
22  * Definitions of things either imported from or exported to outside
23  */
24 extern char const *progname;
25 extern const char *specific_interface;
26 extern short default_ai_family;
27
28 #ifdef HAVE_NETINFO
29 extern int      check_netinfo;
30 #endif
31
32
33 /*
34  * getCmdOpts - get command line options
35  */
36 void
37 getCmdOpts(
38         int argc,
39         char *argv[]
40         )
41 {
42         extern const char *config_file;
43         int errflg;
44         tOptions *myOptions = &OPTSTRUCT;
45
46         /*
47          * Initialize, initialize
48          */
49         errflg = 0;
50
51         switch (WHICH_IDX_IPV4) {
52             case INDEX_OPT_IPV4:
53                 default_ai_family = AF_INET;
54                 break;
55             case INDEX_OPT_IPV6:
56                 default_ai_family = AF_INET6;
57                 break;
58             default:
59                 /* ai_fam_templ = ai_fam_default;       */
60                 break;
61         }
62
63         if (HAVE_OPT( AUTHREQ ))
64                 proto_config(PROTO_AUTHENTICATE, 1, 0., NULL);
65
66         if (HAVE_OPT( AUTHNOREQ ))
67                 proto_config(PROTO_AUTHENTICATE, 0, 0., NULL);
68
69         if (HAVE_OPT( BCASTSYNC ))
70                 proto_config(PROTO_BROADCLIENT, 1, 0., NULL);
71
72         if (HAVE_OPT( CONFIGFILE )) {
73                 config_file = OPT_ARG( CONFIGFILE );
74 #ifdef HAVE_NETINFO
75                 check_netinfo = 0;
76 #endif
77         }
78
79         if (HAVE_OPT( DRIFTFILE ))
80                 stats_config(STATS_FREQ_FILE, OPT_ARG( DRIFTFILE ));
81
82         if (HAVE_OPT( PANICGATE ))
83                 allow_panic = TRUE;
84
85         if (HAVE_OPT( JAILDIR )) {
86 #ifdef HAVE_DROPROOT
87                         droproot = 1;
88                         chrootdir = OPT_ARG( JAILDIR );
89 #else
90                         fprintf(stderr, 
91                                 "command line -i option (jaildir) is not supported by this binary"
92 # ifndef SYS_WINNT
93                                 ",\n" "can not drop root privileges.  See configure options\n"
94                                 "--enable-clockctl and --enable-linuxcaps.\n");
95 # else
96                                 ".\n");
97 # endif
98                         msyslog(LOG_ERR, 
99                                 "command line -i option (jaildir) is not supported by this binary.");
100                         errflg++;
101 #endif
102         }
103
104         if (HAVE_OPT( KEYFILE ))
105                 getauthkeys(OPT_ARG( KEYFILE ));
106
107         if (HAVE_OPT( PIDFILE ))
108                 stats_config(STATS_PID_FILE, OPT_ARG( PIDFILE ));
109
110         if (HAVE_OPT( QUIT ))
111                 mode_ntpdate = TRUE;
112
113         if (HAVE_OPT( PROPAGATIONDELAY ))
114                 do {
115                         double tmp;
116                         const char *my_ntp_optarg = OPT_ARG( PROPAGATIONDELAY );
117
118                         if (sscanf(my_ntp_optarg, "%lf", &tmp) != 1) {
119                                 msyslog(LOG_ERR,
120                                         "command line broadcast delay value %s undecodable",
121                                         my_ntp_optarg);
122                         } else {
123                                 proto_config(PROTO_BROADDELAY, 0, tmp, NULL);
124                         }
125                 } while (0);
126
127         if (HAVE_OPT( STATSDIR ))
128                 stats_config(STATS_STATSDIR, OPT_ARG( STATSDIR ));
129
130         if (HAVE_OPT( TRUSTEDKEY )) {
131                 int             ct = STACKCT_OPT(  TRUSTEDKEY );
132                 const char**    pp = STACKLST_OPT( TRUSTEDKEY );
133
134                 do  {
135                         u_long tkey;
136                         const char* p = *pp++;
137
138                         tkey = (int)atol(p);
139                         if (tkey == 0 || tkey > NTP_MAXKEY) {
140                                 msyslog(LOG_ERR,
141                                     "command line trusted key %s is invalid",
142                                     p);
143                         } else {
144                                 authtrust(tkey, 1);
145                         }
146                 } while (--ct > 0);
147         }
148
149         if (HAVE_OPT( USER )) {
150 #ifdef HAVE_DROPROOT
151                 char *ntp_optarg = OPT_ARG( USER );
152
153                 droproot = 1;
154                 user = emalloc(strlen(ntp_optarg) + 1);
155                 (void)strncpy(user, ntp_optarg, strlen(ntp_optarg) + 1);
156                 group = rindex(user, ':');
157                 if (group)
158                         *group++ = '\0'; /* get rid of the ':' */
159 #else
160                 fprintf(stderr, 
161                         "command line -u/--user option is not supported by this binary"
162 # ifndef SYS_WINNT
163                         ",\n" "can not drop root privileges.  See configure options\n"
164                         "--enable-clockctl and --enable-linuxcaps.\n");
165 # else
166                         ".\n");
167 # endif
168                 msyslog(LOG_ERR, 
169                         "command line -u/--user option is not supported by this binary.");
170                 errflg++;
171 #endif
172         }
173
174         if (HAVE_OPT( VAR )) {
175                 int             ct = STACKCT_OPT(  VAR );
176                 const char**    pp = STACKLST_OPT( VAR );
177
178                 do  {
179                         const char* my_ntp_optarg = *pp++;
180
181                         set_sys_var(my_ntp_optarg, strlen(my_ntp_optarg)+1,
182                             (u_short) (RW));
183                 } while (--ct > 0);
184         }
185
186         if (HAVE_OPT( DVAR )) {
187                 int             ct = STACKCT_OPT(  DVAR );
188                 const char**    pp = STACKLST_OPT( DVAR );
189
190                 do  {
191                         const char* my_ntp_optarg = *pp++;
192
193                         set_sys_var(my_ntp_optarg, strlen(my_ntp_optarg)+1,
194                             (u_short) (RW | DEF));
195                 } while (--ct > 0);
196         }
197
198         if (HAVE_OPT( SLEW ))
199                 clock_max = 600;
200
201         if (HAVE_OPT( UPDATEINTERVAL )) {
202                 long val = OPT_VALUE_UPDATEINTERVAL;
203                           
204                 if (val >= 0)
205                         interface_interval = val;
206                 else {
207                         fprintf(stderr, 
208                                 "command line interface update interval %ld must not be negative\n",
209                                 val);
210                         msyslog(LOG_ERR, 
211                                 "command line interface update interval %ld must not be negative",
212                                 val);
213                         errflg++;
214                 }
215         }
216 #ifdef SIM
217         if (HAVE_OPT( SIMBROADCASTDELAY ))
218                 sscanf(OPT_ARG( SIMBROADCASTDELAY ), "%lf", &ntp_node.bdly);
219
220         if (HAVE_OPT( PHASENOISE ))
221                 sscanf(OPT_ARG( PHASENOISE ), "%lf", &ntp_node.snse);
222
223         if (HAVE_OPT( SIMSLEW ))
224                 sscanf(OPT_ARG( SIMSLEW ), "%lf", &ntp_node.slew);
225
226         if (HAVE_OPT( SERVERTIME ))
227                 sscanf(OPT_ARG( SERVERTIME ), "%lf", &ntp_node.clk_time);
228
229         if (HAVE_OPT( ENDSIMTIME ))
230                 sscanf(OPT_ARG( ENDSIMTIME ), "%lf", &ntp_node.sim_time);
231
232         if (HAVE_OPT( FREQERR ))
233                 sscanf(OPT_ARG( FREQERR ), "%lf", &ntp_node.ferr);
234
235         if (HAVE_OPT( WALKNOISE ))
236                 sscanf(OPT_ARG( WALKNOISE ), "%lf", &ntp_node.fnse);
237
238         if (HAVE_OPT( NDELAY ))
239                 sscanf(OPT_ARG( NDELAY ), "%lf", &ntp_node.ndly);
240
241         if (HAVE_OPT( PDELAY ))
242                 sscanf(OPT_ARG( PDELAY ), "%lf", &ntp_node.pdly);
243
244 #endif /* SIM */
245
246         if (errflg || argc) {
247                 if (argc)
248                         fprintf(stderr, "argc after processing is <%d>\n", argc);
249                 optionUsage(myOptions, 2);
250         }
251         return;
252 }