diff --git a/src/invitation.c b/src/invitation.c index cc6cbd4d..ed2df88a 100644 --- a/src/invitation.c +++ b/src/invitation.c @@ -551,7 +551,7 @@ make_names: confbase = NULL; } - make_names(); + make_names(false); free(tinc_conf); free(hosts_dir); @@ -756,7 +756,7 @@ ask_netname: } netname = line; - make_names(); + make_names(false); } fprintf(stderr, "Configuration stored in: %s\n", confbase); diff --git a/src/names.c b/src/names.c index 6e528868..d8935baa 100644 --- a/src/names.c +++ b/src/names.c @@ -36,7 +36,7 @@ char *program_name = NULL; /* Set all files and paths according to netname */ -void make_names(void) { +void make_names(bool daemon) { #ifdef HAVE_MINGW HKEY key; char installdir[1024] = ""; @@ -85,7 +85,21 @@ void make_names(void) { if(!pidfilename) xasprintf(&pidfilename, "%s" SLASH "pid", confbase); #else - if(!access(LOCALSTATEDIR, R_OK | W_OK | X_OK)) { + bool fallback = false; + if(daemon) { + if(access(LOCALSTATEDIR, R_OK | W_OK | X_OK)) + fallback = true; + } else { + char fname[PATH_MAX]; + snprintf(fname, sizeof fname, LOCALSTATEDIR SLASH "run" SLASH "%s.pid", identname); + if(access(fname, R_OK)) { + snprintf(fname, sizeof fname, "%s" SLASH "pid", confbase); + if(!access(fname, R_OK)) + fallback = true; + } + } + + if(!fallback) { if(!logfilename) xasprintf(&logfilename, LOCALSTATEDIR SLASH "log" SLASH "%s.log", identname); @@ -96,7 +110,8 @@ void make_names(void) { xasprintf(&logfilename, "%s" SLASH "log", confbase); if(!pidfilename) { - logger(DEBUG_ALWAYS, LOG_WARNING, "Could not access " LOCALSTATEDIR SLASH " (%s), storing pid and socket files in %s" SLASH, strerror(errno), confbase); + if(daemon) + logger(DEBUG_ALWAYS, LOG_WARNING, "Could not access " LOCALSTATEDIR SLASH " (%s), storing pid and socket files in %s" SLASH, strerror(errno), confbase); xasprintf(&pidfilename, "%s" SLASH "pid", confbase); } } diff --git a/src/names.h b/src/names.h index 1163ff6e..a2395af7 100644 --- a/src/names.h +++ b/src/names.h @@ -1,7 +1,7 @@ /* names.h -- header for names.c Copyright (C) 1998-2005 Ivo Timmermans - 2000-2013 Guus Sliepen + 2000-2015 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 @@ -31,7 +31,7 @@ extern char *logfilename; extern char *pidfilename; extern char *program_name; -extern void make_names(void); +extern void make_names(bool daemon); extern void free_names(void); #endif /* __TINC_NAMES_H__ */ diff --git a/src/tincctl.c b/src/tincctl.c index fc59c580..46bf5bd5 100644 --- a/src/tincctl.c +++ b/src/tincctl.c @@ -2558,7 +2558,7 @@ int main(int argc, char *argv[]) { if(!parse_options(argc, argv)) return 1; - make_names(); + make_names(false); xasprintf(&tinc_conf, "%s" SLASH "tinc.conf", confbase); xasprintf(&hosts_dir, "%s" SLASH "hosts", confbase); diff --git a/src/tincd.c b/src/tincd.c index 226f4f5e..fb2a1557 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-2014 Guus Sliepen + 2000-2015 Guus Sliepen 2008 Max Rijevski 2009 Michael Tokarev 2010 Julien Muchembled @@ -339,7 +339,7 @@ int main(int argc, char **argv) { if(!parse_options(argc, argv)) return 1; - make_names(); + make_names(true); if(show_version) { printf("%s version %s (built %s %s, protocol %d.%d)\n", PACKAGE,