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 } 253