loader: Add dependency fields to module structures.
[asterisk/asterisk.git] / res / res_agi.c
index 4660635..2d0dc27 100644 (file)
@@ -25,6 +25,7 @@
  */
 
 /*** MODULEINFO
+       <depend>res_speech</depend>
        <support_level>core</support_level>
  ***/
 
@@ -2045,7 +2046,7 @@ static int handle_connection(const char *agiurl, const struct ast_sockaddr addr,
        FastAGI defaults to port 4573 */
 static enum agi_result launch_netscript(char *agiurl, char *argv[], int *fds)
 {
-       int s = 0, flags;
+       int s = 0;
        char *host, *script;
        int num_addrs = 0, i = 0;
        struct ast_sockaddr *addrs;
@@ -2075,14 +2076,7 @@ static enum agi_result launch_netscript(char *agiurl, char *argv[], int *fds)
                        continue;
                }
 
-               if ((flags = fcntl(s, F_GETFL)) < 0) {
-                       ast_log(LOG_WARNING, "fcntl(F_GETFL) failed: %s\n", strerror(errno));
-                       close(s);
-                       continue;
-               }
-
-               if (fcntl(s, F_SETFL, flags | O_NONBLOCK) < 0) {
-                       ast_log(LOG_WARNING, "fnctl(F_SETFL) failed: %s\n", strerror(errno));
+               if (ast_fd_set_flags(s, O_NONBLOCK)) {
                        close(s);
                        continue;
                }
@@ -2248,9 +2242,8 @@ static enum agi_result launch_script(struct ast_channel *chan, char *script, int
                        close(toast[1]);
                        return AGI_RESULT_FAILURE;
                }
-               res = fcntl(audio[1], F_GETFL);
-               if (res > -1)
-                       res = fcntl(audio[1], F_SETFL, res | O_NONBLOCK);
+
+               res = ast_fd_set_flags(audio[1], O_NONBLOCK);
                if (res < 0) {
                        ast_log(LOG_WARNING, "unable to set audio pipe parameters: %s\n", strerror(errno));
                        close(fromast[0]);
@@ -4047,14 +4040,19 @@ static enum agi_result agi_handle_command(struct ast_channel *chan, AGI *agi, ch
 
        parse_args(buf, &argc, argv);
        c = find_command(argv, 0);
-       if (c && (!dead || (dead && c->dead))) {
-               /* if this command wasn't registered by res_agi, be sure to usecount
-               the module we are using */
-               if (c->mod != ast_module_info->self)
-                       ast_module_ref(c->mod);
+       if (!c || !ast_module_running_ref(c->mod)) {
+               ami_res = "Invalid or unknown command";
+               resultcode = 510;
+
+               ast_agi_send(agi->fd, chan, "%d %s\n", resultcode, ami_res);
+
+               publish_async_exec_end(chan, command_id, ami_cmd, resultcode, ami_res);
+
+               return AGI_RESULT_SUCCESS;
+       }
+
+       if (!dead || (dead && c->dead)) {
                res = c->handler(chan, agi, argc, argv);
-               if (c->mod != ast_module_info->self)
-                       ast_module_unref(c->mod);
                switch (res) {
                case RESULT_SHOWUSAGE:
                        ami_res = "Usage";
@@ -4101,21 +4099,15 @@ static enum agi_result agi_handle_command(struct ast_channel *chan, AGI *agi, ch
 
                        break;
                }
-       } else if (c) {
+       } else {
                ami_res = "Command Not Permitted on a dead channel or intercept routine";
                resultcode = 511;
 
                ast_agi_send(agi->fd, chan, "%d %s\n", resultcode, ami_res);
 
                publish_async_exec_end(chan, command_id, ami_cmd, resultcode, ami_res);
-       } else {
-               ami_res = "Invalid or unknown command";
-               resultcode = 510;
-
-               ast_agi_send(agi->fd, chan, "%d %s\n", resultcode, ami_res);
-
-               publish_async_exec_end(chan, command_id, ami_cmd, resultcode, ami_res);
        }
+       ast_module_unref(c->mod);
 
        return AGI_RESULT_SUCCESS;
 }
@@ -4713,6 +4705,10 @@ static int load_module(void)
                unload_module();
                return AST_MODULE_LOAD_DECLINE;
        }
+
+       /* For Optional API. */
+       ast_module_shutdown_ref(AST_MODULE_SELF);
+
        return AST_MODULE_LOAD_SUCCESS;
 }
 
@@ -4721,4 +4717,5 @@ AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_GLOBAL_SYMBOLS | AST_MODFLAG_LOAD_
        .load = load_module,
        .unload = unload_module,
        .load_pri = AST_MODPRI_APP_DEPEND,
+       .requires = "res_speech",
 );