summaryrefslogtreecommitdiffstats
path: root/testing/asterisk/100-uclibc-daemon.patch
blob: 4956791d4dffa45003c61492646454d54cd79e44 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
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);