Changes to update Tomato RAF.
[tomato.git] / release / src / router / dnscrypt / src / proxy / utils.c
blob14a4d3416115976869d5a46287b912c355174897
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 void
17 dnscrypt_memzero(void * const pnt, const size_t size)
19 volatile unsigned char *pnt_ = (volatile unsigned char *) pnt;
20 size_t i = (size_t) 0U;
22 while (i < size) {
23 pnt_[i++] = 0U;
27 uint64_t
28 dnscrypt_hrtime(void)
30 struct timeval tv;
31 uint64_t ts = (uint64_t) 0U;
32 int ret;
34 ret = evutil_gettimeofday(&tv, NULL);
35 assert(ret == 0);
36 if (ret == 0) {
37 ts = (uint64_t) tv.tv_sec * 1000000U + (uint64_t) tv.tv_usec;
39 return ts;
42 #ifndef _WIN32
43 static unsigned int
44 open_max(void)
46 long z;
48 if ((z = (long) sysconf(_SC_OPEN_MAX)) < 0L) {
49 logger_error(NULL, "_SC_OPEN_MAX");
50 return 2U;
52 return (unsigned int) z;
55 int
56 closedesc_all(const int closestdin)
58 int fodder;
60 if (closestdin != 0) {
61 (void) close(0);
62 if ((fodder = open(_PATH_DEVNULL, O_RDONLY)) == -1) {
63 return -1;
65 (void) dup2(fodder, 0);
66 if (fodder > 0) {
67 (void) close(fodder);
70 if ((fodder = open(_PATH_DEVNULL, O_WRONLY)) == -1) {
71 return -1;
73 (void) dup2(fodder, 1);
74 (void) dup2(1, 2);
75 if (fodder > 2) {
76 (void) close(fodder);
79 return 0;
82 int
83 do_daemonize(void)
85 pid_t child;
86 unsigned int i;
88 if ((child = fork()) == (pid_t) -1) {
89 logger_error(NULL, "Unable to fork() in order to daemonize");
90 return -1;
91 } else if (child != (pid_t) 0) {
92 _exit(0);
94 if (setsid() == (pid_t) -1) {
95 logger_error(NULL, "Unable to setsid()");
97 i = open_max();
98 do {
99 if (isatty((int) i)) {
100 (void) close((int) i);
102 i--;
103 } while (i > 2U);
104 if (closedesc_all(1) != 0) {
105 logger_error(NULL, _PATH_DEVNULL " duplication");
106 return -1;
108 return 0;
111 #else /* _WIN32 */
114 closedesc_all(const int closestdin)
116 (void) closestdin;
117 return 0;
121 do_daemonize(void)
123 return 0;
126 #endif