Better optional argument handling.
[tinc] / src / tincd.c
index 7336a5f..5f1447e 100644 (file)
@@ -67,14 +67,18 @@ static bool show_version = false;
 /* If nonzero, use null ciphers and skip all key exchanges. */
 bool bypass_security = false;
 
+#ifdef HAVE_MLOCKALL
 /* If nonzero, disable swapping for this process. */
 static bool do_mlock = false;
+#endif
 
+#ifndef HAVE_MINGW
 /* If nonzero, chroot to netdir after startup. */
 static bool do_chroot = false;
 
 /* If !NULL, do setuid to given user after startup */
 static const char *switchuser = NULL;
+#endif
 
 /* If nonzero, write log entries to a separate file. */
 bool use_logfile = false;
@@ -163,7 +167,9 @@ static bool parse_options(int argc, char **argv) {
                                break;
 #endif
 
-                       case 'd': /* inc debug level */
+                       case 'd': /* increase debug level */
+                               if(!optarg && optind < argc && *argv[optind] != '-')
+                                       optarg = argv[optind++];
                                if(optarg)
                                        debug_level = atoi(optarg);
                                else
@@ -210,6 +216,8 @@ static bool parse_options(int argc, char **argv) {
 
                        case 4:   /* write log entries to a file */
                                use_logfile = true;
+                               if(!optarg && optind < argc && *argv[optind] != '-')
+                                       optarg = argv[optind++];
                                if(optarg)
                                        logfilename = xstrdup(optarg);
                                break;
@@ -227,6 +235,12 @@ static bool parse_options(int argc, char **argv) {
                }
        }
 
+       if(optind < argc) {
+               fprintf(stderr, "%s: unrecognized argument '%s'\n", argv[0], argv[optind]);
+               usage(true);
+               return false;
+       }
+
        if(!netname && (netname = getenv("NETNAME")))
                netname = xstrdup(netname);
 
@@ -246,9 +260,7 @@ static bool parse_options(int argc, char **argv) {
 }
 
 static bool drop_privs(void) {
-#ifdef HAVE_MINGW
-       return false;
-#else
+#ifndef HAVE_MINGW
        uid_t uid = 0;
        if (switchuser) {
                struct passwd *pw = getpwnam(switchuser);
@@ -344,7 +356,8 @@ int main(int argc, char **argv) {
 
        /* Slllluuuuuuurrrrp! */
 
-       srand(time(NULL));
+       gettimeofday(&now, NULL);
+       srand(now.tv_sec + now.tv_usec);
        crypto_init();
 
        if(!read_server_config())