packages/net/asterisk-1.4.x/patches/035-main-asterisk-uclibc-daemon.patch
zandbelt 88ff7a5838 update chan_mobile to r725 based on backport patch from http://www.asterisk.org/node/48557
git-svn-id: svn://svn.openwrt.org/openwrt/packages@14337 3c298f89-4303-0410-b956-a3cf2f4a3e73
2009-02-01 08:13:16 +00:00

45 lines
1.5 KiB
Diff

diff -Nru asterisk-1.4.23.1.org/main/asterisk.c asterisk-1.4.23.1/main/asterisk.c
--- asterisk-1.4.23.1.org/main/asterisk.c 2008-12-23 16:35:38.000000000 +0100
+++ asterisk-1.4.23.1/main/asterisk.c 2009-01-31 15:41:40.000000000 +0100
@@ -2986,9 +2986,40 @@
#if HAVE_WORKING_FORK
if (ast_opt_always_fork || !ast_opt_no_fork) {
#ifndef HAVE_SBIN_LAUNCHD
+#ifndef __UCLIBC__
if (daemon(1, 0) < 0) {
ast_log(LOG_ERROR, "daemon() failed: %s\n", strerror(errno));
}
+#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);