Browse code

Add IPv6 support to freshclam when notifying clamd

Shawn Webb authored on 2014/01/27 06:29:45
Showing 1 changed files
... ...
@@ -50,7 +50,7 @@ clamd_connect (const char *cfgfile, const char *option)
50 50
     struct sockaddr_un server;
51 51
 #endif
52 52
 #ifdef HAVE_GETADDRINFO
53
-    struct addrinfo hints, *res;
53
+    struct addrinfo hints, *res, *p;
54 54
     char port[6];
55 55
     const char *addr;
56 56
     int ret;
... ...
@@ -61,7 +61,6 @@ clamd_connect (const char *cfgfile, const char *option)
61 61
     struct optstruct *opts;
62 62
     const struct optstruct *opt;
63 63
     int sockd;
64
-    const char *socktype;
65 64
 
66 65
 
67 66
     if ((opts = optparse (cfgfile, 0, NULL, 1, OPT_CLAMD, 0, NULL)) == NULL)
... ...
@@ -74,7 +73,6 @@ clamd_connect (const char *cfgfile, const char *option)
74 74
 #ifndef	_WIN32
75 75
     if ((opt = optget (opts, "LocalSocket"))->enabled)
76 76
     {
77
-        socktype = "UNIX";
78 77
         memset(&server, 0x00, sizeof(server));
79 78
         server.sun_family = AF_UNIX;
80 79
         strncpy (server.sun_path, opt->strarg, sizeof (server.sun_path));
... ...
@@ -104,57 +102,54 @@ clamd_connect (const char *cfgfile, const char *option)
104 104
 #endif
105 105
     if ((opt = optget (opts, "TCPSocket"))->enabled)
106 106
     {
107
-        socktype = "TCP";
108
-
109 107
 #ifdef HAVE_GETADDRINFO
110 108
         memset (&hints, 0, sizeof (hints));
111
-/*
112
-#ifdef SUPPORT_IPv6
113
-	hints.ai_family = AF_UNSPEC;
114
-#else
115
-*/
116
-        hints.ai_family = AF_INET;
109
+        hints.ai_family = AF_UNSPEC;
117 110
         hints.ai_socktype = SOCK_STREAM;
111
+        hints.ai_flags = AI_PASSIVE;
112
+
118 113
         snprintf (port, sizeof (port), "%u", (unsigned int) opt->numarg);
119 114
         port[5] = 0;
120 115
 
121
-        if ((opt = optget (opts, "TCPAddr"))->enabled)
122
-            addr = opt->strarg;
123
-        else
124
-            addr = NULL;
125
-
126
-        ret = getaddrinfo (addr, port, &hints, &res);
116
+        opt = optget(opts, "TCPAddr");
117
+        while (opt) {
118
+            ret = getaddrinfo (opt->strarg, port, &hints, &res);
127 119
 
128
-        if (ret)
129
-        {
130
-            logg ("!%s: Can't resolve hostname %s (%s)\n", option,
131
-                  addr ? addr : "",
132
-                  (ret ==
133
-                   EAI_SYSTEM) ? strerror (errno) : gai_strerror (ret));
134
-            optfree (opts);
135
-            return -1;
136
-        }
120
+            if (ret)
121
+            {
122
+                logg ("!%s: Can't resolve hostname %s (%s)\n", option,
123
+                      opt->strarg ? opt->strarg : "",
124
+                      (ret ==
125
+                       EAI_SYSTEM) ? strerror (errno) : gai_strerror (ret));
126
+                opt = opt->nextarg;
127
+                continue;
128
+            }
137 129
 
138
-        if ((sockd = socket (res->ai_family, SOCK_STREAM, 0)) < 0)
139
-        {
140
-            perror ("socket()");
141
-            logg ("!%s: Can't create TCP socket\n", option);
142
-            optfree (opts);
143
-            freeaddrinfo (res);
144
-            return -1;
145
-        }
130
+            for (p = res; p != NULL; p = p->ai_next) {
131
+                if ((sockd = socket (p->ai_family, p->ai_socktype, p->ai_protocol)) < 0)
132
+                {
133
+                    perror ("socket()");
134
+                    logg ("!%s: Can't create TCP socket to connect to %s\n", option, opt->strarg);
135
+                    continue;
136
+                }
137
+
138
+                if (connect (sockd, p->ai_addr, p->ai_addrlen) == -1)
139
+                {
140
+                    perror ("connect()");
141
+                    closesocket (sockd);
142
+                    logg ("!%s: Can't connect to clamd on %s:%s\n", option,
143
+                          addr ? addr : "localhost", port);
144
+                    continue;
145
+                }
146
+
147
+                optfree(opts);
148
+                freeaddrinfo(res);
149
+                return sockd;
150
+            }
146 151
 
147
-        if (connect (sockd, res->ai_addr, res->ai_addrlen) == -1)
148
-        {
149
-            perror ("connect()");
150
-            closesocket (sockd);
151
-            logg ("!%s: Can't connect to clamd on %s:%s\n", option,
152
-                  addr ? addr : "localhost", port);
153
-            optfree (opts);
154 152
             freeaddrinfo (res);
155
-            return -1;
153
+            opt = opt->nextarg;
156 154
         }
157
-        freeaddrinfo (res);
158 155
 
159 156
 #else /* IPv4 */
160 157