mirror of
https://gitlab.torproject.org/tpo/core/tor.git
synced 2025-02-24 14:51:11 +01:00
Add a small library to emulate tor_run_main() with exec()
This commit is contained in:
parent
fa02ea102e
commit
e8682c8594
4 changed files with 85 additions and 0 deletions
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -211,6 +211,7 @@ uptime-*.json
|
||||||
/src/test/fuzz/lf-fuzz-*
|
/src/test/fuzz/lf-fuzz-*
|
||||||
|
|
||||||
# /src/tools/
|
# /src/tools/
|
||||||
|
/src/tools/libtorrunner.a
|
||||||
/src/tools/tor-checkkey
|
/src/tools/tor-checkkey
|
||||||
/src/tools/tor-resolve
|
/src/tools/tor-resolve
|
||||||
/src/tools/tor-cov-resolve
|
/src/tools/tor-cov-resolve
|
||||||
|
|
|
@ -375,6 +375,7 @@ AH_BOTTOM([
|
||||||
|
|
||||||
|
|
||||||
AM_CONDITIONAL(BUILD_NT_SERVICES, test "x$bwin32" = "xtrue")
|
AM_CONDITIONAL(BUILD_NT_SERVICES, test "x$bwin32" = "xtrue")
|
||||||
|
AM_CONDITIONAL(BUILD_LIBTORRUNNER, test "x$bwin32" != "xtrue")
|
||||||
|
|
||||||
dnl Enable C99 when compiling with MIPSpro
|
dnl Enable C99 when compiling with MIPSpro
|
||||||
AC_MSG_CHECKING([for MIPSpro compiler])
|
AC_MSG_CHECKING([for MIPSpro compiler])
|
||||||
|
|
|
@ -45,3 +45,8 @@ src_tools_tor_cov_gencert_LDADD = src/common/libor-testing.a \
|
||||||
endif
|
endif
|
||||||
|
|
||||||
EXTRA_DIST += src/tools/tor-fw-helper/README
|
EXTRA_DIST += src/tools/tor-fw-helper/README
|
||||||
|
|
||||||
|
if BUILD_LIBTORRUNNER
|
||||||
|
noinst_LIBRARIES += src/tools/libtorrunner.a
|
||||||
|
src_tools_libtorrunner_a_SOURCES = src/tools/tor_runner.c src/or/tor_api.c
|
||||||
|
endif
|
||||||
|
|
78
src/tools/tor_runner.c
Normal file
78
src/tools/tor_runner.c
Normal file
|
@ -0,0 +1,78 @@
|
||||||
|
/* Copyright (c) 2001 Matej Pfajfar.
|
||||||
|
* Copyright (c) 2001-2004, Roger Dingledine.
|
||||||
|
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
|
||||||
|
* Copyright (c) 2007-2017, The Tor Project, Inc. */
|
||||||
|
/* See LICENSE for licensing information */
|
||||||
|
|
||||||
|
#include "tor_api.h"
|
||||||
|
#include "tor_api_internal.h"
|
||||||
|
|
||||||
|
#include "orconfig.h"
|
||||||
|
#ifdef HAVE_UNISTD_H
|
||||||
|
#include <unistd.h>
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_SYS_WAIT_H
|
||||||
|
#include <sys/wait.h>
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_SYS_SOCKET_H
|
||||||
|
#include <sys/socket.h>
|
||||||
|
#endif
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#ifndef __GNUC__
|
||||||
|
#define __attribute__(x)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static void child(const tor_main_configuration_t *cfg)
|
||||||
|
__attribute__((noreturn));
|
||||||
|
|
||||||
|
int
|
||||||
|
tor_run_main(const tor_main_configuration_t *cfg)
|
||||||
|
{
|
||||||
|
pid_t pid = fork();
|
||||||
|
if (pid == 0) {
|
||||||
|
child(cfg);
|
||||||
|
exit(0); /* Unreachable */
|
||||||
|
}
|
||||||
|
|
||||||
|
pid_t stopped_pid;
|
||||||
|
int status = 0;
|
||||||
|
do {
|
||||||
|
stopped_pid = waitpid(pid, &status, 0);
|
||||||
|
} while (stopped_pid == -1);
|
||||||
|
|
||||||
|
/* Note: these return values are not documented. No return value is
|
||||||
|
* documented! */
|
||||||
|
|
||||||
|
if (stopped_pid != pid) {
|
||||||
|
return -99999;
|
||||||
|
}
|
||||||
|
if (WIFSTOPPED(status)) {
|
||||||
|
return WEXITSTATUS(status);
|
||||||
|
}
|
||||||
|
if (WIFSIGNALED(status)) {
|
||||||
|
return -WTERMSIG(status);
|
||||||
|
}
|
||||||
|
|
||||||
|
return -999988;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
child(const tor_main_configuration_t *cfg)
|
||||||
|
{
|
||||||
|
/* XXXX Close unused file descriptors. */
|
||||||
|
|
||||||
|
char **args = calloc(cfg->argc+1, sizeof(char *));
|
||||||
|
memcpy(args, cfg->argv, cfg->argc * sizeof(char *));
|
||||||
|
args[cfg->argc] = NULL;
|
||||||
|
|
||||||
|
int rv = execv(BINDIR "/tor", args);
|
||||||
|
|
||||||
|
if (rv < 0) {
|
||||||
|
exit(254);
|
||||||
|
} else {
|
||||||
|
abort(); /* Unreachable */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue