]> git.meshlink.io Git - meshlink/commitdiff
Disable support for detaching from the foreground.
authorGuus Sliepen <guus@meshlink.io>
Sat, 12 Apr 2014 12:43:13 +0000 (14:43 +0200)
committerGuus Sliepen <guus@meshlink.io>
Sat, 12 Apr 2014 12:43:13 +0000 (14:43 +0200)
src/Makefile.am
src/net_setup.c
src/process.c [deleted file]
src/process.h [deleted file]
src/tincd.c

index 0e45a1c5bf690b17a4340c38dca2a8bf2ecc1544..8cd579b41d004320655149f8538a8e319c87c0c7 100644 (file)
@@ -58,7 +58,6 @@ libmeshlink_la_SOURCES = \
        netutl.c netutl.h \
        node.c node.h \
        prf.h \
-       process.c process.h \
        protocol.c protocol.h \
        protocol_auth.c \
        protocol_edge.c \
index 39e63625231e003e6694a679448f0bcc579bd457..3462607058eb1969379e1d40a714141f2c9463e4 100644 (file)
@@ -32,7 +32,6 @@
 #include "names.h"
 #include "net.h"
 #include "netutl.h"
-#include "process.h"
 #include "protocol.h"
 #include "route.h"
 #include "rsa.h"
