diff options
Diffstat (limited to 'main.c')
-rw-r--r-- | main.c | 18 |
1 files changed, 18 insertions, 0 deletions
@@ -80,6 +80,22 @@ static void * answer_request(size_t new_socket) { | |||
80 | return NULL; | 80 | return NULL; |
81 | } | 81 | } |
82 | 82 | ||
83 | |||
84 | int become_daemon(const char * name) { | ||
85 | if(fork()) { | ||
86 | exit(EXIT_SUCCESS); | ||
87 | } else { | ||
88 | setsid(); | ||
89 | if(fork()) { | ||
90 | exit(EXIT_SUCCESS); | ||
91 | } else { | ||
92 | syslog(0, "daemon '%s' is running with pid %d", name, getpid()); | ||
93 | return EXIT_SUCCESS; | ||
94 | } | ||
95 | } | ||
96 | } | ||
97 | |||
98 | |||
83 | static int serve(int server_fd) | 99 | static int serve(int server_fd) |
84 | { | 100 | { |
85 | struct sockaddr_in address; | 101 | struct sockaddr_in address; |
@@ -127,6 +143,8 @@ int main(const int argc, char const * argv[]) { | |||
127 | ? err(errno, NULL) | 143 | ? err(errno, NULL) |
128 | : listen(server_fd, SOMAXCONN) | 144 | : listen(server_fd, SOMAXCONN) |
129 | ? err(errno, NULL) | 145 | ? err(errno, NULL) |
146 | : become_daemon(argv[0]) | ||
147 | ? err(errno, NULL) | ||
130 | : serve(server_fd) | 148 | : serve(server_fd) |
131 | ? err(errno, NULL) | 149 | ? err(errno, NULL) |
132 | : exit(EXIT_SUCCESS) | 150 | : exit(EXIT_SUCCESS) |