void Utility::Daemonize(void) {
#ifndef _WIN32
pid_t pid;
- pid_t sid;
int fd;
pid = fork();
- if (pid == -1) {
- return false;
- }
+ if (pid < 0)
+ throw PosixException("fork failed", errno);
if (pid)
exit(0);
fd = open("/dev/null", O_RDWR);
- if (fd) {
- if (fd != 0) {
- dup2(fd, 0);
- }
-
- if (fd != 1) {
- dup2(fd, 1);
- }
-
- if (fd != 2) {
- dup2(fd, 2);
- }
-
- if (fd > 2) {
- close(fd);
- }
- }
-
- sid = setsid();
- if (sid == -1) {
- return false;
- }
+
+ if (fd < 0)
+ throw PosixException("open failed", errno);
+
+ if (fd != 0)
+ dup2(fd, 0);
+
+ if (fd != 1)
+ dup2(fd, 1);
+
+ if (fd != 2)
+ dup2(fd, 2);
+
+ if (fd > 2)
+ close(fd);
+
+ if (setsid() < 0)
+ throw PosixException("setsid failed", errno);
#endif
}