git-svn: trunk@4769
Török Edvin authored on 2009/02/13 06:14:51... | ... |
@@ -1,3 +1,8 @@ |
1 |
+Thu Feb 12 23:07:51 EET 2009 (edwin) |
|
2 |
+------------------------------------ |
|
3 |
+ * clamd/clamd.c, clamd/tcpserver.c, clamdscan/client.c, |
|
4 |
+ shared/misc.c, shared/misc.h: move TCP socket creation to shared/ |
|
5 |
+ |
|
1 | 6 |
Thu Feb 12 22:33:30 EET 2009 (edwin) |
2 | 7 |
------------------------------------ |
3 | 8 |
* clamd/clamd.c, clamd/server-th.c: Unify error paths. Remove unix |
... | ... |
@@ -477,15 +477,16 @@ int main(int argc, char **argv) |
477 | 477 |
logg("*Closing the main socket%s.\n", (nlsockets > 1) ? "s" : ""); |
478 | 478 |
|
479 | 479 |
for (i = 0; i < nlsockets; i++) { |
480 |
- closesocket(socketds[i]); |
|
480 |
+ closesocket(lsockets[i]); |
|
481 | 481 |
} |
482 | 482 |
|
483 | 483 |
#ifndef C_OS2 |
484 |
- if(localsock && nlsockets) { |
|
484 |
+ if(nlsockets && localsock) { |
|
485 |
+ opt = optget(opts, "LocalSocket"); |
|
485 | 486 |
if(unlink(opt->strarg) == -1) |
486 | 487 |
logg("!Can't unlink the socket file %s\n", opt->strarg); |
487 | 488 |
else |
488 |
- logg("Socket file removed.\n"); |
|
489 |
+ logg("Socket file removed.\n"); |
|
489 | 490 |
} |
490 | 491 |
#endif |
491 | 492 |
|
... | ... |
@@ -56,26 +56,15 @@ |
56 | 56 |
|
57 | 57 |
int tcpserver(const struct optstruct *opts) |
58 | 58 |
{ |
59 |
- struct sockaddr_in server; |
|
60 |
- int sockfd, backlog; |
|
61 |
- const struct optstruct *taddr; |
|
62 |
- struct hostent he; |
|
63 |
- char *estr, buf[1024]; |
|
64 |
- int true = 1; |
|
65 |
- |
|
66 |
- memset((char *) &server, 0, sizeof(server)); |
|
67 |
- server.sin_family = AF_INET; |
|
68 |
- server.sin_port = htons(optget(opts, "TCPSocket")->numarg); |
|
69 |
- |
|
70 |
- if((taddr = optget(opts, "TCPAddr"))->enabled) { |
|
71 |
- if(r_gethostbyname(taddr->strarg, &he, buf, sizeof(buf)) == -1) { |
|
72 |
- logg("!TCP: r_gethostbyname(%s) error: %s\n", taddr->strarg, strerror(errno)); |
|
73 |
- return -1; |
|
74 |
- } |
|
75 |
- server.sin_addr = *(struct in_addr *) he.h_addr_list[0]; |
|
76 |
- } else |
|
77 |
- server.sin_addr.s_addr = INADDR_ANY; |
|
59 |
+ struct sockaddr_in server; |
|
60 |
+ int sockfd, backlog; |
|
61 |
+ struct hostent he; |
|
62 |
+ char *estr, buf[1024]; |
|
63 |
+ int true = 1; |
|
78 | 64 |
|
65 |
+ if (cfg_tcpsock(opts, &server, INADDR_ANY) == -1) { |
|
66 |
+ return -1; |
|
67 |
+ } |
|
79 | 68 |
|
80 | 69 |
if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) { |
81 | 70 |
estr = strerror(errno); |
... | ... |
@@ -93,6 +82,7 @@ int tcpserver(const struct optstruct *opts) |
93 | 93 |
closesocket(sockfd); |
94 | 94 |
return -1; |
95 | 95 |
} else { |
96 |
+ const struct optstruct *taddr = optget(opts, "TCPSocket"); |
|
96 | 97 |
if(taddr->enabled) |
97 | 98 |
logg("#TCP: Bound to address %s on port %u\n", taddr->strarg, optget(opts, "TCPSocket")->numarg); |
98 | 99 |
else |
... | ... |
@@ -103,23 +103,14 @@ static int isremote(const struct optstruct *opts) { |
103 | 103 |
} |
104 | 104 |
mainsa = (struct sockaddr *)&tcpsock; |
105 | 105 |
mainsasz = sizeof(tcpsock); |
106 |
- memset((void *)&tcpsock, 0, sizeof(tcpsock)); |
|
107 |
- tcpsock.sin_family = AF_INET; |
|
108 |
- tcpsock.sin_port = htons(opt->numarg); |
|
109 |
- if(!(opt = optget(clamdopts, "TCPAddr"))->enabled) { |
|
110 |
- tcpsock.sin_addr.s_addr = htonl(INADDR_LOOPBACK); |
|
106 |
+ |
|
107 |
+ if (cfg_tcpsock(clamdopts, &tcpsock, INADDR_LOOPBACK) == -1) { |
|
108 |
+ logg("!Can't lookup clamd hostname: %s.\n", strerror(errno)); |
|
111 | 109 |
optfree(clamdopts); |
112 |
- return 0; |
|
113 |
- } |
|
114 |
- he = gethostbyname(opt->strarg); |
|
115 |
- optfree(clamdopts); |
|
116 |
- if(!he) { |
|
117 |
- perror("gethostbyname()"); |
|
118 |
- logg("!Can't lookup clamd hostname.\n"); |
|
119 | 110 |
mainsa = NULL; |
120 | 111 |
return 0; |
121 | 112 |
} |
122 |
- tcpsock.sin_addr = *(struct in_addr *) he->h_addr_list[0]; |
|
113 |
+ optfree(clamdopts); |
|
123 | 114 |
memcpy((void *)&testsock, (void *)&tcpsock, sizeof(testsock)); |
124 | 115 |
testsock.sin_port = htons(INADDR_ANY); |
125 | 116 |
if(!(s = socket(testsock.sin_family, SOCK_STREAM, 0))) return 0; |
... | ... |
@@ -267,3 +267,25 @@ int match_regex(const char *filename, const char *pattern) |
267 | 267 |
return match; |
268 | 268 |
} |
269 | 269 |
#endif |
270 |
+ |
|
271 |
+int cfg_tcpsock(const struct optstruct *opts, struct sockaddr_in *tcpsock, in_addr_t defaultbind) |
|
272 |
+{ |
|
273 |
+ struct hostent *he; |
|
274 |
+ const struct optstruct *opt = optget(opts, "TCPSocket"); |
|
275 |
+ |
|
276 |
+ memset(tcpsock, 0, sizeof(*tcpsock)); |
|
277 |
+ tcpsock->sin_family = AF_INET; |
|
278 |
+ tcpsock->sin_port = htons(opt->numarg); |
|
279 |
+ |
|
280 |
+ if(!(opt = optget(opts, "TCPAddr"))->enabled) { |
|
281 |
+ tcpsock->sin_addr.s_addr = htonl(defaultbind); |
|
282 |
+ return 0; |
|
283 |
+ } |
|
284 |
+ he = gethostbyname(opt->strarg); |
|
285 |
+ if(!he) |
|
286 |
+ return -1; |
|
287 |
+ |
|
288 |
+ tcpsock->sin_addr = *(struct in_addr *) he->h_addr_list[0]; |
|
289 |
+ return 0; |
|
290 |
+} |
|
291 |
+ |
... | ... |
@@ -18,7 +18,8 @@ |
18 | 18 |
|
19 | 19 |
#ifndef __MISC_H |
20 | 20 |
#define __MISC_H |
21 |
- |
|
21 |
+#include <netdb.h> |
|
22 |
+#include <netinet/in.h> |
|
22 | 23 |
/* Maximum filenames under various systems - njh */ |
23 | 24 |
#ifndef NAME_MAX /* e.g. Linux */ |
24 | 25 |
# ifdef MAXNAMELEN /* e.g. Solaris */ |
... | ... |
@@ -36,4 +37,5 @@ int filecopy(const char *src, const char *dest); |
36 | 36 |
int daemonize(void); |
37 | 37 |
const char *get_version(void); |
38 | 38 |
int match_regex(const char *filename, const char *pattern); |
39 |
+int cfg_tcpsock(const struct optstruct *opts, struct sockaddr_in *server, in_addr_t defaultbind); |
|
39 | 40 |
#endif |