workaround asterisk daemon issue #4071 caused by uclibc 0.29 (thanks to charles.kirsch)
authorHans Zandbelt <hans.zandbelt@gmail.com>
Sun, 21 Dec 2008 20:34:15 +0000 (20:34 +0000)
committerHans Zandbelt <hans.zandbelt@gmail.com>
Sun, 21 Dec 2008 20:34:15 +0000 (20:34 +0000)
SVN-Revision: 13712

net/asterisk-1.4.x/Makefile
net/asterisk-1.4.x/patches/035-main-asterisk-uclibc-daemon.patch [new file with mode: 0644]

index f36ad44e71a66cfc4ff379fbf3930d17f84102f0..b3c5faf04635e37e70214339efb58cc4f8a43ff4 100644 (file)
@@ -10,7 +10,7 @@ include $(TOPDIR)/rules.mk
 
 PKG_NAME:=asterisk
 PKG_VERSION:=1.4.22
-PKG_RELEASE:=1
+PKG_RELEASE:=2
 
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
 PKG_SOURCE_URL:=http://downloads.digium.com/pub/asterisk/releases/
diff --git a/net/asterisk-1.4.x/patches/035-main-asterisk-uclibc-daemon.patch b/net/asterisk-1.4.x/patches/035-main-asterisk-uclibc-daemon.patch
new file mode 100644 (file)
index 0000000..262bed4
--- /dev/null
@@ -0,0 +1,42 @@
+diff -Nru asterisk-1.4.22.org/main/asterisk.c asterisk-1.4.22/main/asterisk.c
+--- asterisk-1.4.22.org/main/asterisk.c        2008-07-26 17:31:21.000000000 +0200
++++ asterisk-1.4.22/main/asterisk.c    2008-12-20 22:49:58.000000000 +0100
+@@ -2935,7 +2935,38 @@
+ #if HAVE_WORKING_FORK
+       if (ast_opt_always_fork || !ast_opt_no_fork) {
+ #ifndef HAVE_SBIN_LAUNCHD
++#ifndef __UCLIBC__
+               daemon(1, 0);
++#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);