[dahdi-commits] dahdi/tools.git branch "master" updated.

SVN commits to the DAHDI project dahdi-commits at lists.digium.com
Mon Jul 7 17:06:50 CDT 2014


branch "master" has been updated
       via  8045f7f49330e4588c34f806d29da296248a1bdc (commit)
      from  64e7c688d3b7c158d2d1ebe85812487960a42f71 (commit)

Summary of changes:
 dahdi_cfg.c |   30 ++++++++++++++++++++++++++++--
 1 file changed, 28 insertions(+), 2 deletions(-)


- Log -----------------------------------------------------------------
commit 8045f7f49330e4588c34f806d29da296248a1bdc
Author: Shaun Ruffell <sruffell at digium.com>
Date:   Mon Jul 7 15:12:57 2014 -0500

    dahdi_cfg: Unlink semaphore on early exit.
    
    If dahdi_cfg is terminated while holding the named semaphore, it is possible to
    leave it behind and all subsequenct invocations of dahdi_cfg will block waiting
    for it.
    
    Signed-off-by: Shaun Ruffell <sruffell at digium.com>
    Signed-off-by: Russ Meyerriecks <rmeyerriecks at digium.com>

diff --git a/dahdi_cfg.c b/dahdi_cfg.c
index 620383b..90bd466 100644
--- a/dahdi_cfg.c
+++ b/dahdi_cfg.c
@@ -29,6 +29,7 @@
 
 #include <stdio.h> 
 #include <getopt.h>
+#include <signal.h>
 #include <string.h>
 #include <stdarg.h>
 #include <stdlib.h>
@@ -1540,15 +1541,27 @@ static int span_restrict(char *str)
 	return 1;
 }
 
+static const char *SEM_NAME = "dahdi_cfg";
+static sem_t *lock = SEM_FAILED;
+
+static void signal_handler(int signal)
+{
+	if (SEM_FAILED != lock) {
+		sem_unlink(SEM_NAME);
+	}
+	/* The default handler should have been restored before this handler was
+	 * called, so we can let the "normal" processing finish the cleanup. */
+	raise(signal);
+}
+
 int main(int argc, char *argv[])
 {
 	int c;
 	char *buf;
 	char *key, *value;
 	int x,found;
-	sem_t *lock = SEM_FAILED;
-	const char *SEM_NAME = "dahdi_cfg";
 	int exit_code = 0;
+	struct sigaction act;
 
 	while((c = getopt(argc, argv, "fthc:vsd::C:S:")) != -1) {
 		switch(c) {
@@ -1670,6 +1683,19 @@ finish:
 		fflush(stdout);
 	}
 
+	sigemptyset(&act.sa_mask);
+	act.sa_handler = signal_handler;
+	act.sa_flags = SA_RESETHAND;
+
+	if (sigaction(SIGTERM, &act, NULL) == -1) {
+		perror("Failed to install SIGTERM handler.");
+		exit(1);
+	}
+	if (sigaction(SIGINT, &act, NULL) == -1) {
+		perror("Failed to install SIGINT handler.");
+		exit(1);
+	}
+
 	lock = sem_open(SEM_NAME, O_CREAT, O_RDWR, 1);
 	if (SEM_FAILED == lock) {
 		perror("Unable to create 'dahdi_cfg' mutex");

-----------------------------------------------------------------------


-- 
dahdi/tools.git



More information about the dahdi-commits mailing list