1/* $NetBSD: cmd_args.c,v 1.7 2021/01/03 15:33:05 roy Exp $ */ 2 3/* 4 * cmd_args.c = command-line argument processing 5 */ 6#ifdef HAVE_CONFIG_H 7# include <config.h> 8#endif 9 10#include "ntpd.h" 11#include "ntp_stdlib.h" 12#include "ntp_config.h" 13#include "ntp_cmdargs.h" 14 15#include "ntpd-opts.h" 16 17/* 18 * Definitions of things either imported from or exported to outside 19 */ 20extern char const *progname; 21 22#ifdef HAVE_NETINFO 23extern int check_netinfo; 24#endif 25 26 27/* 28 * getCmdOpts - apply most command line options 29 * 30 * A few options are examined earlier in ntpd.c ntpdmain() and 31 * ports/winnt/ntpd/ntservice.c main(). 32 */ 33void 34getCmdOpts( 35 int argc, 36 char ** argv 37 ) 38{ 39 extern const char *config_file; 40 int errflg; 41 42 /* 43 * Initialize, initialize 44 */ 45 errflg = 0; 46 47 if (ipv4_works && ipv6_works) { 48 if (HAVE_OPT( IPV4 )) 49 ipv6_works = 0; 50 else if (HAVE_OPT( IPV6 )) 51 ipv4_works = 0; 52 } else if (!ipv4_works && !ipv6_works) { 53 msyslog(LOG_ERR, "Neither IPv4 nor IPv6 networking detected, fatal."); 54 exit(1); 55 } else if (HAVE_OPT( IPV4 ) && !ipv4_works) 56 msyslog(LOG_WARNING, "-4/--ipv4 ignored, IPv4 networking not found."); 57 else if (HAVE_OPT( IPV6 ) && !ipv6_works) 58 msyslog(LOG_WARNING, "-6/--ipv6 ignored, IPv6 networking not found."); 59 60 if (HAVE_OPT( AUTHREQ )) 61 proto_config(PROTO_AUTHENTICATE, 1, 0., NULL); 62 else if (HAVE_OPT( AUTHNOREQ )) 63 proto_config(PROTO_AUTHENTICATE, 0, 0., NULL); 64 65 if (HAVE_OPT( BCASTSYNC )) 66 proto_config(PROTO_BROADCLIENT, 1, 0., NULL); 67 68 if (HAVE_OPT( CONFIGFILE )) { 69 config_file = OPT_ARG( CONFIGFILE ); 70#ifdef HAVE_NETINFO 71 check_netinfo = 0; 72#endif 73 } 74 75 if (HAVE_OPT( DRIFTFILE )) 76 stats_config(STATS_FREQ_FILE, OPT_ARG( DRIFTFILE ), 0); 77 78 if (HAVE_OPT( PANICGATE )) 79 allow_panic = TRUE; 80 81 if (HAVE_OPT( FORCE_STEP_ONCE )) 82 force_step_once = TRUE; 83 84#ifdef HAVE_DROPROOT 85 if (HAVE_OPT( JAILDIR )) { 86 droproot = 1; 87 chrootdir = OPT_ARG( JAILDIR ); 88 } 89#endif 90 91 if (HAVE_OPT( KEYFILE )) 92 getauthkeys(OPT_ARG( KEYFILE )); 93 94 if (HAVE_OPT( PIDFILE )) 95 stats_config(STATS_PID_FILE, OPT_ARG( PIDFILE ), 0); 96 97 if (HAVE_OPT( QUIT )) 98 mode_ntpdate = TRUE; 99 100 if (HAVE_OPT( PROPAGATIONDELAY )) 101 do { 102 double tmp; 103 const char *my_ntp_optarg = OPT_ARG( PROPAGATIONDELAY ); 104 105 if (sscanf(my_ntp_optarg, "%lf", &tmp) != 1) { 106 msyslog(LOG_ERR, 107 "command line broadcast delay value %s undecodable", 108 my_ntp_optarg); 109 } else { 110 proto_config(PROTO_BROADDELAY, 0, tmp, NULL); 111 } 112 } while (0); 113 114 if (HAVE_OPT( STATSDIR )) 115 stats_config(STATS_STATSDIR, OPT_ARG( STATSDIR ), 0); 116 117 if (HAVE_OPT( TRUSTEDKEY )) { 118 int ct = STACKCT_OPT( TRUSTEDKEY ); 119 const char** pp = STACKLST_OPT( TRUSTEDKEY ); 120 121 do { 122 u_long tkey; 123 const char* p = *pp++; 124 125 tkey = (int)atol(p); 126 if (tkey == 0 || tkey > NTP_MAXKEY) { 127 msyslog(LOG_ERR, 128 "command line trusted key %s is invalid", 129 p); 130 } else { 131 authtrust(tkey, 1); 132 } 133 } while (--ct > 0); 134 } 135 136#ifdef HAVE_DROPROOT 137 if (HAVE_OPT( USER )) { 138 droproot = 1; 139 user = estrdup(OPT_ARG( USER )); 140 group = strrchr(user, ':'); 141 if (group != NULL) { 142 size_t len; 143 144 *group++ = '\0'; /* get rid of the ':' */ 145 len = group - user; 146 group = estrdup(group); 147 user = erealloc(user, len); 148 } 149 } 150#endif 151 152 if (HAVE_OPT( VAR )) { 153 int ct; 154 const char ** pp; 155 const char * v_assign; 156 157 ct = STACKCT_OPT( VAR ); 158 pp = STACKLST_OPT( VAR ); 159 160 do { 161 v_assign = *pp++; 162 set_sys_var(v_assign, strlen(v_assign) + 1, RW); 163 } while (--ct > 0); 164 } 165 166 if (HAVE_OPT( DVAR )) { 167 int ct = STACKCT_OPT( DVAR ); 168 const char** pp = STACKLST_OPT( DVAR ); 169 170 do { 171 const char* my_ntp_optarg = *pp++; 172 173 set_sys_var(my_ntp_optarg, strlen(my_ntp_optarg)+1, 174 (u_short) (RW | DEF)); 175 } while (--ct > 0); 176 } 177 178 if (HAVE_OPT( SLEW )) 179 loop_config(LOOP_MAX, 600); 180 181 if (HAVE_OPT( UPDATEINTERVAL )) { 182 long val = OPT_VALUE_UPDATEINTERVAL; 183 184 if (val >= 0) { 185 interface_interval = val; 186 if (interface_interval == 0) 187 disable_dynamic_updates = 1; 188 } else { 189 fprintf(stderr, 190 "command line interface update interval %ld must not be negative\n", 191 val); 192 msyslog(LOG_ERR, 193 "command line interface update interval %ld must not be negative", 194 val); 195 errflg++; 196 } 197 } 198 199 200 /* save list of servers from cmd line for config_peers() use */ 201 if (argc > 0) { 202 cmdline_server_count = argc; 203 cmdline_servers = argv; 204 } 205 206 /* display usage & exit with any option processing errors */ 207 if (errflg) 208 optionUsage(&ntpdOptions, 2); /* does not return */ 209} 210