1224ba2bdSOllivier Robert /* 2224ba2bdSOllivier Robert * cmd_args.c = command-line argument processing 3224ba2bdSOllivier Robert */ 4224ba2bdSOllivier Robert #ifdef HAVE_CONFIG_H 5224ba2bdSOllivier Robert # include <config.h> 6224ba2bdSOllivier Robert #endif 7224ba2bdSOllivier Robert 8224ba2bdSOllivier Robert #include "ntpd.h" 9224ba2bdSOllivier Robert #include "ntp_stdlib.h" 102b15cb3dSCy Schubert #include "ntp_config.h" 11224ba2bdSOllivier Robert #include "ntp_cmdargs.h" 12224ba2bdSOllivier Robert 13ea906c41SOllivier Robert #include "ntpd-opts.h" 149c2daa00SOllivier Robert 15224ba2bdSOllivier Robert /* 16224ba2bdSOllivier Robert * Definitions of things either imported from or exported to outside 17224ba2bdSOllivier Robert */ 18224ba2bdSOllivier Robert extern char const *progname; 19224ba2bdSOllivier Robert 20224ba2bdSOllivier Robert #ifdef HAVE_NETINFO 21224ba2bdSOllivier Robert extern int check_netinfo; 22224ba2bdSOllivier Robert #endif 23224ba2bdSOllivier Robert 24224ba2bdSOllivier Robert 25224ba2bdSOllivier Robert /* 262b15cb3dSCy Schubert * getCmdOpts - apply most command line options 272b15cb3dSCy Schubert * 282b15cb3dSCy Schubert * A few options are examined earlier in ntpd.c ntpdmain() and 292b15cb3dSCy Schubert * ports/winnt/ntpd/ntservice.c main(). 30224ba2bdSOllivier Robert */ 31224ba2bdSOllivier Robert void 32224ba2bdSOllivier Robert getCmdOpts( 33224ba2bdSOllivier Robert int argc, 342b15cb3dSCy Schubert char ** argv 35224ba2bdSOllivier Robert ) 36224ba2bdSOllivier Robert { 37ea906c41SOllivier Robert extern const char *config_file; 38224ba2bdSOllivier Robert int errflg; 39224ba2bdSOllivier Robert 40224ba2bdSOllivier Robert /* 41224ba2bdSOllivier Robert * Initialize, initialize 42224ba2bdSOllivier Robert */ 43224ba2bdSOllivier Robert errflg = 0; 44224ba2bdSOllivier Robert 452b15cb3dSCy Schubert if (ipv4_works && ipv6_works) { 462b15cb3dSCy Schubert if (HAVE_OPT( IPV4 )) 472b15cb3dSCy Schubert ipv6_works = 0; 482b15cb3dSCy Schubert else if (HAVE_OPT( IPV6 )) 492b15cb3dSCy Schubert ipv4_works = 0; 502b15cb3dSCy Schubert } else if (!ipv4_works && !ipv6_works) { 512b15cb3dSCy Schubert msyslog(LOG_ERR, "Neither IPv4 nor IPv6 networking detected, fatal."); 522b15cb3dSCy Schubert exit(1); 532b15cb3dSCy Schubert } else if (HAVE_OPT( IPV4 ) && !ipv4_works) 542b15cb3dSCy Schubert msyslog(LOG_WARNING, "-4/--ipv4 ignored, IPv4 networking not found."); 552b15cb3dSCy Schubert else if (HAVE_OPT( IPV6 ) && !ipv6_works) 562b15cb3dSCy Schubert msyslog(LOG_WARNING, "-6/--ipv6 ignored, IPv6 networking not found."); 57224ba2bdSOllivier Robert 58ea906c41SOllivier Robert if (HAVE_OPT( AUTHREQ )) 599c2daa00SOllivier Robert proto_config(PROTO_AUTHENTICATE, 1, 0., NULL); 602b15cb3dSCy Schubert else if (HAVE_OPT( AUTHNOREQ )) 619c2daa00SOllivier Robert proto_config(PROTO_AUTHENTICATE, 0, 0., NULL); 62224ba2bdSOllivier Robert 63ea906c41SOllivier Robert if (HAVE_OPT( BCASTSYNC )) 649c2daa00SOllivier Robert proto_config(PROTO_BROADCLIENT, 1, 0., NULL); 65224ba2bdSOllivier Robert 66ea906c41SOllivier Robert if (HAVE_OPT( CONFIGFILE )) { 67ea906c41SOllivier Robert config_file = OPT_ARG( CONFIGFILE ); 68224ba2bdSOllivier Robert #ifdef HAVE_NETINFO 69224ba2bdSOllivier Robert check_netinfo = 0; 70224ba2bdSOllivier Robert #endif 71ea906c41SOllivier Robert } 72224ba2bdSOllivier Robert 73ea906c41SOllivier Robert if (HAVE_OPT( DRIFTFILE )) 74a466cc55SCy Schubert stats_config(STATS_FREQ_FILE, OPT_ARG( DRIFTFILE ), 1); 75224ba2bdSOllivier Robert 76ea906c41SOllivier Robert if (HAVE_OPT( PANICGATE )) 77224ba2bdSOllivier Robert allow_panic = TRUE; 78224ba2bdSOllivier Robert 79a25439b6SCy Schubert if (HAVE_OPT( FORCE_STEP_ONCE )) 80a25439b6SCy Schubert force_step_once = TRUE; 81a25439b6SCy Schubert 82ea906c41SOllivier Robert #ifdef HAVE_DROPROOT 832b15cb3dSCy Schubert if (HAVE_OPT( JAILDIR )) { 84ea906c41SOllivier Robert droproot = 1; 85ea906c41SOllivier Robert chrootdir = OPT_ARG( JAILDIR ); 86ea906c41SOllivier Robert } 872b15cb3dSCy Schubert #endif 88224ba2bdSOllivier Robert 89ea906c41SOllivier Robert if (HAVE_OPT( KEYFILE )) 90ea906c41SOllivier Robert getauthkeys(OPT_ARG( KEYFILE )); 91224ba2bdSOllivier Robert 92ea906c41SOllivier Robert if (HAVE_OPT( PIDFILE )) 93a466cc55SCy Schubert stats_config(STATS_PID_FILE, OPT_ARG( PIDFILE ), 1); 94224ba2bdSOllivier Robert 95ea906c41SOllivier Robert if (HAVE_OPT( QUIT )) 96224ba2bdSOllivier Robert mode_ntpdate = TRUE; 97224ba2bdSOllivier Robert 98ea906c41SOllivier Robert if (HAVE_OPT( PROPAGATIONDELAY )) 99224ba2bdSOllivier Robert do { 100224ba2bdSOllivier Robert double tmp; 101ea906c41SOllivier Robert const char *my_ntp_optarg = OPT_ARG( PROPAGATIONDELAY ); 102224ba2bdSOllivier Robert 103ea906c41SOllivier Robert if (sscanf(my_ntp_optarg, "%lf", &tmp) != 1) { 104224ba2bdSOllivier Robert msyslog(LOG_ERR, 105224ba2bdSOllivier Robert "command line broadcast delay value %s undecodable", 106ea906c41SOllivier Robert my_ntp_optarg); 107224ba2bdSOllivier Robert } else { 1089c2daa00SOllivier Robert proto_config(PROTO_BROADDELAY, 0, tmp, NULL); 109224ba2bdSOllivier Robert } 110224ba2bdSOllivier Robert } while (0); 111224ba2bdSOllivier Robert 112ea906c41SOllivier Robert if (HAVE_OPT( STATSDIR )) 113a466cc55SCy Schubert stats_config(STATS_STATSDIR, OPT_ARG( STATSDIR ), 1); 114ea906c41SOllivier Robert 115ea906c41SOllivier Robert if (HAVE_OPT( TRUSTEDKEY )) { 116ea906c41SOllivier Robert int ct = STACKCT_OPT( TRUSTEDKEY ); 117ea906c41SOllivier Robert const char** pp = STACKLST_OPT( TRUSTEDKEY ); 118ea906c41SOllivier Robert 119ea906c41SOllivier Robert do { 120ea906c41SOllivier Robert u_long tkey; 121ea906c41SOllivier Robert const char* p = *pp++; 122ea906c41SOllivier Robert 123ea906c41SOllivier Robert tkey = (int)atol(p); 124ea906c41SOllivier Robert if (tkey == 0 || tkey > NTP_MAXKEY) { 125ea906c41SOllivier Robert msyslog(LOG_ERR, 126ea906c41SOllivier Robert "command line trusted key %s is invalid", 127ea906c41SOllivier Robert p); 128ea906c41SOllivier Robert } else { 129ea906c41SOllivier Robert authtrust(tkey, 1); 130ea906c41SOllivier Robert } 131ea906c41SOllivier Robert } while (--ct > 0); 132ea906c41SOllivier Robert } 133ea906c41SOllivier Robert 134ea906c41SOllivier Robert #ifdef HAVE_DROPROOT 1352b15cb3dSCy Schubert if (HAVE_OPT( USER )) { 136ea906c41SOllivier Robert droproot = 1; 1372b15cb3dSCy Schubert user = estrdup(OPT_ARG( USER )); 1382b15cb3dSCy Schubert group = strrchr(user, ':'); 1392b15cb3dSCy Schubert if (group != NULL) { 1402b15cb3dSCy Schubert size_t len; 1412b15cb3dSCy Schubert 1429c2daa00SOllivier Robert *group++ = '\0'; /* get rid of the ':' */ 1432b15cb3dSCy Schubert len = group - user; 1442b15cb3dSCy Schubert group = estrdup(group); 1452b15cb3dSCy Schubert user = erealloc(user, len); 146224ba2bdSOllivier Robert } 1472b15cb3dSCy Schubert } 1482b15cb3dSCy Schubert #endif 149224ba2bdSOllivier Robert 150ea906c41SOllivier Robert if (HAVE_OPT( VAR )) { 1512b15cb3dSCy Schubert int ct; 1522b15cb3dSCy Schubert const char ** pp; 1532b15cb3dSCy Schubert const char * v_assign; 1542b15cb3dSCy Schubert 1552b15cb3dSCy Schubert ct = STACKCT_OPT( VAR ); 1562b15cb3dSCy Schubert pp = STACKLST_OPT( VAR ); 157224ba2bdSOllivier Robert 158ea906c41SOllivier Robert do { 1592b15cb3dSCy Schubert v_assign = *pp++; 1602b15cb3dSCy Schubert set_sys_var(v_assign, strlen(v_assign) + 1, RW); 161ea906c41SOllivier Robert } while (--ct > 0); 162ea906c41SOllivier Robert } 163ea906c41SOllivier Robert 164ea906c41SOllivier Robert if (HAVE_OPT( DVAR )) { 165ea906c41SOllivier Robert int ct = STACKCT_OPT( DVAR ); 166ea906c41SOllivier Robert const char** pp = STACKLST_OPT( DVAR ); 167ea906c41SOllivier Robert 168ea906c41SOllivier Robert do { 169ea906c41SOllivier Robert const char* my_ntp_optarg = *pp++; 170ea906c41SOllivier Robert 171ea906c41SOllivier Robert set_sys_var(my_ntp_optarg, strlen(my_ntp_optarg)+1, 172ea906c41SOllivier Robert (u_short) (RW | DEF)); 173ea906c41SOllivier Robert } while (--ct > 0); 174ea906c41SOllivier Robert } 175ea906c41SOllivier Robert 176ea906c41SOllivier Robert if (HAVE_OPT( SLEW )) 1772b15cb3dSCy Schubert loop_config(LOOP_MAX, 600); 178ea906c41SOllivier Robert 179ea906c41SOllivier Robert if (HAVE_OPT( UPDATEINTERVAL )) { 180ea906c41SOllivier Robert long val = OPT_VALUE_UPDATEINTERVAL; 181*f5f40dd6SCy Schubert const char errfmt[] = 182*f5f40dd6SCy Schubert "-U/--updateinterval %ld must be >= 0\n"; 183ea906c41SOllivier Robert 184*f5f40dd6SCy Schubert if (val >= 0) { 185*f5f40dd6SCy Schubert endpt_scan_period = val; 186*f5f40dd6SCy Schubert } else { 187*f5f40dd6SCy Schubert fprintf(stderr, errfmt, val); 188*f5f40dd6SCy Schubert msyslog(LOG_ERR, errfmt, val); 189ea906c41SOllivier Robert errflg++; 190ea906c41SOllivier Robert } 191ea906c41SOllivier Robert } 192224ba2bdSOllivier Robert 1939c2daa00SOllivier Robert 1942b15cb3dSCy Schubert /* save list of servers from cmd line for config_peers() use */ 1952b15cb3dSCy Schubert if (argc > 0) { 1962b15cb3dSCy Schubert cmdline_server_count = argc; 1972b15cb3dSCy Schubert cmdline_servers = argv; 198224ba2bdSOllivier Robert } 1992b15cb3dSCy Schubert 2002b15cb3dSCy Schubert /* display usage & exit with any option processing errors */ 2012b15cb3dSCy Schubert if (errflg) 2022b15cb3dSCy Schubert optionUsage(&ntpdOptions, 2); /* does not return */ 203224ba2bdSOllivier Robert } 204