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