diff -Nru asterisk-1.6.1-beta4.org/main/asterisk.c asterisk-1.6.1-beta4/main/asterisk.c --- asterisk-1.6.1-beta4.org/main/asterisk.c 2008-12-12 23:05:58.000000000 +0100 +++ asterisk-1.6.1-beta4/main/asterisk.c 2008-12-23 15:28:21.000000000 +0100 @@ -3295,9 +3295,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);