diff options
Diffstat (limited to 'contrib/asterisk-xip/patches/035-main-asterisk-uclibc-daemon.patch')
-rw-r--r-- | contrib/asterisk-xip/patches/035-main-asterisk-uclibc-daemon.patch | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/contrib/asterisk-xip/patches/035-main-asterisk-uclibc-daemon.patch b/contrib/asterisk-xip/patches/035-main-asterisk-uclibc-daemon.patch new file mode 100644 index 0000000000..262bed4a74 --- /dev/null +++ b/contrib/asterisk-xip/patches/035-main-asterisk-uclibc-daemon.patch @@ -0,0 +1,42 @@ +diff -Nru asterisk-1.4.22.org/main/asterisk.c asterisk-1.4.22/main/asterisk.c +--- asterisk-1.4.22.org/main/asterisk.c 2008-07-26 17:31:21.000000000 +0200 ++++ asterisk-1.4.22/main/asterisk.c 2008-12-20 22:49:58.000000000 +0100 +@@ -2935,7 +2935,38 @@ + #if HAVE_WORKING_FORK + if (ast_opt_always_fork || !ast_opt_no_fork) { + #ifndef HAVE_SBIN_LAUNCHD ++#ifndef __UCLIBC__ + daemon(1, 0); ++#else ++/* ++ workaround for uClibc-0.9.29 mipsel bug: ++ recursive mutexes do not work if uClibc daemon() function has been called, ++ if parent thread locks a mutex ++ the child thread cannot acquire a lock with the same name ++ (same code works if daemon() is not called) ++ but duplication of uClibc daemon.c code in here does work. ++*/ ++ int fd; ++ switch (fork()) { ++ case -1: ++ exit(1); ++ case 0: ++ break; ++ default: ++ _exit(0); ++ } ++ if (setsid() == -1) ++ exit(1); ++ if (fork()) ++ _exit(0); ++ if ((fd = open("/dev/null", O_RDWR, 0)) != -1) { ++ dup2(fd, STDIN_FILENO); ++ dup2(fd, STDOUT_FILENO); ++ dup2(fd, STDERR_FILENO); ++ if (fd > 2) ++ close(fd); ++ } ++#endif + ast_mainpid = getpid(); + /* Blindly re-write pid file since we are forking */ + unlink(ast_config_AST_PID); |