Don't try to look offhook with channel banks & Loopstart (bug #2362), also make indiv...
authorMark Spencer <markster@digium.com>
Thu, 2 Sep 2004 20:45:24 +0000 (20:45 +0000)
committerMark Spencer <markster@digium.com>
Thu, 2 Sep 2004 20:45:24 +0000 (20:45 +0000)
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@3714 65c4cc65-6c06-0410-ace0-fbb531ad65f3

asterisk.c
channels/chan_zap.c
cli.c
include/asterisk/module.h
loader.c

index fc1d236..f84a738 100755 (executable)
@@ -446,7 +446,7 @@ static void hup_handler(int num)
        if (restartnow)
                execvp(_argv[0], _argv);
        /* XXX This could deadlock XXX */
        if (restartnow)
                execvp(_argv[0], _argv);
        /* XXX This could deadlock XXX */
-       ast_module_reload();
+       ast_module_reload(NULL);
 }
 
 static void child_handler(int sig)
 }
 
 static void child_handler(int sig)
index cafe99e..660c59c 100755 (executable)
@@ -6291,6 +6291,8 @@ static inline int available(struct zt_pvt *p, int channelmatch, int groupmatch,
 #endif
                if (!p->radio)
                {
 #endif
                if (!p->radio)
                {
+                       if (!p->sig || (p->sig == SIG_FXSLS))
+                               return 1;
                        /* Check hook state */
                        if (p->subs[SUB_REAL].zfd > -1)
                                res = ioctl(p->subs[SUB_REAL].zfd, ZT_GET_PARAMS, &par);
                        /* Check hook state */
                        if (p->subs[SUB_REAL].zfd > -1)
                                res = ioctl(p->subs[SUB_REAL].zfd, ZT_GET_PARAMS, &par);
@@ -6301,10 +6303,12 @@ static inline int available(struct zt_pvt *p, int channelmatch, int groupmatch,
                        }
                        if (res) {
                                ast_log(LOG_WARNING, "Unable to check hook state on channel %d\n", p->channel);
                        }
                        if (res) {
                                ast_log(LOG_WARNING, "Unable to check hook state on channel %d\n", p->channel);
-                       } else if ((p->sig == SIG_FXSKS) || (p->sig == SIG_FXSLS) ||
-                               (p->sig == SIG_FXSGS) || !p->sig) {
+                       } else if ((p->sig == SIG_FXSKS) || (p->sig == SIG_FXSGS)) {
                                /* When "onhook" that means no battery on the line, and thus
                                /* When "onhook" that means no battery on the line, and thus
-                                 it is out of service... */
+                                 it is out of service..., if it's on a TDM card... If it's a channel
+                                 bank, there is no telling... */
+                               if (par.rxbits > -1)
+                                       return 1;
                                if (par.rxisoffhook)
                                        return 1;
                                else
                                if (par.rxisoffhook)
                                        return 1;
                                else
diff --git a/cli.c b/cli.c
index 898c955..0aaf0d2 100755 (executable)
--- a/cli.c
+++ b/cli.c
@@ -109,9 +109,14 @@ static int handle_load(int fd, int argc, char *argv[])
 
 static int handle_reload(int fd, int argc, char *argv[])
 {
 
 static int handle_reload(int fd, int argc, char *argv[])
 {
-       if (argc != 1)
+       int x;
+       if (argc < 1)
                return RESULT_SHOWUSAGE;
                return RESULT_SHOWUSAGE;
-       ast_module_reload();
+       if (argc > 1) { 
+               for (x=1;x<argc;x++) 
+                       ast_module_reload(argv[x]);
+       } else
+               ast_module_reload(NULL);
        return RESULT_SUCCESS;
 }
 
        return RESULT_SUCCESS;
 }
 
index 83f44eb..87aa590 100755 (executable)
@@ -138,7 +138,7 @@ int ast_loader_unregister(int (*updater)(void));
  * This reloads all modules set to load in asterisk.  It does NOT run the unload
  * routine and then loads them again, it runs the given reload routine.
  */
  * This reloads all modules set to load in asterisk.  It does NOT run the unload
  * routine and then loads them again, it runs the given reload routine.
  */
-void ast_module_reload(void);
+void ast_module_reload(const char *name);
 
 int ast_register_atexit(void (*func)(void));
 void ast_unregister_atexit(void (*func)(void));
 
 int ast_register_atexit(void (*func)(void));
 void ast_unregister_atexit(void (*func)(void));
index c6a0ca2..d09514c 100755 (executable)
--- a/loader.c
+++ b/loader.c
@@ -3,9 +3,9 @@
  *
  * Module Loader
  * 
  *
  * Module Loader
  * 
- * Copyright (C) 1999, Mark Spencer
+ * Copyright (C) 1999-2004, Digium, Inc.
  *
  *
- * Mark Spencer <markster@linux-support.net>
+ * Mark Spencer <markster@digium.com>
  *
  * This program is free software, distributed under the terms of
  * the GNU General Public License
  *
  * This program is free software, distributed under the terms of
  * the GNU General Public License
@@ -147,7 +147,7 @@ int ast_unload_resource(char *resource_name, int force)
        return res;
 }
 
        return res;
 }
 
-void ast_module_reload(void)
+void ast_module_reload(const char *name)
 {
        struct module *m;
 
 {
        struct module *m;
 
@@ -166,10 +166,12 @@ void ast_module_reload(void)
        ast_mutex_lock(&modlock);
        m = module_list;
        while(m) {
        ast_mutex_lock(&modlock);
        m = module_list;
        while(m) {
-               if (m->reload) {
-                       if (option_verbose > 2) 
-                               ast_verbose(VERBOSE_PREFIX_3 "Reloading module '%s' (%s)\n", m->resource, m->description());
-                       m->reload();
+               if (!name || !strcasecmp(name, m->resource)) {
+                       if (m->reload) {
+                               if (option_verbose > 2) 
+                                       ast_verbose(VERBOSE_PREFIX_3 "Reloading module '%s' (%s)\n", m->resource, m->description());
+                               m->reload();
+                       }
                }
                m = m->next;
        }
                }
                m = m->next;
        }