xpp: waitfor_xpds: documentation
[dahdi/tools.git] / dahdi_cfg.c
index 620383b..30add83 100644 (file)
@@ -29,6 +29,7 @@
 
 #include <stdio.h> 
 #include <getopt.h>
+#include <signal.h>
 #include <string.h>
 #include <stdarg.h>
 #include <stdlib.h>
@@ -108,7 +109,7 @@ static int fiftysixkhdlc[DAHDI_MAX_CHANNELS];
 
 static int spans=0;
 
-static int fo_real = 1;
+static int dry_run = 0;
 
 static int verbose = 0;
 
@@ -761,7 +762,16 @@ static int chanconfig(char *keyword, char *args)
                        } else {
                                fprintf(stderr, "Huh? (%s)\n", keyword);
                        }
-                       if (is_digital)
+
+                       if (cc[x].sigtype != DAHDI_SIG_CAS &&
+                           cc[x].sigtype != DAHDI_SIG_DACS &&
+                           cc[x].sigtype != DAHDI_SIG_DACS_RBS) {
+                               if (NULL != idle) {
+                                       fprintf(stderr, "WARNING: idlebits are not valid on %s channels.\n", sig[x]);
+                               }
+                       }
+
+                       if (is_digital) 
                                chan2span[x] = current_span;
                        else
                                current_span = 0;
@@ -816,8 +826,9 @@ static int apply_fiftysix(void)
        int chanfd;
 
        for (x = 1; x < DAHDI_MAX_CHANNELS; x++) {
-               if (skip_channel(x))
+               if (skip_channel(x) || !cc[x].sigtype)
                        continue;
+
                chanfd = open("/dev/dahdi/channel", O_RDWR);
                if (chanfd == -1) {
                        fprintf(stderr, 
@@ -1540,15 +1551,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) {
@@ -1568,7 +1591,7 @@ int main(int argc, char *argv[])
                        force++;
                        break;
                case 't':
-                       fo_real = 0;
+                       dry_run = 1;
                        break;
                case 's':
                        stopmode = 1;
@@ -1661,15 +1684,28 @@ finish:
        if (verbose) {
                printconfig(fd);
        }
-       if (!fo_real) 
-               exit(0);
 
+       if (dry_run)
+               exit(0);
        
        if (debug & DEBUG_APPLY) {
                printf("About to open Master device\n");
                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");