--- orig/asterisk-11.2.1/res/res_agi.c 2012-10-04 11:42:07.000000000 -0400 +++ asterisk-11.2.1/res/res_agi.c 2013-02-12 01:45:39.000000000 -0500 @@ -1448,11 +1448,14 @@ FastAGI defaults to port 4573 */ static enum agi_result launch_netscript(char *agiurl, char *argv[], int *fds) { - int s = 0, flags, res; + int s = 0, flags, res, port = AGI_PORT; struct pollfd pfds[1]; - char *host, *script; + char *host, *c, *script; int num_addrs = 0, i = 0; struct ast_sockaddr *addrs; + struct sockaddr_in addr_in; + struct hostent *hp; + struct ast_hostent ahp; /* agiurl is "agi://host.domain[:port][/script/name]" */ host = ast_strdupa(agiurl + 6); /* Remove agi:// */ @@ -1463,7 +1466,12 @@ } else { script = ""; } + if ((c = strchr(host, ':'))) { + *c++ = '\0'; + port = atoi(c); + } + /* if (!(num_addrs = ast_sockaddr_resolve(&addrs, host, 0, AST_AF_UNSPEC))) { ast_log(LOG_WARNING, "Unable to locate host '%s'\n", host); return AGI_RESULT_FAILURE; @@ -1509,6 +1517,36 @@ return AGI_RESULT_FAILURE; } + */ + + if (!(hp = ast_gethostbyname(host, &ahp))) { + ast_log(LOG_WARNING, "Unable to locate host '%s'\n", host); + return AGI_RESULT_FAILURE; + } + if ((s = socket(AF_INET, SOCK_STREAM, 0)) < 0) { + ast_log(LOG_WARNING, "Unable to create socket: %s\n", strerror(errno)); + return AGI_RESULT_FAILURE; + } + if ((flags = fcntl(s, F_GETFL)) < 0) { + ast_log(LOG_WARNING, "Fcntl(F_GETFL) failed: %s\n", strerror(errno)); + close(s); + return AGI_RESULT_FAILURE; + } + if (fcntl(s, F_SETFL, flags | O_NONBLOCK) < 0) { + ast_log(LOG_WARNING, "Fnctl(F_SETFL) failed: %s\n", strerror(errno)); + close(s); + return AGI_RESULT_FAILURE; + } + memset(&addr_in, 0, sizeof(addr_in)); + addr_in.sin_family = AF_INET; + addr_in.sin_port = htons(port); + memcpy(&addr_in.sin_addr, hp->h_addr, sizeof(addr_in.sin_addr)); + if (connect(s, (struct sockaddr *)&addr_in, sizeof(addr_in)) && (errno != EINPROGRESS)) { + ast_log(LOG_WARNING, "Connect failed with unexpected error: %s\n", strerror(errno)); + close(s); + return AGI_RESULT_FAILURE; + } + pfds[0].fd = s; pfds[0].events = POLLOUT; while ((res = ast_poll(pfds, 1, MAX_AGI_CONNECT)) != 1) {