X-Git-Url: http://git.meshlink.io/?a=blobdiff_plain;f=src%2Fdropin.c;h=1cd06fc1affdbb31522cef49062ad249b21c10e1;hb=4c19d9a203d0ff05ffe680732b4564d0e783d037;hp=eb17acaad082ecb40d489bd5f7c0022cdadcd7d7;hpb=3fba80174dbe29bcfe0d121a2a1d2e61be5ee57b;p=meshlink diff --git a/src/dropin.c b/src/dropin.c index eb17acaa..1cd06fc1 100644 --- a/src/dropin.c +++ b/src/dropin.c @@ -1,7 +1,6 @@ /* dropin.c -- a set of drop-in replacements for libc functions - Copyright (C) 2000-2005 Ivo Timmermans, - 2000-2011 Guus Sliepen + Copyright (C) 2014 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 @@ -22,70 +21,6 @@ #include "xalloc.h" -#ifndef HAVE_DAEMON -/* - Replacement for the daemon() function. - - The daemon() function is for programs wishing to detach themselves - from the controlling terminal and run in the background as system - daemons. - - Unless the argument nochdir is non-zero, daemon() changes the - current working directory to the root (``/''). - - Unless the argument noclose is non-zero, daemon() will redirect - standard input, standard output and standard error to /dev/null. -*/ -int daemon(int nochdir, int noclose) { -#ifdef HAVE_FORK - pid_t pid; - int fd; - - pid = fork(); - - /* Check if forking failed */ - if(pid < 0) { - perror("fork"); - exit(-1); - } - - /* If we are the parent, terminate */ - if(pid) - exit(0); - - /* Detach by becoming the new process group leader */ - if(setsid() < 0) { - perror("setsid"); - return -1; - } - - /* Change working directory to the root (to avoid keeping mount - points busy) */ - if(!nochdir) { - chdir("/"); - } - - /* Redirect stdin/out/err to /dev/null */ - if(!noclose) { - fd = open("/dev/null", O_RDWR); - - if(fd < 0) { - perror("opening /dev/null"); - return -1; - } else { - dup2(fd, 0); - dup2(fd, 1); - dup2(fd, 2); - } - } - - return 0; -#else - return -1; -#endif -} -#endif - #ifndef HAVE_GET_CURRENT_DIR_NAME /* Replacement for the GNU get_current_dir_name function: @@ -104,14 +39,14 @@ char *get_current_dir_name(void) { size = 100; buf = xmalloc(size); - errno = 0; /* Success */ + errno = 0; /* Success */ r = getcwd(buf, size); /* getcwd returns NULL and sets errno to ERANGE if the bufferspace is insufficient to contain the entire working directory. */ while(r == NULL && errno == ERANGE) { free(buf); - size <<= 1; /* double the size */ + size <<= 1; /* double the size */ buf = xmalloc(size); r = getcwd(buf, size); } @@ -158,8 +93,18 @@ int vasprintf(char **buf, const char *fmt, va_list ap) { #ifndef HAVE_GETTIMEOFDAY int gettimeofday(struct timeval *tv, void *tz) { +#ifdef HAVE_MINGW + FILETIME ft; + GetSystemTimeAsFileTime(&ft); + uint64_t lt = (uint64_t)ft.dwLowDateTime | ((uint64_t)ft.dwHighDateTime << 32); + lt -= 116444736000000000ULL; + tv->tv_sec = lt / 10000000; + tv->tv_usec = (lt / 10) % 1000000; +#else +#warning No high resolution time source! tv->tv_sec = time(NULL); tv->tv_usec = 0; +#endif return 0; } #endif