~ubuntu-branches/ubuntu/dapper/clamav/dapper-updates

1 by Stephen Gran
Import upstream version 0.73
1
/*
1.1.6 by Leonel Nunez
Import upstream version 0.92~dfsg
2
 *  Copyright (C) 2002 - 2005 Tomasz Kojm <tkojm@clamav.net>
1 by Stephen Gran
Import upstream version 0.73
3
 *
4
 *  This program is free software; you can redistribute it and/or modify
1.1.6 by Leonel Nunez
Import upstream version 0.92~dfsg
5
 *  it under the terms of the GNU General Public License version 2 as
6
 *  published by the Free Software Foundation.
1 by Stephen Gran
Import upstream version 0.73
7
 *
8
 *  This program is distributed in the hope that it will be useful,
9
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
10
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11
 *  GNU General Public License for more details.
12
 *
13
 *  You should have received a copy of the GNU General Public License
14
 *  along with this program; if not, write to the Free Software
1.1.6 by Leonel Nunez
Import upstream version 0.92~dfsg
15
 *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
16
 *  MA 02110-1301, USA.
1 by Stephen Gran
Import upstream version 0.73
17
 */
0.1.12 by Scott Kitterman
Import upstream version 0.92~dfsg
18
#ifdef        _MSC_VER
19
#include <windows.h>
20
#include <winsock.h>
21
#endif
22
1 by Stephen Gran
Import upstream version 0.73
23
24
#if HAVE_CONFIG_H
25
#include "clamav-config.h"
26
#endif
27
28
#ifdef BUILD_CLAMD
29
30
#include <stdio.h>
1.1.6 by Leonel Nunez
Import upstream version 0.92~dfsg
31
#ifdef	HAVE_UNISTD_H
1 by Stephen Gran
Import upstream version 0.73
32
#include <unistd.h>
1.1.6 by Leonel Nunez
Import upstream version 0.92~dfsg
33
#endif
1 by Stephen Gran
Import upstream version 0.73
34
#include <sys/types.h>
0.1.12 by Scott Kitterman
Import upstream version 0.92~dfsg
35
#ifndef	C_WINDOWS
1 by Stephen Gran
Import upstream version 0.73
36
#include <sys/socket.h>
37
#include <sys/un.h>
38
#include <netinet/in.h>
39
#include <arpa/inet.h>
40
#include <netdb.h>
1.1.6 by Leonel Nunez
Import upstream version 0.92~dfsg
41
#endif
1 by Stephen Gran
Import upstream version 0.73
42
#include <string.h>
43
0.1.3 by Stephen Gran
Import upstream version 0.95.1+dfsg
44
#include "shared/optparser.h"
1.1.6 by Leonel Nunez
Import upstream version 0.92~dfsg
45
#include "shared/output.h"
46
#include "notify.h"
47
0.1.12 by Scott Kitterman
Import upstream version 0.92~dfsg
48
#ifndef	C_WINDOWS
49
#define	closesocket(s)	close(s)
50
#endif
1 by Stephen Gran
Import upstream version 0.73
51
52
int notify(const char *cfgfile)
53
{
54
	char buff[20];
0.1.12 by Scott Kitterman
Import upstream version 0.92~dfsg
55
#ifndef	C_WINDOWS
1 by Stephen Gran
Import upstream version 0.73
56
	struct sockaddr_un server;
1.1.6 by Leonel Nunez
Import upstream version 0.92~dfsg
57
#endif
0.1.2 by Michael Meskes
Import upstream version 0.94.dfsg.2
58
#ifdef HAVE_GETADDRINFO
0.1.1 by Stephen Gran
Import upstream version 0.94.dfsg
59
	struct addrinfo hints, *res;
60
	char port[6];
61
	const char *addr;
62
	int ret;
63
#else
1 by Stephen Gran
Import upstream version 0.73
64
        struct sockaddr_in server2;
65
	struct hostent *he;
0.1.1 by Stephen Gran
Import upstream version 0.94.dfsg
66
#endif
0.1.3 by Stephen Gran
Import upstream version 0.95.1+dfsg
67
	struct optstruct *opts;
68
	const struct optstruct *opt;
1 by Stephen Gran
Import upstream version 0.73
69
	int sockd, bread;
1.1.6 by Leonel Nunez
Import upstream version 0.92~dfsg
70
	const char *socktype;
71
72
0.1.3 by Stephen Gran
Import upstream version 0.95.1+dfsg
73
    if((opts = optparse(cfgfile, 0, NULL, 1, OPT_CLAMD, 0, NULL)) == NULL) {
0.1.12 by Scott Kitterman
Import upstream version 0.92~dfsg
74
	logg("^Clamd was NOT notified: Can't find or parse configuration file %s\n", cfgfile);
1 by Stephen Gran
Import upstream version 0.73
75
	return 1;
76
    }
77
0.1.12 by Scott Kitterman
Import upstream version 0.92~dfsg
78
#ifndef	C_WINDOWS
0.1.3 by Stephen Gran
Import upstream version 0.95.1+dfsg
79
    if((opt = optget(opts, "LocalSocket"))->enabled) {
1 by Stephen Gran
Import upstream version 0.73
80
	socktype = "UNIX";
81
	server.sun_family = AF_UNIX;
0.1.3 by Stephen Gran
Import upstream version 0.95.1+dfsg
82
	strncpy(server.sun_path, opt->strarg, sizeof(server.sun_path));
0.1.1 by Stephen Gran
Import upstream version 0.94.dfsg
83
	server.sun_path[sizeof(server.sun_path)-1]='\0';
1 by Stephen Gran
Import upstream version 0.73
84
85
	if((sockd = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) {
0.1.3 by Stephen Gran
Import upstream version 0.95.1+dfsg
86
	    logg("^Clamd was NOT notified: Can't create socket endpoint for %s\n", opt->strarg);
1 by Stephen Gran
Import upstream version 0.73
87
	    perror("socket()");
0.1.3 by Stephen Gran
Import upstream version 0.95.1+dfsg
88
	    optfree(opts);
1 by Stephen Gran
Import upstream version 0.73
89
	    return 1;
90
	}
91
92
	if(connect(sockd, (struct sockaddr *) &server, sizeof(struct sockaddr_un)) < 0) {
1.1.6 by Leonel Nunez
Import upstream version 0.92~dfsg
93
	    closesocket(sockd);
0.1.3 by Stephen Gran
Import upstream version 0.95.1+dfsg
94
	    logg("^Clamd was NOT notified: Can't connect to clamd through %s\n", opt->strarg);
1 by Stephen Gran
Import upstream version 0.73
95
	    perror("connect()");
0.1.3 by Stephen Gran
Import upstream version 0.95.1+dfsg
96
	    optfree(opts);
1 by Stephen Gran
Import upstream version 0.73
97
	    return 1;
98
	}
99
1.1.6 by Leonel Nunez
Import upstream version 0.92~dfsg
100
    } else
101
#endif
0.1.3 by Stephen Gran
Import upstream version 0.95.1+dfsg
102
    if((opt = optget(opts, "TCPSocket"))->enabled) {
1 by Stephen Gran
Import upstream version 0.73
103
	socktype = "TCP";
0.1.1 by Stephen Gran
Import upstream version 0.94.dfsg
104
0.1.2 by Michael Meskes
Import upstream version 0.94.dfsg.2
105
#ifdef HAVE_GETADDRINFO
0.1.1 by Stephen Gran
Import upstream version 0.94.dfsg
106
	memset(&hints, 0, sizeof(hints));
0.1.2 by Michael Meskes
Import upstream version 0.94.dfsg.2
107
#ifdef SUPPORT_IPv6
0.1.1 by Stephen Gran
Import upstream version 0.94.dfsg
108
	hints.ai_family = AF_UNSPEC;
1 by Stephen Gran
Import upstream version 0.73
109
#else
0.1.2 by Michael Meskes
Import upstream version 0.94.dfsg.2
110
	hints.ai_family = AF_INET;
0.10.1 by Michael Tautschnig
Import upstream version 0.94.dfsg.1
111
#endif
0.1.1 by Stephen Gran
Import upstream version 0.94.dfsg
112
	hints.ai_socktype = SOCK_STREAM;
0.9.7 by Stephen Gran
Fix the changelog
113
	snprintf(port, 5, "%u", (unsigned int) opt->numarg);
0.1.1 by Stephen Gran
Import upstream version 0.94.dfsg
114
	port[5] = 0;
115
0.1.3 by Stephen Gran
Import upstream version 0.95.1+dfsg
116
	if((opt = optget(opts, "TCPAddr"))->enabled)
117
	    addr = opt->strarg;
0.1.1 by Stephen Gran
Import upstream version 0.94.dfsg
118
	else
119
	    addr = NULL;
120
121
	ret = getaddrinfo(addr, port, &hints, &res);
122
123
	if(ret) {
0.10.1 by Michael Tautschnig
Import upstream version 0.94.dfsg.1
124
	    perror("getaddrinfo()");
125
	    logg("^Clamd was NOT notified: Can't resolve hostname %s\n", addr ? addr : "");
0.1.3 by Stephen Gran
Import upstream version 0.95.1+dfsg
126
	    optfree(opts);
0.10.1 by Michael Tautschnig
Import upstream version 0.94.dfsg.1
127
	    return 1;
0.1.1 by Stephen Gran
Import upstream version 0.94.dfsg
128
	}
129
130
	if((sockd = socket(res->ai_family, SOCK_STREAM, 0)) < 0) {
131
	    perror("socket()");
0.10.1 by Michael Tautschnig
Import upstream version 0.94.dfsg.1
132
	    logg("^Clamd was NOT notified: Can't create TCP socket\n");
0.1.3 by Stephen Gran
Import upstream version 0.95.1+dfsg
133
	    optfree(opts);
0.1.1 by Stephen Gran
Import upstream version 0.94.dfsg
134
	    freeaddrinfo(res);
0.10.1 by Michael Tautschnig
Import upstream version 0.94.dfsg.1
135
	    return 1;
0.1.1 by Stephen Gran
Import upstream version 0.94.dfsg
136
	}
137
138
	if(connect(sockd, res->ai_addr, res->ai_addrlen) == -1) {
139
	    perror("connect()");
140
	    closesocket(sockd);
0.10.1 by Michael Tautschnig
Import upstream version 0.94.dfsg.1
141
	    logg("^Clamd was NOT notified: Can't connect to clamd on %s:%s\n", addr ? addr : "localhost", port);
0.1.3 by Stephen Gran
Import upstream version 0.95.1+dfsg
142
	    optfree(opts);
0.1.1 by Stephen Gran
Import upstream version 0.94.dfsg
143
	    freeaddrinfo(res);
0.10.1 by Michael Tautschnig
Import upstream version 0.94.dfsg.1
144
	    return 1;
0.1.1 by Stephen Gran
Import upstream version 0.94.dfsg
145
	}
146
	freeaddrinfo(res);
147
148
#else /* IPv4 */
149
1 by Stephen Gran
Import upstream version 0.73
150
	if((sockd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
0.1.12 by Scott Kitterman
Import upstream version 0.92~dfsg
151
	    logg("^Clamd was NOT notified: Can't create TCP socket\n");
1 by Stephen Gran
Import upstream version 0.73
152
	    perror("socket()");
0.1.3 by Stephen Gran
Import upstream version 0.95.1+dfsg
153
	    optfree(opts);
1 by Stephen Gran
Import upstream version 0.73
154
	    return 1;
155
	}
156
157
	server2.sin_family = AF_INET;
0.1.3 by Stephen Gran
Import upstream version 0.95.1+dfsg
158
	server2.sin_port = htons(opt->numarg);
1 by Stephen Gran
Import upstream version 0.73
159
0.1.3 by Stephen Gran
Import upstream version 0.95.1+dfsg
160
	if((opt = optget(opts, "TCPAddr"))->enabled) {
161
	    if((he = gethostbyname(opt->strarg)) == 0) {
1 by Stephen Gran
Import upstream version 0.73
162
		perror("gethostbyname()");
0.1.3 by Stephen Gran
Import upstream version 0.95.1+dfsg
163
		logg("^Clamd was NOT notified: Can't resolve hostname '%s'\n", opt->strarg);
164
		optfree(opts);
0.1.1 by Stephen Gran
Import upstream version 0.94.dfsg
165
		closesocket(sockd);
1 by Stephen Gran
Import upstream version 0.73
166
		return 1;
167
	    }
168
	    server2.sin_addr = *(struct in_addr *) he->h_addr_list[0];
169
	} else
170
	    server2.sin_addr.s_addr = inet_addr("127.0.0.1");
171
172
173
	if(connect(sockd, (struct sockaddr *) &server2, sizeof(struct sockaddr_in)) < 0) {
1.1.6 by Leonel Nunez
Import upstream version 0.92~dfsg
174
	    closesocket(sockd);
175
	    logg("^Clamd was NOT notified: Can't connect to clamd on %s:%d\n",
1 by Stephen Gran
Import upstream version 0.73
176
		    inet_ntoa(server2.sin_addr), ntohs(server2.sin_port));
177
	    perror("connect()");
0.1.3 by Stephen Gran
Import upstream version 0.95.1+dfsg
178
	    optfree(opts);
1 by Stephen Gran
Import upstream version 0.73
179
	    return 1;
180
	}
181
0.1.1 by Stephen Gran
Import upstream version 0.94.dfsg
182
#endif
183
1 by Stephen Gran
Import upstream version 0.73
184
    } else {
0.1.12 by Scott Kitterman
Import upstream version 0.92~dfsg
185
	logg("^Clamd was NOT notified: No socket specified in %s\n", cfgfile);
0.1.3 by Stephen Gran
Import upstream version 0.95.1+dfsg
186
	optfree(opts);
1 by Stephen Gran
Import upstream version 0.73
187
	return 1;
188
    }
189
0.1.12 by Scott Kitterman
Import upstream version 0.92~dfsg
190
    if(send(sockd, "RELOAD", 6, 0) < 0) {
191
	logg("^Clamd was NOT notified: Could not write to %s socket\n", socktype);
1 by Stephen Gran
Import upstream version 0.73
192
	perror("write()");
1.1.6 by Leonel Nunez
Import upstream version 0.92~dfsg
193
	closesocket(sockd);
0.12.1 by Michael Tautschnig
Import upstream version 0.95+dfsg
194
	optfree(opts);
1 by Stephen Gran
Import upstream version 0.73
195
	return 1;
196
    }
197
198
    /* TODO: Handle timeout */
199
    memset(buff, 0, sizeof(buff));
0.1.12 by Scott Kitterman
Import upstream version 0.92~dfsg
200
    if((bread = recv(sockd, buff, sizeof(buff), 0)) > 0)
1 by Stephen Gran
Import upstream version 0.73
201
	if(!strstr(buff, "RELOADING")) {
0.1.12 by Scott Kitterman
Import upstream version 0.92~dfsg
202
	    logg("^Clamd was NOT notified: Unknown answer from clamd: '%s'\n", buff);
1.1.6 by Leonel Nunez
Import upstream version 0.92~dfsg
203
	    closesocket(sockd);
0.12.1 by Michael Tautschnig
Import upstream version 0.95+dfsg
204
	    optfree(opts);
1 by Stephen Gran
Import upstream version 0.73
205
	    return 1;
206
	}
207
1.1.6 by Leonel Nunez
Import upstream version 0.92~dfsg
208
    closesocket(sockd);
1 by Stephen Gran
Import upstream version 0.73
209
    logg("Clamd successfully notified about the update.\n");
0.12.1 by Michael Tautschnig
Import upstream version 0.95+dfsg
210
    optfree(opts);
1 by Stephen Gran
Import upstream version 0.73
211
    return 0;
212
}
213
214
#endif