diff --git a/src/common/util.c b/src/common/util.c index cde1cb33bd..84f623301f 100644 --- a/src/common/util.c +++ b/src/common/util.c @@ -18,6 +18,13 @@ #ifdef HAVE_FCNTL_H #include #endif +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#ifdef HAVE_UNISTD_H +#include +#endif +#include #include "util.h" #include "log.h" @@ -107,3 +114,36 @@ void set_socket_nonblocking(int socket) fcntl(socket, F_SETFL, O_NONBLOCK); #endif } + +int spawn_func(int (*func)(void *), void *data) +{ +#ifdef _MSC_VER + int rv; + rv = _beginthread(func, 0, data); + if (rv == (unsigned long) -1) + return -1; + return 0; +#else + pid_t pid; + pid = fork(); + if (pid<0) + return -1; + if (pid==0) { + /* Child */ + func(data); + assert(0); /* Should never reach here. */ + } else { + /* Parent */ + return 0; + } +#endif +} + +void spawn_exit() +{ +#ifdef _MSC_VER + _endthread(); +#else + exit(0); +#endif +} diff --git a/src/common/util.h b/src/common/util.h index eb175c961f..ee3c6eba48 100644 --- a/src/common/util.h +++ b/src/common/util.h @@ -45,4 +45,11 @@ int tv_cmp(struct timeval *a, struct timeval *b); void set_socket_nonblocking(int socket); +/* Minimalist interface to run a void function in the background. On + unix calls fork, on win32 calls beginthread. Returns -1 on failure. + func should not return, but rather should call spawn_exit. +*/ +int spawn_func(int (*func)(void *), void *data); +void spawn_exit(); + #endif