X-Git-Url: https://tinc-vpn.org/git/browse?a=blobdiff_plain;f=src%2Ftincctl.c;h=cb9740ef727d575feca2347750282d1bf4513485;hb=23a634becf09ac84c71250474fcb96e23b0ebdf1;hp=1576ba86a3c6de6cb9bf70bc3929f527cccdf4d1;hpb=f5bb64b36ae0807cdd3f241f81a8e933065437f6;p=tinc diff --git a/src/tincctl.c b/src/tincctl.c index 1576ba86..cb9740ef 100644 --- a/src/tincctl.c +++ b/src/tincctl.c @@ -1,6 +1,6 @@ /* tincctl.c -- Controlling a running tincd - Copyright (C) 2007-2012 Guus Sliepen + Copyright (C) 2007-2013 Guus Sliepen This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -112,11 +112,10 @@ static void usage(bool status) { "\n" "Valid commands are:\n" " init [name] Create initial configuration files.\n" - " config Change configuration:\n" - " [get] VARIABLE - print current value of VARIABLE\n" - " [set] VARIABLE VALUE - set VARIABLE to VALUE\n" - " add VARIABLE VALUE - add VARIABLE with the given VALUE\n" - " del VARIABLE [VALUE] - remove VARIABLE [only ones with watching VALUE]\n" + " get VARIABLE Print current value of VARIABLE\n" + " set VARIABLE VALUE Set VARIABLE to VALUE\n" + " add VARIABLE VALUE Add VARIABLE with the given VALUE\n" + " del VARIABLE [VALUE] Remove VARIABLE [only ones with watching VALUE]\n" " start [tincd options] Start tincd.\n" " stop Stop tincd.\n" " restart Restart tincd.\n" @@ -666,6 +665,26 @@ static bool connect_tincd(bool verbose) { } #endif +#ifndef HAVE_MINGW + struct sockaddr_un sa; + sa.sun_family = AF_UNIX; + strncpy(sa.sun_path, unixsocketname, sizeof sa.sun_path); + + fd = socket(AF_UNIX, SOCK_STREAM, 0); + if(fd < 0) { + if(verbose) + fprintf(stderr, "Cannot create UNIX socket: %s\n", sockstrerror(sockerrno)); + return false; + } + + if(connect(fd, (struct sockaddr *)&sa, sizeof sa) < 0) { + if(verbose) + fprintf(stderr, "Cannot connect to UNIX socket %s: %s\n", unixsocketname, sockstrerror(sockerrno)); + close(fd); + fd = -1; + return false; + } +#else struct addrinfo hints = { .ai_family = AF_UNSPEC, .ai_socktype = SOCK_STREAM, @@ -706,6 +725,7 @@ static bool connect_tincd(bool verbose) { } freeaddrinfo(res); +#endif char data[4096]; int version; @@ -813,16 +833,10 @@ static int cmd_stop(int argc, char *argv[]) { } sendline(fd, "%d %d", CONTROL, REQ_STOP); - if(!recvline(fd, line, sizeof line) || sscanf(line, "%d %d %d", &code, &req, &result) != 3 || code != CONTROL || req != REQ_STOP || result) { - fprintf(stderr, "Could not stop tinc daemon.\n"); - return 1; - } - // Wait for tincd to close the connection... - fd_set r; - FD_ZERO(&r); - FD_SET(fd, &r); - select(fd + 1, &r, NULL, NULL, NULL); + while(recvline(fd, line, sizeof line)) { + // Wait for tincd to close the connection... + } #else if(!remove_service()) return 1; @@ -1133,7 +1147,7 @@ static int cmd_top(int argc, char *argv[]) { top(fd); return 0; #else - fprintf(stderr, "This version of tincctl was compiled without support for the curses library.\n"); + fprintf(stderr, "This version of tinc was compiled without support for the curses library.\n"); return 1; #endif } @@ -1184,10 +1198,11 @@ static int rstrip(char *value) { return len; } -static char *get_my_name() { +static char *get_my_name(bool verbose) { FILE *f = fopen(tinc_conf, "r"); if(!f) { - fprintf(stderr, "Could not open %s: %s\n", tinc_conf, strerror(errno)); + if(verbose) + fprintf(stderr, "Could not open %s: %s\n", tinc_conf, strerror(errno)); return NULL; } @@ -1213,7 +1228,8 @@ static char *get_my_name() { } fclose(f); - fprintf(stderr, "Could not find Name in %s.\n", tinc_conf); + if(verbose) + fprintf(stderr, "Could not find Name in %s.\n", tinc_conf); return NULL; } @@ -1294,6 +1310,9 @@ static int cmd_config(int argc, char *argv[]) { return 1; } + if(strcasecmp(argv[0], "config")) + argv--, argc++; + int action = -2; if(!strcasecmp(argv[1], "get")) { argv++, argc--; @@ -1387,7 +1406,7 @@ static int cmd_config(int argc, char *argv[]) { /* Should this go into our own host config file? */ if(!node && !(variables[i].type & VAR_SERVER)) { - node = get_my_name(); + node = get_my_name(true); if(!node) return 1; } @@ -1677,6 +1696,9 @@ static int cmd_generate_keys(int argc, char *argv[]) { return 1; } + if(!name) + name = get_my_name(false); + return !(rsa_keygen(argc > 1 ? atoi(argv[1]) : 2048, true) && ecdsa_keygen(true)); } @@ -1686,6 +1708,9 @@ static int cmd_generate_rsa_keys(int argc, char *argv[]) { return 1; } + if(!name) + name = get_my_name(false); + return !rsa_keygen(argc > 1 ? atoi(argv[1]) : 2048, true); } @@ -1695,6 +1720,9 @@ static int cmd_generate_ecdsa_keys(int argc, char *argv[]) { return 1; } + if(!name) + name = get_my_name(false); + return !ecdsa_keygen(true); } @@ -1816,13 +1844,15 @@ static int cmd_export(int argc, char *argv[]) { return 1; } - char *name = get_my_name(); + char *name = get_my_name(true); if(!name) return 1; int result = export(name, stdout); if(!tty) fclose(stdout); + + free(name); return result; } @@ -1960,6 +1990,12 @@ static const struct { {"log", cmd_log}, {"pid", cmd_pid}, {"config", cmd_config}, + {"add", cmd_config}, + {"del", cmd_config}, + {"get", cmd_config}, + {"set", cmd_config}, + {"change", cmd_config}, + {"replace", cmd_config}, {"init", cmd_init}, {"generate-keys", cmd_generate_keys}, {"generate-rsa-keys", cmd_generate_rsa_keys},