Handle timing file descriptor properly with agents
authorMark Spencer <markster@digium.com>
Sat, 23 Aug 2003 02:11:44 +0000 (02:11 +0000)
committerMark Spencer <markster@digium.com>
Sat, 23 Aug 2003 02:11:44 +0000 (02:11 +0000)
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@1409 65c4cc65-6c06-0410-ace0-fbb531ad65f3

apps/app_queue.c
channel.c
channels/chan_agent.c

index 174bd0a..265c82d 100755 (executable)
@@ -817,7 +817,6 @@ static int try_calling(struct queue_ent *qe, char *options, char *announceoverri
                        res2 = ast_autoservice_start(qe->chan);
                        if (!res2)
                                res2 = ast_streamfile(peer, announce, peer->language);
-                       /* XXX Need a function to wait on *both* streams XXX */
                        if (!res2)
                                res2 = ast_waitstream(peer, "");
                        res2 |= ast_autoservice_stop(qe->chan);
index 85215f7..3ec67e2 100755 (executable)
--- a/channel.c
+++ b/channel.c
@@ -1542,7 +1542,6 @@ struct ast_channel *ast_request(char *type, int format, void *data)
                        if (chan->requester)
                                c = chan->requester(type, capabilities, data);
                        if (c) {
-//                             ast_device_state_changed(c->name);
                                if (c->_state == AST_STATE_DOWN) {
                                        manager_event(EVENT_FLAG_CALL, "Newchannel",
                                        "Channel: %s\r\n"
index 404862e..2893046 100755 (executable)
@@ -128,11 +128,18 @@ static struct agent_pvt {
        } \
 } while(0)
 
+/* Cleanup moves all the relevant FD's from the 2nd to the first, but retains things
+   properly for a timingfd XXX This might need more work if agents were logged in as agents or other
+   totally impractical combinations XXX */
+
 #define CLEANUP(ast, p) do { \
        int x; \
        if (p->chan) { \
-               for (x=0;x<AST_MAX_FDS;x++) \
-                       ast->fds[x] = p->chan->fds[x]; \
+               for (x=0;x<AST_MAX_FDS;x++) {\
+                       if (x != AST_MAX_FDS - 2) \
+                               ast->fds[x] = p->chan->fds[x]; \
+               } \
+               ast->fds[AST_MAX_FDS - 3] = p->chan->fds[AST_MAX_FDS - 2]; \
        } \
 } while(0)
 
@@ -247,7 +254,10 @@ static struct ast_frame  *agent_read(struct ast_channel *ast)
        CHECK_FORMATS(ast, p);
        if (p->chan) {
                p->chan->exception = ast->exception;
-               p->chan->fdno = ast->fdno;
+               if (ast->fdno == AST_MAX_FDS - 3)
+                       p->chan->fdno = AST_MAX_FDS - 2;
+               else
+                       p->chan->fdno = ast->fdno;
                f = ast_read(p->chan);
        } else
                f = &null_frame;