I believe this is the wrong way of fixing this problem. To prove this,
consider the race condition betweens stat(), connect() and bind().
Have you tried the documented method?
Window 1:
$ perl -e 'use Socket; socket($s, PF_UNIX, SOCK_STREAM, 0) || die "socket: $!\n";
bind($s, sockaddr_un("/tmp/fun")) || die "bind: $!\n"; select(undef, undef, undef,
undef)'
... does not return ...
Window 2:
$ perl -e 'use Socket; socket($s, PF_UNIX, SOCK_STREAM, 0) || die "socket: $!\n";
bind($s, sockaddr_un("/tmp/fun")) || die "bind: $!\n"; select(undef, undef, undef,
undef)'
bind: Address already in use
This method is much easier, cleaner, contains no race conditions, etc.
Cheers,
mark
On Sun, Aug 24, 2003 at 07:38:16PM +0200, Thomas Lamy wrote:
> Tomasz Kojm wrote:
> >On Fri, 22 Aug 2003 22:23:00 +0200
> >Thomas Lamy <[EMAIL PROTECTED]> wrote:
> >
> >
> >>Tomasz Kojm wrote:
> >>
> >>>On Thu, 21 Aug 2003 11:40:29 -0400
> >>>"Travis Robertson" <[EMAIL PROTECTED]> wrote:
> >>>
> >>>
> >>>
> >>>>I have tried running clamd in local socket mode. The first time it
> >>>>runs everything is ok, it creates the /var/run/clamd/clamd.socket.
> >>>>Whenever I reboot the server and it trys to build the socket, I get
> >>>>the error "ERROR:
> >>>
> >>>
> >>>You should stop clamd cleanly - eg. by sending the SIGTERM signal.
> >>>
> >>>Best regards,
> >>>Tomasz Kojm
> >>
> >>What about the following pseudo-code at startup of clamd (instead of
> >>failing):
> >>
> >>if (file exists(UNIX_SOCKET)) {
> >> if (connect(UNIX_SOCKET) != ERROR) {
> >> die ("Socket already exists");
> >> }
> >> warn ("Socket already exists but is not connected - unclean
> >> shutdown?"); unlink (UNIX_SOCKET);
> >>}
> >
> >
> >OK, but this will be an option (something like FixSocket or so) in
> >clamav.conf.
> >
> Ok, the diff against snapshot 20030823 is attached. The new option is
> named "FixStaleSocket".
>
> Have fun
> Thomas
>
> diff -u -r clamav-devel-20030823.ORIG/clamd/cfgfile.c
> clamav-devel-20030823/clamd/cfgfile.c
> --- clamav-devel-20030823.ORIG/clamd/cfgfile.c 2003-08-06 05:05:51.000000000
> +0200
> +++ clamav-devel-20030823/clamd/cfgfile.c 2003-08-24 19:25:00.000000000 +0200
> @@ -63,6 +63,7 @@
> {"FollowFileSymlinks", OPT_NOARG},
> {"Foreground", OPT_NOARG},
> {"Debug", OPT_NOARG},
> + {"FixStaleSocket", OPT_NOARG},
> {"User", OPT_STR},
> {"AllowSupplementaryGroups", OPT_NOARG},
> {"SelfCheck", OPT_NUM},
> diff -u -r clamav-devel-20030823.ORIG/clamd/localserver.c
> clamav-devel-20030823/clamd/localserver.c
> --- clamav-devel-20030823.ORIG/clamd/localserver.c 2003-07-29 17:48:08.000000000
> +0200
> +++ clamav-devel-20030823/clamd/localserver.c 2003-08-24 19:31:01.000000000 +0200
> @@ -50,13 +50,24 @@
> exit(1);
> }
>
> - if(bind(sockfd, (struct sockaddr *) &server, sizeof(struct sockaddr_un)) == -1)
> {
> - if(stat(server.sun_path, &foo) != -1) {
> - //fprintf(stderr, "ERROR: Socket file %s already exists. Please remove it
> or use another one.\n", server.sun_path);
> - logg("!Socket file %s already exists. Please remove it or use another
> one.\n", server.sun_path);
> + if (stat(server.sun_path, &foo) != -1) {
> + logg("Warning: Socket file %s already exists\n", server.sun_path);
> + if((cpt = cfgopt(copt, "FixStaleSocket"))) {
> + if(connect(sockfd, (struct sockaddr *) &server, sizeof(struct
> sockaddr_un)) >= 0) {
> + logg("Fatal: another instance of clamd seems to listen on %s;
> exiting.\n", server.sun_path);
> + close(sockfd);
> + exit(1);
> + } else {
> + logg("Warning: unclean shutdown, removing %s\n", server.sun_path);
> + unlink (server.sun_path);
> + }
> + } else {
> + logg("Please remove it or use another one.\n");
> exit(1);
> }
> + }
>
> + if(bind(sockfd, (struct sockaddr *) &server, sizeof(struct sockaddr_un)) == -1)
> {
> estr = strerror(errno);
> //fprintf(stderr, "ERROR: can't bind(): %s\n", estr);
> logg("!bind() error: %s\n", estr);
--
[EMAIL PROTECTED]/[EMAIL PROTECTED]/[EMAIL PROTECTED] __________________________
. . _ ._ . . .__ . . ._. .__ . . . .__ | Neighbourhood Coder
|\/| |_| |_| |/ |_ |\/| | |_ | |/ |_ |
| | | | | \ | \ |__ . | | .|. |__ |__ | \ |__ | Ottawa, Ontario, Canada
One ring to rule them all, one ring to find them, one ring to bring them all
and in the darkness bind them...
http://mark.mielke.cc/
-------------------------------------------------------
This SF.net email is sponsored by: VM Ware
With VMware you can run multiple operating systems on a single machine.
WITHOUT REBOOTING! Mix Linux / Windows / Novell virtual machines
at the same time. Free trial click here:http://www.vmware.com/wl/offer/358/0
_______________________________________________
Clamav-users mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/clamav-users