Browse code

move TCP socket creation to shared/

git-svn: trunk@4769

Török Edvin authored on 2009/02/13 06:14:51
Showing 6 changed files
... ...
@@ -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