... | ... |
@@ -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 |
|