If LOCALSTATEDIR is inaccessible, store the pid and socket files in the configuration...
authorGuus Sliepen <guus@tinc-vpn.org>
Tue, 19 May 2015 20:17:18 +0000 (22:17 +0200)
committerGuus Sliepen <guus@tinc-vpn.org>
Tue, 19 May 2015 20:17:18 +0000 (22:17 +0200)
The compile time local state directory is usually /var or
/usr/local/var. If this is not accessible for some reason, for example
because someone ./configured tinc without --localstatedir and
/usr/local/var does not exist, or if tinc is started by a non-root user,
then tinc will fall back to the directory where tinc.conf is stored.
A warning is logged when this happens.

src/names.c

index 8218216ece0aacd1a504f02932380140bd8c92ff..6e5288683dd5c3c44b9a3d7d79e4ebb094960d3b 100644 (file)
@@ -1,7 +1,7 @@
 /*
     names.c -- generate commonly used (file)names
     Copyright (C) 1998-2005 Ivo Timmermans
-                  2000-2013 Guus Sliepen <guus@tinc-vpn.org>
+                  2000-2015 Guus Sliepen <guus@tinc-vpn.org>
 
     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
@@ -85,11 +85,21 @@ void make_names(void) {
        if(!pidfilename)
                xasprintf(&pidfilename, "%s" SLASH "pid", confbase);
 #else
-       if(!logfilename)
-               xasprintf(&logfilename, LOCALSTATEDIR SLASH "log" SLASH "%s.log", identname);
-
-       if(!pidfilename)
-               xasprintf(&pidfilename, LOCALSTATEDIR SLASH "run" SLASH "%s.pid", identname);
+       if(!access(LOCALSTATEDIR, R_OK | W_OK | X_OK)) {
+               if(!logfilename)
+                       xasprintf(&logfilename, LOCALSTATEDIR SLASH "log" SLASH "%s.log", identname);
+
+               if(!pidfilename)
+                       xasprintf(&pidfilename, LOCALSTATEDIR SLASH "run" SLASH "%s.pid", identname);
+       } else {
+               if(!logfilename)
+                       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);
+                       xasprintf(&pidfilename, "%s" SLASH "pid", confbase);
+               }
+       }
 #endif
 
        if(!unixsocketname) {