45 lines
1.3 KiB
Diff
45 lines
1.3 KiB
Diff
|
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);
|