1*4882a593SmuzhiyunFrom b9420c3bfc2a8b9d35d0c8e5f6849007c2bc21fa Mon Sep 17 00:00:00 2001 2*4882a593SmuzhiyunFrom: Darik Horn <dajhorn@vanadac.com> 3*4882a593SmuzhiyunDate: Mon, 14 Apr 2014 13:22:24 -0400 4*4882a593SmuzhiyunSubject: [PATCH] Use FHS installation directories. 5*4882a593Smuzhiyun 6*4882a593SmuzhiyunInstall to `/usr/sbin`, `/usr/lib`, and `/var/lib` according to the Linux 7*4882a593Smuzhiyunfilesystem hierarchy standard if SoftEther is built through autotools. 8*4882a593Smuzhiyun 9*4882a593SmuzhiyunIn a managed installation, the FHS stipulates that the application must 10*4882a593Smuzhiyunaccomodate a read-only installation path. This requires a new `GetStateDir` 11*4882a593Smuzhiyunfunction that substitues `GetExeDir` in some parts of the code. 12*4882a593Smuzhiyun 13*4882a593SmuzhiyunTaken from Github at 14*4882a593Smuzhiyunhttps://github.com/dajhorn/SoftEtherVPN/commit/b9420c3bfc2a8b9d35d0c8e5f6849007c2bc21fa. 15*4882a593Smuzhiyun 16*4882a593SmuzhiyunSigned-off-by: Bernd Kuhls <bernd.kuhls@t-online.de> 17*4882a593SmuzhiyunSigned-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com> 18*4882a593Smuzhiyun 19*4882a593Smuzhiyun[Updated for 4.28 build 9669 beta - src/Mayaqua/Encrypt.c dropped IsXRevoked() 20*4882a593SmuzhiyunSigned-off-by: Matthew Weber <matthew.weber@rockwellcollins.com> 21*4882a593Smuzhiyun--- 22*4882a593Smuzhiyun autotools/softether.am | 1 + 23*4882a593Smuzhiyun src/Cedar/Admin.c | 2 +- 24*4882a593Smuzhiyun src/Cedar/Command.c | 6 +++++- 25*4882a593Smuzhiyun src/Cedar/Logging.c | 2 +- 26*4882a593Smuzhiyun src/Cedar/Server.c | 4 ++-- 27*4882a593Smuzhiyun src/Mayaqua/FileIO.c | 39 ++++++++++++++++++++++++++++++++++++--- 28*4882a593Smuzhiyun src/Mayaqua/FileIO.h | 2 ++ 29*4882a593Smuzhiyun src/Mayaqua/Mayaqua.c | 4 ++++ 30*4882a593Smuzhiyun src/Mayaqua/Table.c | 6 +++++- 31*4882a593Smuzhiyun src/Mayaqua/Unix.c | 6 +++--- 32*4882a593Smuzhiyun src/bin/hamcore/Makefile.am | 8 ++++++-- 33*4882a593Smuzhiyun 11 files changed, 66 insertions(+), 14 deletions(-) 34*4882a593Smuzhiyun 35*4882a593SmuzhiyunIndex: b/autotools/softether.am 36*4882a593Smuzhiyun=================================================================== 37*4882a593Smuzhiyun--- a/autotools/softether.am 38*4882a593Smuzhiyun+++ b/autotools/softether.am 39*4882a593Smuzhiyun@@ -27,6 +27,7 @@ 40*4882a593Smuzhiyun -I$(top_srcdir)/src \ 41*4882a593Smuzhiyun -I$(top_srcdir)/src/Mayaqua \ 42*4882a593Smuzhiyun -I$(top_srcdir)/src/Cedar \ 43*4882a593Smuzhiyun+ -DSTATE_DIR='"@localstatedir@/lib/softether"' \ 44*4882a593Smuzhiyun -DUNIX \ 45*4882a593Smuzhiyun -DUNIX_LINUX \ 46*4882a593Smuzhiyun -D_REENTRANT \ 47*4882a593SmuzhiyunIndex: b/src/Cedar/Admin.c 48*4882a593Smuzhiyun=================================================================== 49*4882a593Smuzhiyun--- a/src/Cedar/Admin.c 50*4882a593Smuzhiyun+++ b/src/Cedar/Admin.c 51*4882a593Smuzhiyun@@ -10334,7 +10334,7 @@ 52*4882a593Smuzhiyun 53*4882a593Smuzhiyun Zero(t, sizeof(RPC_READ_LOG_FILE)); 54*4882a593Smuzhiyun 55*4882a593Smuzhiyun- GetExeDir(exe_dir, sizeof(exe_dir)); 56*4882a593Smuzhiyun+ GetStateDir(exe_dir, sizeof(exe_dir)); 57*4882a593Smuzhiyun Format(full_path, sizeof(full_path), "%s/%s", exe_dir, filepath); 58*4882a593Smuzhiyun 59*4882a593Smuzhiyun // Read file 60*4882a593SmuzhiyunIndex: b/src/Cedar/Command.c 61*4882a593Smuzhiyun=================================================================== 62*4882a593Smuzhiyun--- a/src/Cedar/Command.c 63*4882a593Smuzhiyun+++ b/src/Cedar/Command.c 64*4882a593Smuzhiyun@@ -527,7 +527,7 @@ 65*4882a593Smuzhiyun UINT i; 66*4882a593Smuzhiyun 67*4882a593Smuzhiyun GetExeName(exe, sizeof(exe)); 68*4882a593Smuzhiyun- GetExeDir(exe_dir, sizeof(exe_dir)); 69*4882a593Smuzhiyun+ GetStateDir(exe_dir, sizeof(exe_dir)); 70*4882a593Smuzhiyun 71*4882a593Smuzhiyun ok = false; 72*4882a593Smuzhiyun dirs = EnumDir(exe_dir); 73*4882a593Smuzhiyun@@ -552,7 +552,11 @@ 74*4882a593Smuzhiyun UCHAR *buf; 75*4882a593Smuzhiyun IO *io; 76*4882a593Smuzhiyun #ifndef OS_WIN32 77*4882a593Smuzhiyun+#ifdef STATE_DIR 78*4882a593Smuzhiyun+ wchar_t *filename = L"" STATE_DIR L"/vpn_checker_tmp"; 79*4882a593Smuzhiyun+#else 80*4882a593Smuzhiyun wchar_t *filename = L"/tmp/vpn_checker_tmp"; 81*4882a593Smuzhiyun+#endif 82*4882a593Smuzhiyun #else // OS_WIN32 83*4882a593Smuzhiyun wchar_t filename[MAX_PATH]; 84*4882a593Smuzhiyun CombinePathW(filename, sizeof(filename), MsGetMyTempDirW(), L"vpn_checker_tmp"); 85*4882a593SmuzhiyunIndex: b/src/Cedar/Logging.c 86*4882a593Smuzhiyun=================================================================== 87*4882a593Smuzhiyun--- a/src/Cedar/Logging.c 88*4882a593Smuzhiyun+++ b/src/Cedar/Logging.c 89*4882a593Smuzhiyun@@ -508,7 +508,7 @@ 90*4882a593Smuzhiyun 91*4882a593Smuzhiyun e = ZeroMalloc(sizeof(ERASER)); 92*4882a593Smuzhiyun 93*4882a593Smuzhiyun- GetExeDir(dir, sizeof(dir)); 94*4882a593Smuzhiyun+ GetStateDir(dir, sizeof(dir)); 95*4882a593Smuzhiyun 96*4882a593Smuzhiyun e->Log = log; 97*4882a593Smuzhiyun e->MinFreeSpace = min_size; 98*4882a593SmuzhiyunIndex: b/src/Cedar/Server.c 99*4882a593Smuzhiyun=================================================================== 100*4882a593Smuzhiyun--- a/src/Cedar/Server.c 101*4882a593Smuzhiyun+++ b/src/Cedar/Server.c 102*4882a593Smuzhiyun@@ -1060,7 +1060,7 @@ 103*4882a593Smuzhiyun hubname = NULL; 104*4882a593Smuzhiyun } 105*4882a593Smuzhiyun 106*4882a593Smuzhiyun- GetExeDir(exe_dir, sizeof(exe_dir)); 107*4882a593Smuzhiyun+ GetStateDir(exe_dir, sizeof(exe_dir)); 108*4882a593Smuzhiyun 109*4882a593Smuzhiyun // Enumerate in the server_log 110*4882a593Smuzhiyun if (hubname == NULL) 111*4882a593Smuzhiyun@@ -1134,7 +1134,7 @@ 112*4882a593Smuzhiyun return; 113*4882a593Smuzhiyun } 114*4882a593Smuzhiyun 115*4882a593Smuzhiyun- GetExeDir(exe_dir, sizeof(exe_dir)); 116*4882a593Smuzhiyun+ GetStateDir(exe_dir, sizeof(exe_dir)); 117*4882a593Smuzhiyun Format(dir_full_path, sizeof(dir_full_path), "%s/%s", exe_dir, dirname); 118*4882a593Smuzhiyun 119*4882a593Smuzhiyun dir = EnumDir(dir_full_path); 120*4882a593SmuzhiyunIndex: b/src/Mayaqua/FileIO.c 121*4882a593Smuzhiyun=================================================================== 122*4882a593Smuzhiyun--- a/src/Mayaqua/FileIO.c 123*4882a593Smuzhiyun+++ b/src/Mayaqua/FileIO.c 124*4882a593Smuzhiyun@@ -122,8 +122,14 @@ 125*4882a593Smuzhiyun #include <errno.h> 126*4882a593Smuzhiyun #include <Mayaqua/Mayaqua.h> 127*4882a593Smuzhiyun 128*4882a593Smuzhiyun+#ifdef STATE_DIR 129*4882a593Smuzhiyun+static char exe_file_name[MAX_SIZE] = STATE_DIR "/a.out"; 130*4882a593Smuzhiyun+static wchar_t exe_file_name_w[MAX_SIZE] = L"" STATE_DIR L"/a.out"; 131*4882a593Smuzhiyun+#else 132*4882a593Smuzhiyun static char exe_file_name[MAX_SIZE] = "/tmp/a.out"; 133*4882a593Smuzhiyun static wchar_t exe_file_name_w[MAX_SIZE] = L"/tmp/a.out"; 134*4882a593Smuzhiyun+#endif 135*4882a593Smuzhiyun+ 136*4882a593Smuzhiyun static LIST *hamcore = NULL; 137*4882a593Smuzhiyun static IO *hamcore_io = NULL; 138*4882a593Smuzhiyun 139*4882a593Smuzhiyun@@ -1038,7 +1044,7 @@ 140*4882a593Smuzhiyun } 141*4882a593Smuzhiyun 142*4882a593Smuzhiyun // If the file exist in hamcore/ directory on the local disk, read it 143*4882a593Smuzhiyun- GetExeDirW(exe_dir, sizeof(exe_dir)); 144*4882a593Smuzhiyun+ GetStateDirW(exe_dir, sizeof(exe_dir)); 145*4882a593Smuzhiyun 146*4882a593Smuzhiyun UniFormat(tmp, sizeof(tmp), L"%s/%S/%S", exe_dir, HAMCORE_DIR_NAME, filename); 147*4882a593Smuzhiyun 148*4882a593Smuzhiyun@@ -1154,7 +1160,7 @@ 149*4882a593Smuzhiyun return; 150*4882a593Smuzhiyun } 151*4882a593Smuzhiyun 152*4882a593Smuzhiyun- GetExeDirW(exe_dir, sizeof(exe_dir)); 153*4882a593Smuzhiyun+ GetStateDirW(exe_dir, sizeof(exe_dir)); 154*4882a593Smuzhiyun UniFormat(tmp, sizeof(tmp), L"%s/%S", exe_dir, HAMCORE_FILE_NAME); 155*4882a593Smuzhiyun 156*4882a593Smuzhiyun UniFormat(tmp2, sizeof(tmp2), L"%s/%S", exe_dir, HAMCORE_FILE_NAME_2); 157*4882a593Smuzhiyun@@ -1438,6 +1444,33 @@ 158*4882a593Smuzhiyun GetDirNameFromFilePathW(name, size, exe_file_name_w); 159*4882a593Smuzhiyun } 160*4882a593Smuzhiyun 161*4882a593Smuzhiyun+void GetStateDir(char *name, UINT size) 162*4882a593Smuzhiyun+{ 163*4882a593Smuzhiyun+ // Validate arguments 164*4882a593Smuzhiyun+ if (name == NULL) 165*4882a593Smuzhiyun+ { 166*4882a593Smuzhiyun+ return; 167*4882a593Smuzhiyun+ } 168*4882a593Smuzhiyun+#ifdef STATE_DIR 169*4882a593Smuzhiyun+ StrCpy(name, size, STATE_DIR); 170*4882a593Smuzhiyun+#else 171*4882a593Smuzhiyun+ GetExeDir(name, size) 172*4882a593Smuzhiyun+#endif 173*4882a593Smuzhiyun+} 174*4882a593Smuzhiyun+void GetStateDirW(wchar_t *name, UINT size) 175*4882a593Smuzhiyun+{ 176*4882a593Smuzhiyun+ // Validate arguments 177*4882a593Smuzhiyun+ if (name == NULL) 178*4882a593Smuzhiyun+ { 179*4882a593Smuzhiyun+ return; 180*4882a593Smuzhiyun+ } 181*4882a593Smuzhiyun+#ifdef STATE_DIR 182*4882a593Smuzhiyun+ UniStrCpy(name, size, L"" STATE_DIR L""); 183*4882a593Smuzhiyun+#else 184*4882a593Smuzhiyun+ GetExeDirW(name, size) 185*4882a593Smuzhiyun+#endif 186*4882a593Smuzhiyun+} 187*4882a593Smuzhiyun+ 188*4882a593Smuzhiyun // Get the EXE file name 189*4882a593Smuzhiyun void GetExeName(char *name, UINT size) 190*4882a593Smuzhiyun { 191*4882a593Smuzhiyun@@ -2389,7 +2422,7 @@ 192*4882a593Smuzhiyun else 193*4882a593Smuzhiyun { 194*4882a593Smuzhiyun wchar_t dir[MAX_SIZE]; 195*4882a593Smuzhiyun- GetExeDirW(dir, sizeof(dir)); 196*4882a593Smuzhiyun+ GetStateDirW(dir, sizeof(dir)); 197*4882a593Smuzhiyun ConbinePathW(dst, size, dir, &src[1]); 198*4882a593Smuzhiyun } 199*4882a593Smuzhiyun } 200*4882a593SmuzhiyunIndex: b/src/Mayaqua/FileIO.h 201*4882a593Smuzhiyun=================================================================== 202*4882a593Smuzhiyun--- a/src/Mayaqua/FileIO.h 203*4882a593Smuzhiyun+++ b/src/Mayaqua/FileIO.h 204*4882a593Smuzhiyun@@ -349,6 +349,8 @@ 205*4882a593Smuzhiyun void GetExeNameW(wchar_t *name, UINT size); 206*4882a593Smuzhiyun void GetExeDir(char *name, UINT size); 207*4882a593Smuzhiyun void GetExeDirW(wchar_t *name, UINT size); 208*4882a593Smuzhiyun+void GetStateDir(char *name, UINT size); 209*4882a593Smuzhiyun+void GetStateDirW(wchar_t *name, UINT size); 210*4882a593Smuzhiyun void BuildHamcore(char *dst_filename, char *src_dir, bool unix_only); 211*4882a593Smuzhiyun int CompareHamcore(void *p1, void *p2); 212*4882a593Smuzhiyun void InitHamcore(); 213*4882a593SmuzhiyunIndex: b/src/Mayaqua/Mayaqua.c 214*4882a593Smuzhiyun=================================================================== 215*4882a593Smuzhiyun--- a/src/Mayaqua/Mayaqua.c 216*4882a593Smuzhiyun+++ b/src/Mayaqua/Mayaqua.c 217*4882a593Smuzhiyun@@ -611,7 +611,11 @@ 218*4882a593Smuzhiyun _exit(0); 219*4882a593Smuzhiyun } 220*4882a593Smuzhiyun 221*4882a593Smuzhiyun+#ifndef STATE_DIR 222*4882a593Smuzhiyun+ // This check causes hamcorebuilder to fail in an unprivileged 223*4882a593Smuzhiyun+ // environment, and is unnecessary for a managed installation. 224*4882a593Smuzhiyun CheckUnixTempDir(); 225*4882a593Smuzhiyun+#endif 226*4882a593Smuzhiyun 227*4882a593Smuzhiyun // Initialization of Probe 228*4882a593Smuzhiyun InitProbe(); 229*4882a593SmuzhiyunIndex: b/src/Mayaqua/Table.c 230*4882a593Smuzhiyun=================================================================== 231*4882a593Smuzhiyun--- a/src/Mayaqua/Table.c 232*4882a593Smuzhiyun+++ b/src/Mayaqua/Table.c 233*4882a593Smuzhiyun@@ -1191,7 +1191,7 @@ 234*4882a593Smuzhiyun return; 235*4882a593Smuzhiyun } 236*4882a593Smuzhiyun 237*4882a593Smuzhiyun- GetExeDirW(exe, sizeof(exe)); 238*4882a593Smuzhiyun+ GetStateDirW(exe, sizeof(exe)); 239*4882a593Smuzhiyun UniStrCpy(hashtemp, sizeof(hashtemp), strfilename); 240*4882a593Smuzhiyun BinToStrW(tmp, sizeof(tmp), filehash, MD5_SIZE); 241*4882a593Smuzhiyun UniStrCat(hashtemp, sizeof(hashtemp), tmp); 242*4882a593Smuzhiyun@@ -1204,7 +1204,11 @@ 243*4882a593Smuzhiyun UniStrLower(tmp); 244*4882a593Smuzhiyun 245*4882a593Smuzhiyun #ifndef OS_WIN32 246*4882a593Smuzhiyun+#ifdef STATE_DIR 247*4882a593Smuzhiyun+ UniStrCpy(exe, sizeof(exe), L"" STATE_DIR L""); 248*4882a593Smuzhiyun+#else 249*4882a593Smuzhiyun UniStrCpy(exe, sizeof(exe), L"/tmp"); 250*4882a593Smuzhiyun+#endif 251*4882a593Smuzhiyun #else // OS_WIN32 252*4882a593Smuzhiyun StrToUni(exe, sizeof(exe), MsGetTempDir()); 253*4882a593Smuzhiyun #endif // OS_WIN32 254*4882a593SmuzhiyunIndex: b/src/Mayaqua/Unix.c 255*4882a593Smuzhiyun=================================================================== 256*4882a593Smuzhiyun--- a/src/Mayaqua/Unix.c 257*4882a593Smuzhiyun+++ b/src/Mayaqua/Unix.c 258*4882a593Smuzhiyun@@ -928,7 +928,7 @@ 259*4882a593Smuzhiyun StrCpy(tmp, sizeof(tmp), instance_name); 260*4882a593Smuzhiyun } 261*4882a593Smuzhiyun 262*4882a593Smuzhiyun- GetExeDir(dir, sizeof(dir)); 263*4882a593Smuzhiyun+ GetStateDir(dir, sizeof(dir)); 264*4882a593Smuzhiyun 265*4882a593Smuzhiyun // File name generation 266*4882a593Smuzhiyun Format(name, sizeof(name), "%s/.%s", dir, tmp); 267*4882a593Smuzhiyun@@ -2260,7 +2260,7 @@ 268*4882a593Smuzhiyun return; 269*4882a593Smuzhiyun } 270*4882a593Smuzhiyun 271*4882a593Smuzhiyun- GetExeDir(dir, sizeof(dir)); 272*4882a593Smuzhiyun+ GetStateDir(dir, sizeof(dir)); 273*4882a593Smuzhiyun 274*4882a593Smuzhiyun GetExeName(exe_name, sizeof(exe_name)); 275*4882a593Smuzhiyun StrCat(exe_name, sizeof(exe_name), ":pid_hash"); 276*4882a593Smuzhiyun@@ -2305,7 +2305,7 @@ 277*4882a593Smuzhiyun return; 278*4882a593Smuzhiyun } 279*4882a593Smuzhiyun 280*4882a593Smuzhiyun- GetExeDir(dir, sizeof(dir)); 281*4882a593Smuzhiyun+ GetStateDir(dir, sizeof(dir)); 282*4882a593Smuzhiyun 283*4882a593Smuzhiyun GetExeName(exe_name, sizeof(exe_name)); 284*4882a593Smuzhiyun StrCat(exe_name, sizeof(exe_name), ":pid_hash"); 285*4882a593SmuzhiyunIndex: b/src/bin/hamcore/Makefile.am 286*4882a593Smuzhiyun=================================================================== 287*4882a593Smuzhiyun--- a/src/bin/hamcore/Makefile.am 288*4882a593Smuzhiyun+++ b/src/bin/hamcore/Makefile.am 289*4882a593Smuzhiyun@@ -18,12 +18,16 @@ 290*4882a593Smuzhiyun 291*4882a593Smuzhiyun include $(top_srcdir)/autotools/softether.am 292*4882a593Smuzhiyun 293*4882a593Smuzhiyun-# This is required to use a custom build rule with -Wall and -Werror enabled. 294*4882a593Smuzhiyun+# An empty EXEEXT required for overrides with -Wall and -Werror enabled. 295*4882a593Smuzhiyun AUTOMAKE_OPTIONS = -Wno-override 296*4882a593Smuzhiyun EXEEXT = 297*4882a593Smuzhiyun+ 298*4882a593Smuzhiyun HAMCOREBUILDER = $(top_builddir)/src/hamcorebuilder/hamcorebuilder 299*4882a593Smuzhiyun 300*4882a593Smuzhiyun-sbin_PROGRAMS = hamcore.se2 301*4882a593Smuzhiyun+noinst_PROGRAMS = hamcore.se2 302*4882a593Smuzhiyun 303*4882a593Smuzhiyun hamcore.se2$(EXEEXT): $(HAMCOREBUILDER) 304*4882a593Smuzhiyun $(HAMCOREBUILDER) $(top_srcdir)/src/bin/hamcore $@ 305*4882a593Smuzhiyun+ 306*4882a593Smuzhiyun+install-exec-local: hamcore.se2$(EXEEXT) 307*4882a593Smuzhiyun+ $(INSTALL_DATA) -D hamcore.se2$(EXEEXT) $(DESTDIR)$(localstatedir)/lib/softether/hamcore.se2 308