Hi,
On 1/11/06, Dale Blount <[EMAIL PROTECTED]> wrote:
> It (finally?) happened again, here's the debugging data I've collected
> so far. I've left it running incase you need me to attach gdb to it
> (please provide gdb commands you'd like me to run).
>
Having a look on the debug data you provided ...
I checked freshclam/manager.c from cvs and I think it hangs around
line 812 in function
int get_database(const char *dbfile, int socketfd, const char *file,
const char *hostname, const char *proxy, const char *user, const char
*pass)
code is
/* receive body and write it to disk */
while((bread = read(socketfd, buffer, FILEBUFF))) {
write(fd, buffer, bread);
if(!mprintf_quiet) {
mprintf("Downloading %s [%c]\r", dbfile, rotation[rot]);
fflush(stdout);
rot++;
rot %= 4;
}
}
the problem I see is, as long as the server does not close the
connection, _this_ won't quit, as there is no way to close the
connection clientside.
2 suggestions
a) poll() || select() to specify a timeout
this has to be added *everywhere* you recv() something.
b) setsockopt() & SO_RCVTIMEO
set a receive timeout, this will make sthe socket handle not receiving
data for a given period of time as an error.
this is pretty easy, and has to be done only once, I'd say after
connecting the socket
struct timeval Timeout = { 2, 500 };
if(setsockopt(hostfd, SOL_SOCKET, SO_RCVTIMEO, &Timeout, sizeof(Timeout)) < 0)
{
printf("could not set timeout for socket %i\n",hostfd);
}else
{
printf("set timeout on socket %i\n",hostfd);
}
If you got additional information, (gdb) we will be able to back this
up, or break it.
MfG
Markus Koetter
_______________________________________________
http://lurker.clamav.net/list/clamav-users.html