From a3c7e1ce23cd7502f0461354fc6cb2b16f39ed96 Mon Sep 17 00:00:00 2001 From: Guus Sliepen Date: Sat, 12 Apr 2014 14:43:13 +0200 Subject: [PATCH] Disable support for detaching from the foreground. --- src/Makefile.am | 1 - src/net_setup.c | 75 ++++------------- src/process.c | 214 ------------------------------------------------ src/process.h | 35 -------- src/tincd.c | 25 ------ 5 files changed, 16 insertions(+), 334 deletions(-) delete mode 100644 src/process.c delete mode 100644 src/process.h diff --git a/src/Makefile.am b/src/Makefile.am index 0e45a1c5..8cd579b4 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -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 \ diff --git a/src/net_setup.c b/src/net_setup.c index 39e63625..34626070 100644 --- a/src/net_setup.c +++ b/src/net_setup.c @@ -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 index 1505e7d3..00000000 --- a/src/process.c +++ /dev/null @@ -1,214 +0,0 @@ -/* - process.c -- process management functions - Copyright (C) 1999-2005 Ivo Timmermans, - 2000-2013 Guus Sliepen - - 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 index 4cdf711b..00000000 --- a/src/process.h +++ /dev/null @@ -1,35 +0,0 @@ -/* - process.h -- header file for process.c - Copyright (C) 1999-2005 Ivo Timmermans, - 2000-2013 Guus Sliepen - - 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__ */ diff --git a/src/tincd.c b/src/tincd.c index 57d18c70..3d521e5c 100644 --- a/src/tincd.c +++ b/src/tincd.c @@ -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. -- 2.39.5