X-Git-Url: https://git.syn-net.org/debian/?a=blobdiff_plain;f=src%2Fposix%2FsysExec.hpp;h=9a7a635e9b8d3d372b751bcd30f31a946f8cd64c;hb=refs%2Ftags%2Fupstream%2F0.3.7;hp=18fde97707d9f504876a3024c5de32c0e779b851;hpb=ece844834d2cecc028ce81ca283f5d441088580e;p=anytun.git diff --git a/src/posix/sysExec.hpp b/src/posix/sysExec.hpp index 18fde97..9a7a635 100644 --- a/src/posix/sysExec.hpp +++ b/src/posix/sysExec.hpp @@ -6,12 +6,12 @@ * tunnel endpoints. It has less protocol overhead than IPSec in Tunnel * mode and allows tunneling of every ETHER TYPE protocol (e.g. * ethernet, ip, arp ...). satp directly includes cryptography and - * message authentication based on the methodes used by SRTP. It is + * message authentication based on the methods used by SRTP. It is * intended to deliver a generic, scaleable and secure solution for * tunneling and relaying of packets of any protocol. * * - * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, + * Copyright (C) 2007-2014 Markus Grüneis, Othmar Gsenger, Erwin Nindl, * Christian Pointner * * This file is part of Anytun. @@ -27,8 +27,22 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with anytun. If not, see . + * along with Anytun. If not, see . + * + * In addition, as a special exception, the copyright holders give + * permission to link the code of portions of this program with the + * OpenSSL library under certain conditions as described in each + * individual source file, and distribute linked combinations + * including the two. + * You must obey the GNU General Public License in all respects + * for all of the code used other than OpenSSL. If you modify + * file(s) with this exception, you may extend this exception to your + * version of the file(s), but you are not obligated to do so. If you + * do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source + * files in the program, then also delete it here. */ + #pragma once #ifndef ANYTUN_sysexec_hpp_INCLUDED #define ANYTUN_sysexec_hpp_INCLUDED @@ -45,8 +59,9 @@ SysExec::~SysExec() { - if(!closed_) + if(!closed_) { close(pipefd_); + } } @@ -55,15 +70,17 @@ char** dupSysStringArray(T const& array) { char** new_array; new_array = static_cast(malloc((array.size() + 1)*sizeof(char*))); - if(!new_array) + if(!new_array) { return NULL; + } unsigned int i = 0; for(typename T::const_iterator it = array.begin(); it != array.end(); ++it) { new_array[i] = strdup(it->c_str()); if(!new_array) { - while(i--) + while(i--) { free(new_array[i]); + } free(new_array); return NULL; } @@ -75,11 +92,13 @@ char** dupSysStringArray(T const& array) void freeSysStringArray(char** array) { - if(!array) + if(!array) { return; + } - for(int i=0; array[i] ; ++i) + for(int i=0; array[i] ; ++i) { free(array[i]); + } free(array); } @@ -106,35 +125,38 @@ void SysExec::doExec(StringVector args, StringList env) } // child code, exec the script int fd; - for (fd=getdtablesize();fd>=0;--fd) // close all file descriptors - if(fd != pipefd[1]) close(fd); - + for(fd=getdtablesize(); fd>=0; --fd) // close all file descriptors + if(fd != pipefd[1]) { close(fd); } + fd = open("/dev/null",O_RDWR); // stdin - if(fd == -1) + if(fd == -1) { cLog.msg(Log::PRIO_WARNING) << "can't open stdin"; - else { - if(dup(fd) == -1) // stdout + } else { + if(dup(fd) == -1) { // stdout cLog.msg(Log::PRIO_WARNING) << "can't open stdout"; - if(dup(fd) == -1) // stderr + } + if(dup(fd) == -1) { // stderr cLog.msg(Log::PRIO_WARNING) << "can't open stderr"; + } } - + args.insert(args.begin(), script_); char** argv = dupSysStringArray(args); char** evp = dupSysStringArray(env); - + execve(script_.c_str(), argv, evp); - // if execve returns, an error occurred, but logging doesn't work - // because we closed all file descriptors, so just write errno to - // pipe and call exit - + // if execve returns, an error occurred, but logging doesn't work + // because we closed all file descriptors, so just write errno to + // pipe and call exit + freeSysStringArray(argv); freeSysStringArray(evp); int err = errno; int ret = write(pipefd[1], (void*)(&err), sizeof(err)); - if(ret != sizeof(errno)) + if(ret != sizeof(errno)) { exit(-2); + } exit(-1); } @@ -166,18 +188,20 @@ int SysExec::waitForScript() void SysExec::waitAndDestroy(SysExec*& s) { - if(!s) + if(!s) { return; + } s->waitForScript(); - if(WIFEXITED(s->return_code_)) - cLog.msg(Log::PRIO_NOTICE) << "script '" << s->script_ << "' returned " << WEXITSTATUS(s->return_code_); - else if(WIFSIGNALED(s->return_code_)) + if(WIFEXITED(s->return_code_)) { + cLog.msg(Log::PRIO_NOTICE) << "script '" << s->script_ << "' returned " << WEXITSTATUS(s->return_code_); + } else if(WIFSIGNALED(s->return_code_)) { cLog.msg(Log::PRIO_NOTICE) << "script '" << s->script_ << "' terminated after signal " << WTERMSIG(s->return_code_); - else if(WIFSTOPPED(s->return_code_)) + } else if(WIFSTOPPED(s->return_code_)) { cLog.msg(Log::PRIO_NOTICE) << "script '" << s->script_ << "' stopped after signal " << WSTOPSIG(s->return_code_); - else if(WIFCONTINUED(s->return_code_)) + } else if(WIFCONTINUED(s->return_code_)) { cLog.msg(Log::PRIO_NOTICE) << "script '" << s->script_ << "' continued after SIGCONT"; + } delete(s); s = NULL;