diff options
Diffstat (limited to 'fuse/helper.c')
-rw-r--r-- | fuse/helper.c | 43 |
1 files changed, 33 insertions, 10 deletions
diff --git a/fuse/helper.c b/fuse/helper.c index 7b994fd3b..ace19dd70 100644 --- a/fuse/helper.c +++ b/fuse/helper.c @@ -179,14 +179,38 @@ err: int fuse_daemonize(int foreground) { - int res; - if (!foreground) { - res = daemon(0, 0); - if (res == -1) { - perror("fuse: failed to daemonize program\n"); + int nullfd; + + /* + * demonize current process by forking it and killing the + * parent. This makes current process as a child of 'init'. + */ + switch(fork()) { + case -1: + perror("fuse_daemonize: fork"); + return -1; + case 0: + break; + default: + _exit(0); + } + + if (setsid() == -1) { + perror("fuse_daemonize: setsid"); return -1; } + + (void) chdir("/"); + + nullfd = open("/dev/null", O_RDWR, 0); + if (nullfd != -1) { + (void) dup2(nullfd, 0); + (void) dup2(nullfd, 1); + (void) dup2(nullfd, 2); + if (nullfd > 2) + close(nullfd); + } } return 0; } @@ -227,7 +251,8 @@ static void fuse_unmount_common(const char *mountpoint, struct fuse_chan *ch) { int fd = ch ? fuse_chan_fd(ch) : -1; fuse_kern_unmount(mountpoint, fd); - fuse_chan_destroy(ch); + if (ch) + fuse_chan_destroy(ch); } void fuse_unmount(const char *mountpoint, struct fuse_chan *ch) @@ -324,11 +349,9 @@ static int fuse_main_common(int argc, char *argv[], if (fuse == NULL) return 1; -#ifdef __MULTI_THREAD if (multithreaded) res = fuse_loop_mt(fuse); else -#endif res = fuse_loop(fuse); fuse_teardown_common(fuse, mountpoint); @@ -359,7 +382,7 @@ int fuse_version(void) #include "fuse_compat.h" -#ifndef __FreeBSD__ +#if !defined(__FreeBSD__) && !defined(__NetBSD__) struct fuse *fuse_setup_compat22(int argc, char *argv[], const struct fuse_operations_compat22 *op, @@ -417,7 +440,7 @@ FUSE_SYMVER(".symver fuse_teardown,__fuse_teardown@"); FUSE_SYMVER(".symver fuse_main_compat2,fuse_main@"); FUSE_SYMVER(".symver fuse_main_real_compat22,fuse_main_real@FUSE_2.2"); -#endif /* __FreeBSD__ */ +#endif /* __FreeBSD__ || __NetBSD__ */ struct fuse *fuse_setup_compat25(int argc, char *argv[], |