dnscrypto-proxy: Update to release 1.3.0
[tomato.git] / release / src / router / dnscrypt / src / proxy / utils.c
blob2772493026de624e660812cf3725161642b453e7
2 #include <config.h>
3 #include <sys/types.h>
4 #include <sys/time.h>
6 #include <assert.h>
7 #include <fcntl.h>
8 #include <unistd.h>
10 #include <event2/util.h>
12 #include "logger.h"
13 #include "pathnames.h"
14 #include "utils.h"
16 uint64_t
17 dnscrypt_hrtime(void)
19 struct timeval tv;
20 uint64_t ts = (uint64_t) 0U;
21 int ret;
23 ret = evutil_gettimeofday(&tv, NULL);
24 assert(ret == 0);
25 if (ret == 0) {
26 ts = (uint64_t) tv.tv_sec * 1000000U + (uint64_t) tv.tv_usec;
28 return ts;
31 #ifndef _WIN32
32 static unsigned int
33 open_max(void)
35 long z;
37 if ((z = (long) sysconf(_SC_OPEN_MAX)) < 0L) {
38 logger_error(NULL, "_SC_OPEN_MAX");
39 return 2U;
41 return (unsigned int) z;
44 int
45 closedesc_all(const int closestdin)
47 int fodder;
49 if (closestdin != 0) {
50 (void) close(0);
51 if ((fodder = open(_PATH_DEVNULL, O_RDONLY)) == -1) {
52 return -1;
54 (void) dup2(fodder, 0);
55 if (fodder > 0) {
56 (void) close(fodder);
59 if ((fodder = open(_PATH_DEVNULL, O_WRONLY)) == -1) {
60 return -1;
62 (void) dup2(fodder, 1);
63 (void) dup2(1, 2);
64 if (fodder > 2) {
65 (void) close(fodder);
68 return 0;
71 int
72 do_daemonize(void)
74 pid_t child;
75 unsigned int i;
77 if ((child = fork()) == (pid_t) -1) {
78 logger_error(NULL, "Unable to fork() in order to daemonize");
79 return -1;
80 } else if (child != (pid_t) 0) {
81 _exit(0);
83 if (setsid() == (pid_t) -1) {
84 logger_error(NULL, "Unable to setsid()");
86 i = open_max();
87 do {
88 if (isatty((int) i)) {
89 (void) close((int) i);
91 i--;
92 } while (i > 2U);
93 if (closedesc_all(1) != 0) {
94 logger_error(NULL, _PATH_DEVNULL " duplication");
95 return -1;
97 return 0;
100 #else /* _WIN32 */
103 closedesc_all(const int closestdin)
105 (void) closestdin;
106 return 0;
110 do_daemonize(void)
112 return 0;
115 #endif