From 818fd9fc927f1d74a87166dc8c4a6479e33a4efb Mon Sep 17 00:00:00 2001 From: Nishi Date: Sat, 7 Sep 2024 09:14:35 +0000 Subject: [PATCH] send packet git-svn-id: file:///raid/svn-personal/mokou/trunk@7 35d6bad2-6c5c-c749-ada2-a2c82cb3bd79 --- Mokou/main.c | 25 +++++++++++++++++++++++ Mokou/mk_server.h | 2 ++ Mokou/server.c | 51 +++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 78 insertions(+) diff --git a/Mokou/main.c b/Mokou/main.c index 432a5a6..ff6aafd 100644 --- a/Mokou/main.c +++ b/Mokou/main.c @@ -7,6 +7,7 @@ #include #include "mk_service.h" +#include "mk_server.h" #include "mk_log.h" #include "mk_util.h" #include "mk_version.h" @@ -15,10 +16,13 @@ extern bool mk_syslog; int main(int argc, char** argv){ int i; + bool daemon = true; for(i = 1; i < argc; i++){ if(argv[i][0] == '-'){ if(strcmp(argv[i], "--stderr") == 0 || strcmp(argv[i], "-S") == 0){ mk_syslog = false; + }else if(strcmp(argv[i], "-D") == 0){ + daemon = false; }else{ fprintf(stderr, "%s: %s: unknown flag\n", argv[0], argv[i]); return 1; @@ -35,4 +39,25 @@ int main(int argc, char** argv){ mk_service_scan(); mk_start_services(); mk_log("Mokou is up, creating the server socket"); + if(mk_server_init() != 0){ + mk_log("Could not initialize the server"); + return 1; + } + unsigned long long pid = 0; + if(daemon){ + mk_log("Spawning daemon"); + pid = fork(); + } + if(pid == 0){ + if(daemon){ + mk_log("Hello from daemon"); + } + mk_log("Entering server loop"); + mk_server_loop(); + return 0; + }else if(daemon){ + FILE* f = fopen("/var/run/mokou.pid", "w"); + fprintf(f, "%llu", pid); + fclose(f); + } } diff --git a/Mokou/mk_server.h b/Mokou/mk_server.h index 1a58dfa..a01b5ba 100644 --- a/Mokou/mk_server.h +++ b/Mokou/mk_server.h @@ -3,5 +3,7 @@ #ifndef __MK_SERVER_H__ #define __MK_SERVER_H__ +int mk_server_init(void); +void mk_server_loop(void); #endif diff --git a/Mokou/server.c b/Mokou/server.c index c1918f6..eac544d 100644 --- a/Mokou/server.c +++ b/Mokou/server.c @@ -1,3 +1,54 @@ /* $Id$ */ #include "mk_server.h" + +#include "mk_version.h" +#include "mk_util.h" +#include "mk_log.h" + +#include +#include +#include + +#include +#include +#include + +struct sockaddr_un sun; +int server; + +int mk_server_init(void){ + remove("/tmp/mokou.sock"); + memset(&sun, 0, sizeof(sun)); + server = socket(AF_LOCAL, SOCK_STREAM, 0); + if(server == -1){ + mk_log("Socket creation failure"); + return 1; + } + sun.sun_family = AF_LOCAL; + strcpy(sun.sun_path, "/tmp/mokou.sock"); + if(bind(server, (struct sockaddr*)&sun, sizeof(sun)) == -1){ + mk_log("Bind failure"); + close(server); + return 1; + } + if(listen(server, 16) == -1){ + mk_log("Listen failure"); + close(server); + return 1; + } + return 0; +} + +void mk_server_loop(void){ + struct sockaddr_un cun; + socklen_t socklen = sizeof(cun); + char* ver = mk_strcat3("V", mk_get_version(), "\n"); + while(1){ + mk_log("Waiting for the connection"); + int cli = accept(server, (struct sockaddr*)&cun, &socklen); + send(cli, ver, strlen(ver), 0); + close(cli); + } + free(ver); +}