char* strconcat(char* dest, ...);
bool file_exists(char* path);
char* strmcat(char* first, ...);
+int daemonize(void);
+/* File Descriptor Event Handling
+ *****************************************************************************/
enum { INPUT, OUTPUT };
typedef void (*event_cbfn_t)(int fd, void* data);
*curr = '\0';
return str;
}
+
+int daemonize(void) {
+ pid_t pid;
+ if (chdir("/") < 0) return -1;
+ close(0), close(1), close(2);
+ pid = fork();
+ if (pid < 0) return -1;
+ if (pid > 0) _exit(0);
+ if (setsid() < 0) return -1;
+ pid = fork();
+ if (pid < 0) return -1;
+ if (pid > 0) _exit(0);
+ return 0;
+}
int main(int argc, char** argv) {
SelText = fdgets(STDIN_FILENO);
if (SelText) {
- int pid = fork();
- if (pid == 0) {
- close(STDIN_FILENO);
- close(STDOUT_FILENO);
- close(STDERR_FILENO);
- chdir("/");
+ if (daemonize() == 0)
serve_selection();
- } else if (pid < 0) {
- die("fork() failed");
- }
+ else
+ die("daemonize() failed");
}
return 0;
}