[Pkg-voip-commits] [dahdi-tools] 199/285: dahdi_cfg: Unlink semaphore on early exit.
tzafrir at debian.org
tzafrir at debian.org
Thu Jul 7 19:18:56 UTC 2016
This is an automated email from the git hooks/post-receive script.
tzafrir pushed a commit to branch master
in repository dahdi-tools.
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>
---
dahdi_cfg.c | 30 ++++++++++++++++++++++++++++--
1 file changed, 28 insertions(+), 2 deletions(-)
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");
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-voip/dahdi-tools.git
More information about the Pkg-voip-commits
mailing list