-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);