If LOCALSTATEDIR is inaccessible, store the pid and socket files in the configuration...
[tinc] / src / names.c
index 37708f8..6e52886 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
@@ -64,8 +64,6 @@ void make_names(void) {
                                else
                                        xasprintf(&confbase, "%s", installdir);
                        }
-                       if(!pidfilename)
-                               xasprintf(&pidfilename, "%s" SLASH "pid", confbase);
                }
                RegCloseKey(key);
        }
@@ -73,11 +71,36 @@ void make_names(void) {
        if(!confdir)
                confdir = xstrdup(CONFDIR SLASH "tinc");
 
+       if(!confbase) {
+               if(netname)
+                       xasprintf(&confbase, CONFDIR SLASH "tinc" SLASH "%s", netname);
+               else
+                       xasprintf(&confbase, CONFDIR SLASH "tinc");
+       }
+
+#ifdef HAVE_MINGW
        if(!logfilename)
-               xasprintf(&logfilename, LOCALSTATEDIR SLASH "log" SLASH "%s.log", identname);
+               xasprintf(&logfilename, "%s" SLASH "log", confbase);
 
        if(!pidfilename)
-               xasprintf(&pidfilename, LOCALSTATEDIR SLASH "run" SLASH "%s.pid", identname);
+               xasprintf(&pidfilename, "%s" SLASH "pid", confbase);
+#else
+       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) {
                int len = strlen(pidfilename);
@@ -88,13 +111,6 @@ void make_names(void) {
                else
                        strcpy(unixsocketname + len, ".socket");
        }
-
-       if(!confbase) {
-               if(netname)
-                       xasprintf(&confbase, CONFDIR SLASH "tinc" SLASH "%s", netname);
-               else
-                       xasprintf(&confbase, CONFDIR SLASH "tinc");
-       }
 }
 
 void free_names(void) {