diff --git a/.gitignore b/.gitignore index 13ab5924..a2132207 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,7 @@ *.d *.o /strfry +/strfry.exe /strfry-db/*.mdb .vscode/* /strfry-db-test* diff --git a/Makefile b/Makefile index 6b735fb8..15f83003 100644 --- a/Makefile +++ b/Makefile @@ -25,14 +25,20 @@ export XLDFLAGS += $(BREW_LIBS) endif INCS += -Iexternal/negentropy/cpp -build/StrfryTemplates.h: $(shell find src/tmpls/ -type f -name '*.tmpl') - PERL5LIB=golpe/vendor/ perl golpe/external/templar/templar.pl src/tmpls/ strfrytmpl $@ +build/StrfryTemplates.h: $(wildcard src/tmpls/*.tmpl) + perl -Igolpe/vendor golpe/external/templar/templar.pl src/tmpls/ strfrytmpl $@ src/apps/relay/RelayWebsocket.o: build/StrfryTemplates.h +ifeq ($(OS),Windows_NT) + TEST_BIN = build/subid_tests.exe +else + TEST_BIN = build/subid_tests +endif + .PHONY: test-subid -test-subid: build/subid_tests - build/subid_tests +test-subid: $(TEST_BIN) + $(TEST_BIN) -build/subid_tests: test/tests/SubIdTests.cpp build/golpe.h +$(TEST_BIN): test/tests/SubIdTests.cpp build/golpe.h $(CXX) $(CXXFLAGS) $(INCS) $< -o $@ diff --git a/golpe b/golpe index cf3e0cb7..5c028634 160000 --- a/golpe +++ b/golpe @@ -1 +1 @@ -Subproject commit cf3e0cb701c72bdf8a02419d16ebd61ddc9d1328 +Subproject commit 5c028634aa6087db7fcaf7e52169087c179a330a diff --git a/src/PluginEventSifter.h b/src/PluginEventSifter.h index 7ad5f4d1..16b3e05e 100644 --- a/src/PluginEventSifter.h +++ b/src/PluginEventSifter.h @@ -2,6 +2,7 @@ #include #include +#ifndef _WIN32 #include #include #include @@ -9,25 +10,32 @@ #include #include #include +#endif #include +#ifndef _WIN32 #if defined(__APPLE__) || defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__NetBSD__) || defined(__DragonFly__) #define st_mtim st_mtimespec #endif +#endif +#ifndef _WIN32 #include "hoytech/stream.h" +#endif #include "golpe.h" #include "events.h" +#ifndef _WIN32 #if defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__NetBSD__) || defined(__DragonFly__) extern char **environ; #elif defined(__APPLE__) #include #define environ (*_NSGetEnviron()) #endif +#endif @@ -38,6 +46,26 @@ enum class PluginEventSifterResult { }; +#ifdef _WIN32 + +struct PluginEventSifter { + PluginEventSifterResult acceptEvent(const std::string &pluginCmd, const tao::json::value &evJson, EventSourceType sourceType, std::string_view sourceInfo, const Bytes32 &authed, std::string &okMsg) { + if (pluginCmd.size() == 0) { + return PluginEventSifterResult::Accept; + } + + static bool warned = false; + if (!warned) { + LW << "Write policy plugins are not supported on Windows. All events are accepted by default."; + warned = true; + } + + return PluginEventSifterResult::Accept; + } +}; + +#else + struct PluginEventSifter { struct RunningPlugin { pid_t pid; @@ -198,3 +226,5 @@ struct PluginEventSifter { running = make_unique(pid, inPipe.extractFd(0), outPipe.extractFd(1), pluginCmd); } }; + +#endif diff --git a/src/apps/dbutils/cmd_import.cpp b/src/apps/dbutils/cmd_import.cpp index 2019fd53..1528dc83 100644 --- a/src/apps/dbutils/cmd_import.cpp +++ b/src/apps/dbutils/cmd_import.cpp @@ -5,10 +5,12 @@ #include #include "golpe.h" +#include "win32.h" #include "WriterPipeline.h" + static const char USAGE[] = R"( Usage: diff --git a/src/apps/mesh/cmd_upload.cpp b/src/apps/mesh/cmd_upload.cpp index a7f8ea83..a3ce24c4 100644 --- a/src/apps/mesh/cmd_upload.cpp +++ b/src/apps/mesh/cmd_upload.cpp @@ -4,6 +4,8 @@ #include #include "golpe.h" +#include "win32.h" + #include "WSConnection.h" diff --git a/src/apps/relay/RelaySignalHandler.cpp b/src/apps/relay/RelaySignalHandler.cpp index 26355142..30bdffad 100644 --- a/src/apps/relay/RelaySignalHandler.cpp +++ b/src/apps/relay/RelaySignalHandler.cpp @@ -1,4 +1,6 @@ +#ifndef _WIN32 #include +#endif #include "RelayServer.h" @@ -6,6 +8,7 @@ void RelayServer::runSignalHandler() { setThreadName("signalHandler"); +#ifndef _WIN32 sigset_t sigset; sigemptyset(&sigset); sigaddset(&sigset, SIGUSR1); @@ -22,4 +25,9 @@ void RelayServer::runSignalHandler() { LW << "Got unexpected signal: " << sig; } } +#else + while (1) { + std::this_thread::sleep_for(std::chrono::seconds(1000)); + } +#endif } diff --git a/src/apps/relay/cmd_relay.cpp b/src/apps/relay/cmd_relay.cpp index c17f146f..ea7ad421 100644 --- a/src/apps/relay/cmd_relay.cpp +++ b/src/apps/relay/cmd_relay.cpp @@ -1,5 +1,7 @@ +#ifndef _WIN32 #include #include +#endif #include @@ -40,6 +42,7 @@ void cmd_relay(const std::vector &subArgs) { } void RelayServer::run() { +#ifndef _WIN32 { sigset_t set; sigemptyset(&set); @@ -47,6 +50,7 @@ void RelayServer::run() { int s = pthread_sigmask(SIG_BLOCK, &set, NULL); if (s != 0) throw herr("Unable to set sigmask: ", strerror(errno)); } +#endif tpWebsocket.init("Websocket", 1, [this](auto &thr){ runWebsocket(thr); diff --git a/src/misc.cpp b/src/misc.cpp index 439061e4..6d99b56d 100644 --- a/src/misc.cpp +++ b/src/misc.cpp @@ -1,10 +1,5 @@ -#include -#ifdef __FreeBSD__ -#include -#include -#endif +#include "win32.h" #include -#include #include #include @@ -121,10 +116,12 @@ uint64_t getDBVersion(lmdb::txn &txn) { void exitOnSigPipe() { +#ifndef _WIN32 struct sigaction act; memset(&act, 0, sizeof act); act.sa_sigaction = [](int, siginfo_t*, void*){ ::exit(1); }; if (sigaction(SIGPIPE, &act, nullptr)) throw herr("couldn't run sigaction(): ", strerror(errno)); +#endif } diff --git a/src/onAppStartup.cpp b/src/onAppStartup.cpp index 6bff793f..568db770 100644 --- a/src/onAppStartup.cpp +++ b/src/onAppStartup.cpp @@ -1,8 +1,10 @@ +#include "win32.h" +#ifndef _WIN32 #include #include +#endif #include #include -#include #include @@ -16,6 +18,8 @@ void onPreStartup(int argc, char **argv) { + win32_init_sockets(); +#ifndef _WIN32 if (getuid() == 0) { if (isatty(fileno(stderr))) { std::cerr << "\x1b[1;35mWARNING: Running as root is not recommended\x1b[0m" << std::endl; @@ -23,6 +27,7 @@ void onPreStartup(int argc, char **argv) { std::cerr << "WARNING: Running as root is not recommended" << std::endl; } } +#endif if (argc > 1) return; @@ -78,6 +83,7 @@ static void dbCheck(lmdb::txn &txn, const std::string &cmd) { } static void setRLimits() { +#ifndef _WIN32 if (!cfg().relay__nofiles) return; struct rlimit curr; @@ -101,6 +107,7 @@ static void setRLimits() { #endif if (setrlimit(RLIMIT_NOFILE, &curr)) throw herr("Failed setting NOFILES limit to ", cfg().relay__nofiles, ": ", strerror(errno)); +#endif } diff --git a/src/win32.h b/src/win32.h new file mode 100644 index 00000000..e95b7850 --- /dev/null +++ b/src/win32.h @@ -0,0 +1,75 @@ +#pragma once + +#include +#include +#include + +#ifdef _WIN32 + +#include +#include +#include + +#define isatty _isatty +#define fileno _fileno +#define unlink _unlink +#define chmod _chmod + +inline ssize_t getline(char **lineptr, size_t *n, FILE *stream) { + if (lineptr == NULL || n == NULL || stream == NULL) { + errno = EINVAL; + return -1; + } + if (*lineptr == NULL || *n == 0) { + *n = 128; + *lineptr = (char *)malloc(*n); + if (*lineptr == NULL) { + errno = ENOMEM; + return -1; + } + } + size_t count = 0; + int c; + while ((c = fgetc(stream)) != EOF) { + if (count + 1 >= *n) { + size_t new_len = *n * 2; + char *new_ptr = (char *)realloc(*lineptr, new_len); + if (new_ptr == NULL) { + errno = ENOMEM; + return -1; + } + *lineptr = new_ptr; + *n = new_len; + } + (*lineptr)[count++] = (char)c; + if (c == '\n') { + break; + } + } + if (count == 0 && c == EOF) { + return -1; + } + (*lineptr)[count] = '\0'; + return (ssize_t)count; +} + +inline void win32_init_sockets() { + WSADATA wsaData; + int res = WSAStartup(MAKEWORD(2, 2), &wsaData); + if (res != 0) { + fprintf(stderr, "WSAStartup failed: %d\n", res); + exit(1); + } +} + +#else + +#include +#include +#include +#include +#include + +inline void win32_init_sockets() {} + +#endif diff --git a/strfry.conf b/strfry.conf index 81da7afa..446aabf2 100644 --- a/strfry.conf +++ b/strfry.conf @@ -10,7 +10,7 @@ dbParams { maxreaders = 256 # Size of mmap() to use when loading LMDB (default is 10TB, does *not* correspond to disk-space used) (restart required) - mapsize = 10995116277760 + mapsize = 10737418240 # Disables read-ahead when accessing the LMDB mapping. Reduces IO activity when DB size is larger than RAM. (restart required) noReadAhead = false