diff --git a/autotools/softether.am b/autotools/softether.am index e5e91eeb..67c821db 100644 --- a/autotools/softether.am +++ b/autotools/softether.am @@ -27,6 +27,7 @@ AM_CFLAGS = \ -I$(top_srcdir)/src \ -I$(top_srcdir)/src/Mayaqua \ -I$(top_srcdir)/src/Cedar \ + -DSTATE_DIR='"@localstatedir@/lib/softether"' \ -DUNIX \ -DUNIX_LINUX \ -D_REENTRANT \ diff --git a/src/Cedar/Admin.c b/src/Cedar/Admin.c index 29bdf52b..d34d8e91 100644 --- a/src/Cedar/Admin.c +++ b/src/Cedar/Admin.c @@ -10338,7 +10338,7 @@ void SiReadLocalLogFile(SERVER *s, char *filepath, UINT offset, RPC_READ_LOG_FIL Zero(t, sizeof(RPC_READ_LOG_FILE)); - GetExeDir(exe_dir, sizeof(exe_dir)); + GetStateDir(exe_dir, sizeof(exe_dir)); Format(full_path, sizeof(full_path), "%s/%s", exe_dir, filepath); // Read file diff --git a/src/Cedar/Command.c b/src/Cedar/Command.c index 4f4d7145..7dd73d02 100644 --- a/src/Cedar/Command.c +++ b/src/Cedar/Command.c @@ -527,7 +527,7 @@ bool CheckFileSystem() UINT i; GetExeName(exe, sizeof(exe)); - GetExeDir(exe_dir, sizeof(exe_dir)); + GetStateDir(exe_dir, sizeof(exe_dir)); ok = false; dirs = EnumDir(exe_dir); @@ -552,7 +552,11 @@ bool CheckFileSystem() UCHAR *buf; IO *io; #ifndef OS_WIN32 +#ifdef STATE_DIR + wchar_t *filename = L"" STATE_DIR L"/vpn_checker_tmp"; +#else wchar_t *filename = L"/tmp/vpn_checker_tmp"; +#endif #else // OS_WIN32 wchar_t filename[MAX_PATH]; CombinePathW(filename, sizeof(filename), MsGetMyTempDirW(), L"vpn_checker_tmp"); diff --git a/src/Cedar/Logging.c b/src/Cedar/Logging.c index 21ae4142..6708b4ec 100644 --- a/src/Cedar/Logging.c +++ b/src/Cedar/Logging.c @@ -538,7 +538,7 @@ ERASER *NewEraser(LOG *log, UINT64 min_size) e = ZeroMalloc(sizeof(ERASER)); - GetExeDir(dir, sizeof(dir)); + GetStateDir(dir, sizeof(dir)); e->Log = log; e->MinFreeSpace = min_size; diff --git a/src/Cedar/Server.c b/src/Cedar/Server.c index 0023b7ad..2d54fb93 100644 --- a/src/Cedar/Server.c +++ b/src/Cedar/Server.c @@ -1087,7 +1087,7 @@ LIST *EnumLogFile(char *hubname) hubname = NULL; } - GetExeDir(exe_dir, sizeof(exe_dir)); + GetStateDir(exe_dir, sizeof(exe_dir)); // Enumerate in the server_log if (hubname == NULL) @@ -1161,7 +1161,7 @@ void EnumLogFileDir(LIST *o, char *dirname) return; } - GetExeDir(exe_dir, sizeof(exe_dir)); + GetStateDir(exe_dir, sizeof(exe_dir)); Format(dir_full_path, sizeof(dir_full_path), "%s/%s", exe_dir, dirname); dir = EnumDir(dir_full_path); diff --git a/src/Mayaqua/Encrypt.c b/src/Mayaqua/Encrypt.c index fe6f1449..7135fa2f 100644 --- a/src/Mayaqua/Encrypt.c +++ b/src/Mayaqua/Encrypt.c @@ -579,7 +579,7 @@ bool IsXRevoked(X *x) return false; } - GetExeDir(dirname, sizeof(dirname)); + GetStateDir(dirname, sizeof(dirname)); // Search the CRL file t = EnumDir(dirname); diff --git a/src/Mayaqua/FileIO.c b/src/Mayaqua/FileIO.c index 6563ce25..52820c18 100644 --- a/src/Mayaqua/FileIO.c +++ b/src/Mayaqua/FileIO.c @@ -122,8 +122,14 @@ #include #include +#ifdef STATE_DIR +static char exe_file_name[MAX_SIZE] = STATE_DIR "/a.out"; +static wchar_t exe_file_name_w[MAX_SIZE] = L"" STATE_DIR L"/a.out"; +#else static char exe_file_name[MAX_SIZE] = "/tmp/a.out"; static wchar_t exe_file_name_w[MAX_SIZE] = L"/tmp/a.out"; +#endif + static LIST *hamcore = NULL; static IO *hamcore_io = NULL; @@ -1038,7 +1044,7 @@ BUF *ReadHamcore(char *name) } // If the file exist in hamcore/ directory on the local disk, read it - GetExeDirW(exe_dir, sizeof(exe_dir)); + GetStateDirW(exe_dir, sizeof(exe_dir)); UniFormat(tmp, sizeof(tmp), L"%s/%S/%S", exe_dir, HAMCORE_DIR_NAME, filename); @@ -1154,7 +1160,7 @@ void InitHamcore() return; } - GetExeDirW(exe_dir, sizeof(exe_dir)); + GetStateDirW(exe_dir, sizeof(exe_dir)); UniFormat(tmp, sizeof(tmp), L"%s/%S", exe_dir, HAMCORE_FILE_NAME); UniFormat(tmp2, sizeof(tmp2), L"%s/%S", exe_dir, HAMCORE_FILE_NAME_2); @@ -1438,6 +1444,33 @@ void GetExeDirW(wchar_t *name, UINT size) GetDirNameFromFilePathW(name, size, exe_file_name_w); } +void GetStateDir(char *name, UINT size) +{ + // Validate arguments + if (name == NULL) + { + return; + } +#ifdef STATE_DIR + StrCpy(name, size, STATE_DIR); +#else + GetExeDir(name, size) +#endif +} +void GetStateDirW(wchar_t *name, UINT size) +{ + // Validate arguments + if (name == NULL) + { + return; + } +#ifdef STATE_DIR + UniStrCpy(name, size, L"" STATE_DIR L""); +#else + GetExeDirW(name, size) +#endif +} + // Get the EXE file name void GetExeName(char *name, UINT size) { @@ -2389,7 +2422,7 @@ void InnerFilePathW(wchar_t *dst, UINT size, wchar_t *src) else { wchar_t dir[MAX_SIZE]; - GetExeDirW(dir, sizeof(dir)); + GetStateDirW(dir, sizeof(dir)); ConbinePathW(dst, size, dir, &src[1]); } } diff --git a/src/Mayaqua/FileIO.h b/src/Mayaqua/FileIO.h index e7f72209..275819ad 100644 --- a/src/Mayaqua/FileIO.h +++ b/src/Mayaqua/FileIO.h @@ -349,6 +349,8 @@ void GetExeName(char *name, UINT size); void GetExeNameW(wchar_t *name, UINT size); void GetExeDir(char *name, UINT size); void GetExeDirW(wchar_t *name, UINT size); +void GetStateDir(char *name, UINT size); +void GetStateDirW(wchar_t *name, UINT size); void BuildHamcore(char *dst_filename, char *src_dir, bool unix_only); int CompareHamcore(void *p1, void *p2); void InitHamcore(); diff --git a/src/Mayaqua/Mayaqua.c b/src/Mayaqua/Mayaqua.c index 4d0e40f1..26df5aeb 100644 --- a/src/Mayaqua/Mayaqua.c +++ b/src/Mayaqua/Mayaqua.c @@ -611,7 +611,11 @@ void InitMayaqua(bool memcheck, bool debug, int argc, char **argv) _exit(0); } +#ifndef STATE_DIR + // This check causes hamcorebuilder to fail in an unprivileged + // environment, and is unnecessary for a managed installation. CheckUnixTempDir(); +#endif // Initialization of Probe InitProbe(); diff --git a/src/Mayaqua/Table.c b/src/Mayaqua/Table.c index 6115a8c5..77f1de2d 100644 --- a/src/Mayaqua/Table.c +++ b/src/Mayaqua/Table.c @@ -1191,7 +1191,7 @@ void GenerateUnicodeCacheFileName(wchar_t *name, UINT size, wchar_t *strfilename return; } - GetExeDirW(exe, sizeof(exe)); + GetStateDirW(exe, sizeof(exe)); UniStrCpy(hashtemp, sizeof(hashtemp), strfilename); BinToStrW(tmp, sizeof(tmp), filehash, MD5_SIZE); UniStrCat(hashtemp, sizeof(hashtemp), tmp); @@ -1204,7 +1204,11 @@ void GenerateUnicodeCacheFileName(wchar_t *name, UINT size, wchar_t *strfilename UniStrLower(tmp); #ifndef OS_WIN32 +#ifdef STATE_DIR + UniStrCpy(exe, sizeof(exe), L"" STATE_DIR L""); +#else UniStrCpy(exe, sizeof(exe), L"/tmp"); +#endif #else // OS_WIN32 StrToUni(exe, sizeof(exe), MsGetTempDir()); #endif // OS_WIN32 diff --git a/src/Mayaqua/Unix.c b/src/Mayaqua/Unix.c index 0d077c44..f6c62ad0 100644 --- a/src/Mayaqua/Unix.c +++ b/src/Mayaqua/Unix.c @@ -928,7 +928,7 @@ void *UnixNewSingleInstance(char *instance_name) StrCpy(tmp, sizeof(tmp), instance_name); } - GetExeDir(dir, sizeof(dir)); + GetStateDir(dir, sizeof(dir)); // File name generation Format(name, sizeof(name), "%s/.%s", dir, tmp); @@ -2311,7 +2311,7 @@ void UnixGenPidFileName(char *name, UINT size) return; } - GetExeDir(dir, sizeof(dir)); + GetStateDir(dir, sizeof(dir)); GetExeName(exe_name, sizeof(exe_name)); StrCat(exe_name, sizeof(exe_name), ":pid_hash"); @@ -2356,7 +2356,7 @@ void UnixGenCtlFileName(char *name, UINT size) return; } - GetExeDir(dir, sizeof(dir)); + GetStateDir(dir, sizeof(dir)); GetExeName(exe_name, sizeof(exe_name)); StrCat(exe_name, sizeof(exe_name), ":pid_hash"); diff --git a/src/bin/hamcore/Makefile.am b/src/bin/hamcore/Makefile.am index 37b0291e..c651cb21 100644 --- a/src/bin/hamcore/Makefile.am +++ b/src/bin/hamcore/Makefile.am @@ -18,12 +18,16 @@ include $(top_srcdir)/autotools/softether.am -# This is required to use a custom build rule with -Wall and -Werror enabled. +# An empty EXEEXT required for overrides with -Wall and -Werror enabled. AUTOMAKE_OPTIONS = -Wno-override EXEEXT = + HAMCOREBUILDER = $(top_builddir)/src/hamcorebuilder/hamcorebuilder -sbin_PROGRAMS = hamcore.se2 +noinst_PROGRAMS = hamcore.se2 hamcore.se2$(EXEEXT): $(HAMCOREBUILDER) $(HAMCOREBUILDER) $(top_srcdir)/src/bin/hamcore $@ + +install-exec-local: hamcore.se2$(EXEEXT) + $(INSTALL_DATA) -D hamcore.se2$(EXEEXT) $(DESTDIR)$(localstatedir)/lib/softether/hamcore.se2