]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
Fix hostname guessing to work when some stupid DNS server resolves 0.0.0.0
authorAndrew Thompson <andrew@hijacked.us>
Sun, 29 Aug 2010 14:59:10 +0000 (10:59 -0400)
committerAndrew Thompson <andrew@hijacked.us>
Sun, 29 Aug 2010 14:59:10 +0000 (10:59 -0400)
Also, fix names containing a @ to work right

src/mod/event_handlers/mod_erlang_event/ei_helpers.c

index 45b655380b51590307e80de1b9931e308ccb4f9a..9935aff075422125f5c2dd20f850b1cbb01a6291 100644 (file)
@@ -327,6 +327,8 @@ switch_status_t initialise_ei(struct ei_cnode_s *ec)
        struct hostent *nodehost;
        char thishostname[EI_MAXHOSTNAMELEN + 1] = "";
        char thisnodename[MAXNODELEN + 1];
+       char thisalivename[MAXNODELEN + 1];
+       char *atsign;
 
        /* zero out the struct before we use it */
        memset(&server_addr, 0, sizeof(server_addr));
@@ -345,18 +347,23 @@ switch_status_t initialise_ei(struct ei_cnode_s *ec)
        server_addr.sin_family = AF_INET;
        server_addr.sin_port = htons(prefs.port);
 
-       if (strchr(prefs.nodename, '@')) {
+       /* copy the prefs.nodename into something we can modify */
+       strncpy(thisalivename, prefs.nodename, MAXNODELEN);
+
+       if ((atsign = strchr(thisalivename, '@'))) {
                /* we got a qualified node name, don't guess the host/domain */
                snprintf(thisnodename, MAXNODELEN + 1, "%s", prefs.nodename);
+               /* truncate the alivename at the @ */
+               *atsign = '\0';
        } else {
 #ifdef WIN32
                if ((nodehost = gethostbyaddr((const char *) &server_addr.sin_addr.s_addr, sizeof(server_addr.sin_addr.s_addr), AF_INET)))
 #else
-                       if ((nodehost = gethostbyaddr((const char *) &server_addr.sin_addr.s_addr, sizeof(server_addr.sin_addr.s_addr), AF_INET)))
+               if ((nodehost = gethostbyaddr((const char *) &server_addr.sin_addr.s_addr, sizeof(server_addr.sin_addr.s_addr), AF_INET)))
 #endif
-                               memcpy(thishostname, nodehost->h_name, EI_MAXHOSTNAMELEN);
+                       memcpy(thishostname, nodehost->h_name, EI_MAXHOSTNAMELEN);
 
-               if (zstr_buf(thishostname)) {
+               if (zstr_buf(thishostname) || !strncasecmp(prefs.ip, "0.0.0.0", 7)) {
                        gethostname(thishostname, EI_MAXHOSTNAMELEN);
                }
 
@@ -380,7 +387,7 @@ switch_status_t initialise_ei(struct ei_cnode_s *ec)
 
 
        /* init the ei stuff */
-       if (ei_connect_xinit(ec, thishostname, prefs.nodename, thisnodename, (Erl_IpAddr) (&server_addr.sin_addr.s_addr), prefs.cookie, 0) < 0) {
+       if (ei_connect_xinit(ec, thishostname, thisalivename, thisnodename, (Erl_IpAddr) (&server_addr.sin_addr.s_addr), prefs.cookie, 0) < 0) {
                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Failed to init ei connection\n");
                return SWITCH_STATUS_FALSE;
        }