X-Git-Url: https://www.tinc-vpn.org/git/browse?p=tinc;a=blobdiff_plain;f=src%2Ftincd.c;h=7416d11bb0c25d1b9edbfa7722125a2d84a1078b;hp=4f03db6f57558c9eca149d9423664fd007428bc3;hb=724d79e88051b9c50704424c1cda2cedcf87dba0;hpb=535a55100bb77f107c85361e9f72a194e92bc8bc diff --git a/src/tincd.c b/src/tincd.c index 4f03db6f..7416d11b 100644 --- a/src/tincd.c +++ b/src/tincd.c @@ -1,7 +1,7 @@ /* tincd.c -- the main file for tincd Copyright (C) 1998-2005 Ivo Timmermans - 2000-2012 Guus Sliepen + 2000-2013 Guus Sliepen 2008 Max Rijevski 2009 Michael Tokarev 2010 Julien Muchembled @@ -178,7 +178,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 @@ -187,6 +189,8 @@ static bool parse_options(int argc, char **argv) { case 'k': /* kill old tincds */ #ifndef HAVE_MINGW + if(!optarg && optind < argc && *argv[optind] != '-') + optarg = argv[optind++]; if(optarg) { if(!strcasecmp(optarg, "HUP")) kill_tincd = SIGHUP; @@ -225,8 +229,7 @@ static bool parse_options(int argc, char **argv) { case 'n': /* net name given */ /* netname "." is special: a "top-level name" */ - netname = strcmp(optarg, ".") != 0 ? - xstrdup(optarg) : NULL; + netname = strcmp(optarg, ".") != 0 ? xstrdup(optarg) : NULL; break; case 'o': /* option */ @@ -237,6 +240,8 @@ static bool parse_options(int argc, char **argv) { break; case 'K': /* generate public/private keypair */ + if(!optarg && optind < argc && *argv[optind] != '-') + optarg = argv[optind++]; if(optarg) { generate_keys = atoi(optarg); @@ -274,6 +279,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; @@ -291,6 +298,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; + } + return true; } @@ -338,7 +351,7 @@ static bool keygen(int bits) { RSA *rsa_key; FILE *f; char *name = get_name(); - char *filename; + char *pubname, *privname; fprintf(stderr, "Generating %d bits keys:\n", bits); rsa_key = RSA_generate_key(bits, 0x10001, indicator, NULL); @@ -349,8 +362,9 @@ static bool keygen(int bits) { } else fprintf(stderr, "Done.\n"); - xasprintf(&filename, "%s/rsa_key.priv", confbase); - f = ask_and_open(filename, "private RSA key"); + xasprintf(&privname, "%s/rsa_key.priv", confbase); + f = ask_and_open(privname, "private RSA key"); + free(privname); if(!f) return false; @@ -363,14 +377,14 @@ static bool keygen(int bits) { fputc('\n', f); PEM_write_RSAPrivateKey(f, rsa_key, NULL, NULL, 0, NULL, NULL); fclose(f); - free(filename); if(name) - xasprintf(&filename, "%s/hosts/%s", confbase, name); + xasprintf(&pubname, "%s/hosts/%s", confbase, name); else - xasprintf(&filename, "%s/rsa_key.pub", confbase); + xasprintf(&pubname, "%s/rsa_key.pub", confbase); - f = ask_and_open(filename, "public RSA key"); + f = ask_and_open(pubname, "public RSA key"); + free(pubname); if(!f) return false; @@ -378,7 +392,6 @@ static bool keygen(int bits) { fputc('\n', f); PEM_write_RSAPublicKey(f, rsa_key); fclose(f); - free(filename); free(name); return true; @@ -391,7 +404,7 @@ static void make_names(void) { #ifdef HAVE_MINGW HKEY key; char installdir[1024] = ""; - long len = sizeof(installdir); + DWORD len = sizeof(installdir); #endif if(netname) @@ -401,7 +414,7 @@ static void make_names(void) { #ifdef HAVE_MINGW if(!RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\tinc", 0, KEY_READ, &key)) { - if(!RegQueryValueEx(key, NULL, 0, 0, installdir, &len)) { + if(!RegQueryValueEx(key, NULL, 0, 0, (LPBYTE)installdir, &len)) { if(!logfilename) xasprintf(&logfilename, "%s/log/%s.log", identname); if(!confbase) { @@ -467,8 +480,11 @@ static bool drop_privs() { "initgroups", strerror(errno)); return false; } +#ifndef __ANDROID__ +// Not supported in android NDK endgrent(); endpwent(); +#endif } if (do_chroot) { tzset(); /* for proper timestamps in logs */ @@ -510,7 +526,7 @@ int main(int argc, char **argv) { if(show_version) { printf("%s version %s (built %s %s, protocol %d)\n", PACKAGE, VERSION, __DATE__, __TIME__, PROT_CURRENT); - printf("Copyright (C) 1998-2012 Ivo Timmermans, Guus Sliepen and others.\n" + printf("Copyright (C) 1998-2013 Ivo Timmermans, Guus Sliepen and others.\n" "See the AUTHORS file for a complete list.\n\n" "tinc comes with ABSOLUTELY NO WARRANTY. This is free software,\n" "and you are welcome to redistribute it under certain conditions;\n"