Merge branch '1.1' of github.com:gsliepen/tinc into thkr-1.1-ponyhof
This commit is contained in:
commit
9bf36c8666
10 changed files with 83 additions and 14 deletions
|
@ -15,7 +15,7 @@
|
|||
|
||||
This is the info manual for @value{PACKAGE} version @value{VERSION}, a Virtual Private Network daemon.
|
||||
|
||||
Copyright @copyright{} 1998-2014 Ivo Timmermans,
|
||||
Copyright @copyright{} 1998-2015 Ivo Timmermans,
|
||||
Guus Sliepen <guus@@tinc-vpn.org> and
|
||||
Wessel Dankers <wsl@@tinc-vpn.org>.
|
||||
|
||||
|
@ -43,7 +43,7 @@ permission notice identical to this one.
|
|||
@vskip 0pt plus 1filll
|
||||
This is the info manual for @value{PACKAGE} version @value{VERSION}, a Virtual Private Network daemon.
|
||||
|
||||
Copyright @copyright{} 1998-2014 Ivo Timmermans,
|
||||
Copyright @copyright{} 1998-2015 Ivo Timmermans,
|
||||
Guus Sliepen <guus@@tinc-vpn.org> and
|
||||
Wessel Dankers <wsl@@tinc-vpn.org>.
|
||||
|
||||
|
|
|
@ -84,7 +84,7 @@ char *get_my_hostname() {
|
|||
char *port = NULL;
|
||||
char *hostport = NULL;
|
||||
char *name = get_my_name(false);
|
||||
char filename[PATH_MAX];
|
||||
char filename[PATH_MAX] = {0};
|
||||
|
||||
// Use first Address statement in own host config file
|
||||
if(check_id(name)) {
|
||||
|
@ -182,7 +182,7 @@ again:
|
|||
hostname = xstrdup(line);
|
||||
|
||||
save:
|
||||
if(filename) {
|
||||
if(*filename) {
|
||||
FILE *f = fopen(filename, "a");
|
||||
if(f) {
|
||||
fprintf(f, "\nAddress = %s\n", hostname);
|
||||
|
|
|
@ -26,6 +26,7 @@
|
|||
#include "logger.h"
|
||||
#include "connection.h"
|
||||
#include "control_common.h"
|
||||
#include "process.h"
|
||||
#include "sptps.h"
|
||||
|
||||
debug_t debug_level = DEBUG_NOTHING;
|
||||
|
@ -37,7 +38,7 @@ static HANDLE loghandle = NULL;
|
|||
#endif
|
||||
static const char *logident = NULL;
|
||||
bool logcontrol = false;
|
||||
|
||||
int umbilical = 0;
|
||||
|
||||
static void real_logger(int level, int priority, const char *message) {
|
||||
char timestr[32] = "";
|
||||
|
@ -79,6 +80,11 @@ static void real_logger(int level, int priority, const char *message) {
|
|||
case LOGMODE_NULL:
|
||||
break;
|
||||
}
|
||||
|
||||
if(umbilical && do_detach) {
|
||||
write(umbilical, message, strlen(message));
|
||||
write(umbilical, "\n", 1);
|
||||
}
|
||||
}
|
||||
|
||||
if(logcontrol) {
|
||||
|
|
|
@ -69,6 +69,7 @@ enum {
|
|||
|
||||
extern debug_t debug_level;
|
||||
extern bool logcontrol;
|
||||
extern int umbilical;
|
||||
extern void openlogger(const char *, logmode_t);
|
||||
extern void reopenlogger(void);
|
||||
extern void logger(int, int, const char *, ...) __attribute__ ((__format__(printf, 3, 4)));
|
||||
|
|
|
@ -1196,7 +1196,7 @@ static void try_tx_sptps(node_t *n, bool mtu) {
|
|||
if(via != n) {
|
||||
if((via->options >> 24) < 4)
|
||||
return;
|
||||
return try_tx_sptps(via, mtu);
|
||||
return try_tx(via, mtu);
|
||||
}
|
||||
|
||||
/* Otherwise, try to establish UDP connectivity. */
|
||||
|
@ -1209,7 +1209,7 @@ static void try_tx_sptps(node_t *n, bool mtu) {
|
|||
while we try to establish direct connectivity. */
|
||||
|
||||
if(!n->status.udp_confirmed && n != n->nexthop && (n->nexthop->options >> 24) >= 4)
|
||||
try_tx_sptps(n->nexthop, mtu);
|
||||
try_tx(n->nexthop, mtu);
|
||||
}
|
||||
|
||||
static void try_tx_legacy(node_t *n, bool mtu) {
|
||||
|
@ -1234,6 +1234,8 @@ static void try_tx_legacy(node_t *n, bool mtu) {
|
|||
}
|
||||
|
||||
void try_tx(node_t *n, bool mtu) {
|
||||
if(!n->status.reachable)
|
||||
return;
|
||||
if(n->status.sptps)
|
||||
try_tx_sptps(n, mtu);
|
||||
else
|
||||
|
@ -1270,7 +1272,7 @@ void send_packet(node_t *n, vpn_packet_t *packet) {
|
|||
|
||||
if(n->status.sptps) {
|
||||
send_sptps_packet(n, packet);
|
||||
try_tx_sptps(n, true);
|
||||
try_tx(n, true);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -1290,7 +1292,7 @@ void send_packet(node_t *n, vpn_packet_t *packet) {
|
|||
}
|
||||
|
||||
send_udppacket(via, packet);
|
||||
try_tx_legacy(via, true);
|
||||
try_tx(via, true);
|
||||
}
|
||||
|
||||
void broadcast_packet(const node_t *from, vpn_packet_t *packet) {
|
||||
|
@ -1473,7 +1475,7 @@ skip_harder:
|
|||
|
||||
if(to != myself) {
|
||||
send_sptps_data(to, from, 0, DATA(&pkt), pkt.len);
|
||||
try_tx_sptps(to, true);
|
||||
try_tx(to, true);
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
|
|
|
@ -800,6 +800,11 @@ void try_outgoing_connections(void) {
|
|||
continue;
|
||||
}
|
||||
|
||||
if(!strcmp(name, myself->name)) {
|
||||
free(name);
|
||||
continue;
|
||||
}
|
||||
|
||||
bool found = false;
|
||||
|
||||
for list_each(outgoing_t, outgoing, outgoing_list) {
|
||||
|
|
|
@ -33,6 +33,7 @@ bool send_request(void *c, const char *msg, ...) { return false; }
|
|||
struct list_t *connection_list = NULL;
|
||||
bool send_meta(void *c, const char *msg , int len) { return false; }
|
||||
char *logfilename = NULL;
|
||||
bool do_detach = false;
|
||||
struct timeval now;
|
||||
|
||||
static bool send_data(void *handle, uint8_t type, const void *data, size_t len) {
|
||||
|
|
|
@ -35,6 +35,7 @@ bool send_request(void *c, const char *msg, ...) { return false; }
|
|||
struct list_t *connection_list = NULL;
|
||||
bool send_meta(void *c, const char *msg , int len) { return false; }
|
||||
char *logfilename = NULL;
|
||||
bool do_detach = false;
|
||||
struct timeval now;
|
||||
|
||||
static bool verbose;
|
||||
|
|
|
@ -89,7 +89,7 @@ static struct option const long_options[] = {
|
|||
static void version(void) {
|
||||
printf("%s version %s (built %s %s, protocol %d.%d)\n", PACKAGE,
|
||||
BUILD_VERSION, BUILD_DATE, BUILD_TIME, PROT_MAJOR, PROT_MINOR);
|
||||
printf("Copyright (C) 1998-2014 Ivo Timmermans, Guus Sliepen and others.\n"
|
||||
printf("Copyright (C) 1998-2015 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"
|
||||
|
@ -853,6 +853,13 @@ static int cmd_start(int argc, char *argv[]) {
|
|||
}
|
||||
return status;
|
||||
#else
|
||||
int pfd[2] = {-1, -1};
|
||||
if(socketpair(AF_UNIX, SOCK_STREAM, 0, pfd)) {
|
||||
fprintf(stderr, "Could not create umbilical socket: %s\n", strerror(errno));
|
||||
free(nargv);
|
||||
return 1;
|
||||
}
|
||||
|
||||
pid_t pid = fork();
|
||||
if(pid == -1) {
|
||||
fprintf(stderr, "Could not fork: %s\n", strerror(errno));
|
||||
|
@ -860,8 +867,15 @@ static int cmd_start(int argc, char *argv[]) {
|
|||
return 1;
|
||||
}
|
||||
|
||||
if(!pid)
|
||||
if(!pid) {
|
||||
close(pfd[0]);
|
||||
char buf[100] = "";
|
||||
snprintf(buf, sizeof buf, "%d", pfd[1]);
|
||||
setenv("TINC_UMBILICAL", buf, true);
|
||||
exit(execvp(c, nargv));
|
||||
} else {
|
||||
close(pfd[1]);
|
||||
}
|
||||
|
||||
free(nargv);
|
||||
|
||||
|
@ -869,12 +883,33 @@ static int cmd_start(int argc, char *argv[]) {
|
|||
#ifdef SIGINT
|
||||
signal(SIGINT, SIG_IGN);
|
||||
#endif
|
||||
|
||||
// Pass all log messages from the umbilical to stderr.
|
||||
// A nul-byte right before closure means tincd started succesfully.
|
||||
bool failure = true;
|
||||
char buf[1024];
|
||||
ssize_t len;
|
||||
|
||||
while((len = read(pfd[0], buf, sizeof buf)) > 0) {
|
||||
failure = buf[len - 1];
|
||||
if(!failure)
|
||||
len--;
|
||||
write(2, buf, len);
|
||||
}
|
||||
|
||||
if(len)
|
||||
failure = true;
|
||||
|
||||
close(pfd[0]);
|
||||
|
||||
// Make sure the child process is really gone.
|
||||
result = waitpid(pid, &status, 0);
|
||||
|
||||
#ifdef SIGINT
|
||||
signal(SIGINT, SIG_DFL);
|
||||
#endif
|
||||
|
||||
if(result != pid || !WIFEXITED(status) || WEXITSTATUS(status)) {
|
||||
if(failure || result != pid || !WIFEXITED(status) || WEXITSTATUS(status)) {
|
||||
fprintf(stderr, "Error starting %s\n", c);
|
||||
return 1;
|
||||
}
|
||||
|
|
20
src/tincd.c
20
src/tincd.c
|
@ -344,7 +344,7 @@ int main(int argc, char **argv) {
|
|||
if(show_version) {
|
||||
printf("%s version %s (built %s %s, protocol %d.%d)\n", PACKAGE,
|
||||
BUILD_VERSION, BUILD_DATE, BUILD_TIME, PROT_MAJOR, PROT_MINOR);
|
||||
printf("Copyright (C) 1998-2014 Ivo Timmermans, Guus Sliepen and others.\n"
|
||||
printf("Copyright (C) 1998-2015 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"
|
||||
|
@ -363,6 +363,18 @@ int main(int argc, char **argv) {
|
|||
logger(DEBUG_ALWAYS, LOG_ERR, "System call `%s' failed: %s", "WSAStartup", winerror(GetLastError()));
|
||||
return 1;
|
||||
}
|
||||
#else
|
||||
// Check if we got an umbilical fd from the process that started us
|
||||
char *umbstr = getenv("TINC_UMBILICAL");
|
||||
if(umbstr) {
|
||||
umbilical = atoi(umbstr);
|
||||
if(fcntl(umbilical, F_GETFL) < 0)
|
||||
umbilical = 0;
|
||||
#ifdef FD_CLOEXEC
|
||||
if(umbilical)
|
||||
fcntl(umbilical, F_SETFD, FD_CLOEXEC);
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
|
||||
openlogger("tinc", use_logfile?LOGMODE_FILE:LOGMODE_STDERR);
|
||||
|
@ -466,6 +478,12 @@ int main2(int argc, char **argv) {
|
|||
|
||||
logger(DEBUG_ALWAYS, LOG_NOTICE, "Ready");
|
||||
|
||||
if(umbilical) { // snip!
|
||||
write(umbilical, "", 1);
|
||||
close(umbilical);
|
||||
umbilical = 0;
|
||||
}
|
||||
|
||||
try_outgoing_connections();
|
||||
|
||||
status = main_loop();
|
||||
|
|
Loading…
Reference in a new issue