Allow connections to be closed.
This only closes existing meta connections, it may not affect node reachability.
This commit is contained in:
parent
f12c36afd5
commit
55ef2f806f
3 changed files with 54 additions and 0 deletions
|
@ -92,6 +92,27 @@ bool control_h(connection_t *c, char *request) {
|
|||
int result = reload_configuration();
|
||||
return control_return(c, REQ_RELOAD, result);
|
||||
|
||||
case REQ_DISCONNECT: {
|
||||
char name[MAX_STRING_SIZE];
|
||||
connection_t *other;
|
||||
splay_node_t *node, *next;
|
||||
bool found = false;
|
||||
|
||||
if(sscanf(request, "%*d %*d " MAX_STRING, name) != 1)
|
||||
return control_return(c, REQ_DISCONNECT, -1);
|
||||
|
||||
for(node = connection_tree->head; node; node = next) {
|
||||
next = node->next;
|
||||
other = node->data;
|
||||
if(strcmp(other->name, name))
|
||||
continue;
|
||||
terminate_connection(other, other->status.active);
|
||||
found = true;
|
||||
}
|
||||
|
||||
return control_return(c, REQ_DISCONNECT, found ? 0 : -2);
|
||||
}
|
||||
|
||||
default:
|
||||
return send_request(c, "%d %d", CONTROL, REQ_INVALID);
|
||||
}
|
||||
|
|
|
@ -35,6 +35,8 @@ enum request_type {
|
|||
REQ_PURGE,
|
||||
REQ_SET_DEBUG,
|
||||
REQ_RETRY,
|
||||
REQ_CONNECT,
|
||||
REQ_DISCONNECT,
|
||||
};
|
||||
|
||||
#define TINC_CTL_VERSION_CURRENT 0
|
||||
|
|
|
@ -92,6 +92,7 @@ static void usage(bool status) {
|
|||
" debug N Set debug level\n"
|
||||
" retry Retry all outgoing connections\n"
|
||||
" reload Partial reload of configuration\n"
|
||||
" disconnect NODE Close meta connection with NODE\n"
|
||||
"\n");
|
||||
printf("Report bugs to tinc@tinc-vpn.org.\n");
|
||||
}
|
||||
|
@ -595,6 +596,36 @@ int main(int argc, char *argv[], char *envp[]) {
|
|||
return 0;
|
||||
}
|
||||
|
||||
if(!strcasecmp(argv[optind], "connect")) {
|
||||
if(argc != optind + 2) {
|
||||
fprintf(stderr, "Invalid arguments.\n");
|
||||
return 1;
|
||||
}
|
||||
char *name = argv[optind + 1];
|
||||
|
||||
sendline(fd, "%d %d %s", CONTROL, REQ_CONNECT, name);
|
||||
if(!recvline(fd, line, sizeof line) || sscanf(line, "%d %d %d", &code, &req, &result) != 3 || code != CONTROL || req != REQ_CONNECT || result) {
|
||||
fprintf(stderr, "Could not connect to %s\n", name);
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
if(!strcasecmp(argv[optind], "disconnect")) {
|
||||
if(argc != optind + 2) {
|
||||
fprintf(stderr, "Invalid arguments.\n");
|
||||
return 1;
|
||||
}
|
||||
char *name = argv[optind + 1];
|
||||
|
||||
sendline(fd, "%d %d %s", CONTROL, REQ_DISCONNECT, name);
|
||||
if(!recvline(fd, line, sizeof line) || sscanf(line, "%d %d %d", &code, &req, &result) != 3 || code != CONTROL || req != REQ_DISCONNECT || result) {
|
||||
fprintf(stderr, "Could not disconnect %s\n", name);
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
fprintf(stderr, "Unknown command `%s'.\n", argv[optind]);
|
||||
usage(true);
|
||||
|
||||
|
|
Loading…
Reference in a new issue