@@ -804,69 +803,27 @@ bool setup_myself(void) {
 
        /* Open sockets */
 
-       if(!do_detach && getenv("LISTEN_FDS")) {
-               sockaddr_t sa;
-               socklen_t salen;
-
-               listen_sockets = atoi(getenv("LISTEN_FDS"));
-#ifdef HAVE_UNSETENV
-               unsetenv("LISTEN_FDS");
-#endif
+       listen_sockets = 0;
+       int cfgs = 0;
 
-               if(listen_sockets > MAXSOCKETS) {
-                       logger(DEBUG_ALWAYS, LOG_ERR, "Too many listening sockets");
+       for(config_t *cfg = lookup_config(config_tree, "BindToAddress"); cfg; cfg = lookup_config_next(config_tree, cfg)) {
+               cfgs++;
+               get_config_string(cfg, &address);
+               if(!add_listen_address(address, true))
                        return false;
-               }
-
-               for(int i = 0; i < listen_sockets; i++) {
-                       salen = sizeof sa;
-                       if(getsockname(i + 3, &sa.sa, &salen) < 0) {
-                               logger(DEBUG_ALWAYS, LOG_ERR, "Could not get address of listen fd %d: %s", i + 3, sockstrerror(errno));
-                               return false;
-                       }
-
-#ifdef FD_CLOEXEC
-                       fcntl(i + 3, F_SETFD, FD_CLOEXEC);
-#endif
-
-                       int udp_fd = setup_vpn_in_socket(&sa);
-                       if(udp_fd < 0)
-                               return false;
-
-                       io_add(&listen_socket[i].tcp, (io_cb_t)handle_new_meta_connection, &listen_socket[i], i + 3, IO_READ);
-                       io_add(&listen_socket[i].udp, (io_cb_t)handle_incoming_vpn_data, &listen_socket[i], udp_fd, IO_READ);
-
-                       if(debug_level >= DEBUG_CONNECTIONS) {
-                               hostname = sockaddr2hostname(&sa);
-                               logger(DEBUG_CONNECTIONS, LOG_NOTICE, "Listening on %s", hostname);
-                               free(hostname);
-                       }
-
-                       memcpy(&listen_socket[i].sa, &sa, salen);
-               }
-       } else {
-               listen_sockets = 0;
-               int cfgs = 0;
-
-               for(config_t *cfg = lookup_config(config_tree, "BindToAddress"); cfg; cfg = lookup_config_next(config_tree, cfg)) {
-                       cfgs++;
-                       get_config_string(cfg, &address);
-                       if(!add_listen_address(address, true))
-                               return false;
-               }
-
-               for(config_t *cfg = lookup_config(config_tree, "ListenAddress"); cfg; cfg = lookup_config_next(config_tree, cfg)) {
-                       cfgs++;
-                       get_config_string(cfg, &address);
-                       if(!add_listen_address(address, false))
-                               return false;
-               }
+       }
 
-               if(!cfgs)
-                       if(!add_listen_address(address, NULL))
-                               return false;
+       for(config_t *cfg = lookup_config(config_tree, "ListenAddress"); cfg; cfg = lookup_config_next(config_tree, cfg)) {
+               cfgs++;
+               get_config_string(cfg, &address);
+               if(!add_listen_address(address, false))
+                       return false;
        }
 
+       if(!cfgs)
+               if(!add_listen_address(address, NULL))
+                       return false;
+
        if(!listen_sockets) {
                logger(DEBUG_ALWAYS, LOG_ERR, "Unable to create any listening socket!");
                return false;
diff --git a/src/process.c b/src/process.c
deleted file mode 100644 (file)
index 1505e7d..0000000
+++ /dev/null
@@ -1,214 +0,0 @@
-/*
-    process.c -- process management functions
-    Copyright (C) 1999-2005 Ivo Timmermans,
-                  2000-2013 Guus Sliepen <guus@tinc-vpn.org>
-
-    This program is free software; you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation; either version 2 of the License, or
-    (at your option) any later version.
-
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License along
-    with this program; if not, write to the Free Software Foundation, Inc.,
-    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-*/
-
-#include "system.h"
-
-#include "conf.h"
-#include "connection.h"
-#include "edge.h"
-#include "event.h"
-#include "logger.h"
-#include "names.h"
-#include "net.h"
-#include "node.h"
-#include "process.h"
-#include "utils.h"
-#include "xalloc.h"
-
-/* If zero, don't detach from the terminal. */
-bool do_detach = true;
-bool sigalrm = false;
-
-extern char **g_argv;
-extern bool use_logfile;
-
-/* Some functions the less gifted operating systems might lack... */
-
-#ifdef HAVE_MINGW
-static SC_HANDLE manager = NULL;
-static SC_HANDLE service = NULL;
-static SERVICE_STATUS status = {0};
-static SERVICE_STATUS_HANDLE statushandle = 0;
-
-static bool install_service(void) {
-       char command[4096] = "\"";
-       SERVICE_DESCRIPTION description = {"Virtual Private Network daemon"};
-
-       manager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
-       if(!manager) {
-               logger(DEBUG_ALWAYS, LOG_ERR, "Could not open service manager: %s", winerror(GetLastError()));
-               return false;
-       }
-
-       if(!strchr(program_name, '\\')) {
-               GetCurrentDirectory(sizeof command - 1, command + 1);
-               strncat(command, "\\", sizeof command - strlen(command));
-       }
-
-       strncat(command, program_name, sizeof command - strlen(command));
-
-       strncat(command, "\"", sizeof command - strlen(command));
-
-       for(char **argp = g_argv + 1; *argp; argp++) {
-               char *space = strchr(*argp, ' ');
-               strncat(command, " ", sizeof command - strlen(command));
-
-               if(space)
-                       strncat(command, "\"", sizeof command - strlen(command));
-
-               strncat(command, *argp, sizeof command - strlen(command));
-
-               if(space)
-                       strncat(command, "\"", sizeof command - strlen(command));
-       }
-
-       service = CreateService(manager, identname, identname,
-                       SERVICE_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS, SERVICE_AUTO_START, SERVICE_ERROR_NORMAL,
-                       command, NULL, NULL, NULL, NULL, NULL);
-
-       if(!service) {
-               DWORD lasterror = GetLastError();
-               logger(DEBUG_ALWAYS, LOG_ERR, "Could not create %s service: %s", identname, winerror(lasterror));
-               if(lasterror != ERROR_SERVICE_EXISTS)
-                       return false;
-       }
-
-       if(service) {
-               ChangeServiceConfig2(service, SERVICE_CONFIG_DESCRIPTION, &description);
-               logger(DEBUG_ALWAYS, LOG_INFO, "%s service installed", identname);
-       } else {
-               service = OpenService(manager, identname, SERVICE_ALL_ACCESS);
-       }
-
-       if(!StartService(service, 0, NULL))
-               logger(DEBUG_ALWAYS, LOG_WARNING, "Could not start %s service: %s", identname, winerror(GetLastError()));
-       else
-               logger(DEBUG_ALWAYS, LOG_INFO, "%s service started", identname);
-
-       return true;
-}
-
-DWORD WINAPI controlhandler(DWORD request, DWORD type, LPVOID boe, LPVOID bah) {
-       switch(request) {
-               case SERVICE_CONTROL_INTERROGATE:
-                       SetServiceStatus(statushandle, &status);
-                       return NO_ERROR;
-               case SERVICE_CONTROL_STOP:
-                       logger(DEBUG_ALWAYS, LOG_NOTICE, "Got %s request", "SERVICE_CONTROL_STOP");
-                       break;
-               case SERVICE_CONTROL_SHUTDOWN:
-                       logger(DEBUG_ALWAYS, LOG_NOTICE, "Got %s request", "SERVICE_CONTROL_SHUTDOWN");
-                       break;
-               default:
-                       logger(DEBUG_ALWAYS, LOG_WARNING, "Got unexpected request %d", (int)request);
-                       return ERROR_CALL_NOT_IMPLEMENTED;
-       }
-
-       event_exit();
-       status.dwWaitHint = 30000;
-       status.dwCurrentState = SERVICE_STOP_PENDING;
-       SetServiceStatus(statushandle, &status);
-       return NO_ERROR;
-}
-
-VOID WINAPI run_service(DWORD argc, LPTSTR* argv) {
-       extern int main2(int argc, char **argv);
-
-       status.dwServiceType = SERVICE_WIN32;
-       status.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN;
-       status.dwWin32ExitCode = 0;
-       status.dwServiceSpecificExitCode = 0;
-       status.dwCheckPoint = 0;
-
-       statushandle = RegisterServiceCtrlHandlerEx(identname, controlhandler, NULL);
-
-       if (!statushandle) {
-               logger(DEBUG_ALWAYS, LOG_ERR, "System call `%s' failed: %s", "RegisterServiceCtrlHandlerEx", winerror(GetLastError()));
-       } else {
-               status.dwWaitHint = 30000;
-               status.dwCurrentState = SERVICE_START_PENDING;
-               SetServiceStatus(statushandle, &status);
-
-               status.dwWaitHint = 0;
-               status.dwCurrentState = SERVICE_RUNNING;
-               SetServiceStatus(statushandle, &status);
-
-               main2(argc, argv);
-
-               status.dwWaitHint = 0;
-               status.dwCurrentState = SERVICE_STOPPED;
-               SetServiceStatus(statushandle, &status);
-       }
-
-       return;
-}
-
-bool init_service(void) {
-       SERVICE_TABLE_ENTRY services[] = {
-               {identname, run_service},
-               {NULL, NULL}
-       };
-
-       if(!StartServiceCtrlDispatcher(services)) {
-               if(GetLastError() == ERROR_FAILED_SERVICE_CONTROLLER_CONNECT) {
-                       return false;
-               }
-               else
-                       logger(DEBUG_ALWAYS, LOG_ERR, "System call `%s' failed: %s", "StartServiceCtrlDispatcher", winerror(GetLastError()));
-       }
-
-       return true;
-}
-#endif
-
-/*
-  Detach from current terminal
-*/
-bool detach(void) {
-#ifndef HAVE_MINGW
-       signal(SIGPIPE, SIG_IGN);
-       signal(SIGUSR1, SIG_IGN);
-       signal(SIGUSR2, SIG_IGN);
-       signal(SIGWINCH, SIG_IGN);
-
-       closelogger();
-#endif
-
-       if(do_detach) {
-#ifndef HAVE_MINGW
-               if(daemon(0, 0)) {
-                       logger(DEBUG_ALWAYS, LOG_ERR, "Couldn't detach from terminal: %s", strerror(errno));
-                       return false;
-               }
-#else
-               if(!statushandle)
-                       exit(!install_service());
-#endif
-       }
-
-       openlogger(identname, use_logfile?LOGMODE_FILE:(do_detach?LOGMODE_SYSLOG:LOGMODE_STDERR));
-
-       logger(DEBUG_ALWAYS, LOG_NOTICE, "tincd %s (%s %s) starting, debug level %d",
-                          VERSION, __DATE__, __TIME__, debug_level);
-
-       return true;
-}
-
-
diff --git a/src/process.h b/src/process.h
deleted file mode 100644 (file)
index 4cdf711..0000000
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
-    process.h -- header file for process.c
-    Copyright (C) 1999-2005 Ivo Timmermans,
-                  2000-2013 Guus Sliepen <guus@tinc-vpn.org>
-
-    This program is free software; you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation; either version 2 of the License, or
-    (at your option) any later version.
-
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License along
-    with this program; if not, write to the Free Software Foundation, Inc.,
-    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-*/
-
-#ifndef __TINC_PROCESS_H__
-#define __TINC_PROCESS_H__
-
-extern bool do_detach;
-extern bool sigalrm;
-
-extern void setup_signals(void);
-extern bool detach(void);
-extern bool kill_other(int);
-
-#ifdef HAVE_MINGW
-extern bool init_service(void);
-#endif
-
-#endif /* __TINC_PROCESS_H__ */
index 57d18c7089ac45e54606c53541e83364af9511d2..3d521e5cfdc4b2f9997150b6bab8e80766bad9b6 100644 (file)
@@ -51,7 +51,6 @@
 #include "names.h"
 #include "net.h"
 #include "netutl.h"
-#include "process.h"
 #include "protocol.h"
 #include "utils.h"
 #include "xalloc.h"
@@ -152,10 +151,6 @@ static bool parse_options(int argc, char **argv) {
                                confbase = xstrdup(optarg);
                                break;
 
-                       case 'D': /* no detach */
-                               do_detach = false;
-                               break;
-
                        case 'L': /* no detach */
 #ifndef HAVE_MLOCKALL
                                logger(DEBUG_ALWAYS, LOG_ERR, "The %s option is not supported on this platform.", argv[optind - 1]);
@@ -344,12 +339,6 @@ int main(int argc, char **argv) {
 
        g_argv = argv;
 
-       if(getenv("LISTEN_PID") && atoi(getenv("LISTEN_PID")) == getpid())
-               do_detach = false;
-#ifdef HAVE_UNSETENV
-       unsetenv("LISTEN_PID");
-#endif
-
        init_configuration(&config_tree);
 
        /* Slllluuuuuuurrrrp! */
@@ -368,22 +357,8 @@ int main(int argc, char **argv) {
        }
 #endif
 
-#ifdef HAVE_MINGW
-       if(!do_detach || !init_service())
-               return main2(argc, argv);
-       else
-               return 1;
-}
-
-int main2(int argc, char **argv) {
-       InitializeCriticalSection(&mutex);
-       EnterCriticalSection(&mutex);
-#endif
        char *priority = NULL;
 
-       if(!detach())
-               return 1;
-
 #ifdef HAVE_MLOCKALL
        /* Lock all pages into memory if requested.
         * This has to be done after daemon()/fork() so it works for child.