diff --git a/external/libs b/external/libs index c18dba4..97aaf42 160000 --- a/external/libs +++ b/external/libs @@ -1 +1 @@ -Subproject commit c18dba4e0772812732fac380fffcbb9598d410e9 +Subproject commit 97aaf422283ee123e5554863c304541cf82127fd diff --git a/readme.md b/readme.md index cef1d96..8fe60f2 100644 --- a/readme.md +++ b/readme.md @@ -1,3 +1,4 @@ +[![CI](https://github.com/BrandonMFong/http/actions/workflows/test.yml/badge.svg)](https://github.com/BrandonMFong/http/actions/workflows/test.yml) # http An http server using POSIX sockets ![Demo](./docs/demo.gif) diff --git a/src/main.cpp b/src/main.cpp index 3d65080..d5e4b5f 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -10,12 +10,15 @@ #include #include #include +#include +#include extern "C" { #include } #define ARGUMENT_ROOT "-root" +#define ARGUMENT_PORT "-port" using namespace BF::Net; using namespace BF; @@ -23,6 +26,9 @@ using namespace std; LOG_INIT; +Atomic _running; +uint16_t _port = 8080; + void help(const char * toolname) { printf("usage: %s %s \n", toolname, ARGUMENT_ROOT); printf("\n"); @@ -43,15 +49,23 @@ int __ReadArguments(int argc, char * argv[]) { for (int i = 0; i < argc; i++) { if (!strcmp(argv[i], ARGUMENT_ROOT)) { - if (!Resource::setRootFolder(argv[++i])) { + if (++i < argc && !Resource::setRootFolder(argv[i])) { LOG_ERROR("'%s' is not accepted as a root folder", argv[i]); } + } else if (!strcmp(argv[i], ARGUMENT_PORT)) { + if (++i < argc) { + _port = atoi(argv[i]); + } } } return 0; } +void __HandleSignal(int signum) { + _running = false; +} + int main(int argc, char * argv[]) { LOG_OPEN; @@ -63,22 +77,25 @@ int main(int argc, char * argv[]) { Log::SetCallback(__LogCallbackBFNet); Office::start(); - Socket * skt = Socket::create(SOCKET_MODE_SERVER, "0.0.0.0", 8080, &error); + + const char * ipaddr = "0.0.0.0"; + LOG_WRITE("creating socket at %s:%u", ipaddr, _port); + Socket * skt = Socket::create(SOCKET_MODE_SERVER, ipaddr, _port, &error); if (!error) { skt->setInStreamCallback(Office::envelopeReceive); skt->setNewConnectionCallback(__NewConnection); skt->setBufferSize(1024 * 1024 * 100); error = skt->start(); } - - if (!error) { - cout << "Press any key to stop..."; - cin.get(); - error = skt->stop(); - cout << "Stopped..." << endl; - } + signal(SIGINT, __HandleSignal); // For Ctrl+C + signal(SIGTERM, __HandleSignal); // For 'kill' command + signal(SIGHUP, __HandleSignal); // For terminal hangup + _running = error == 0; + while (!error && _running.get()) { } + + skt->stop(); BFRelease(skt); Office::stop();