Subject: pkg/37002: pkgtools/pbulk libexec/scan utility fails on Linux
To: None <pkg-manager@netbsd.org, gnats-admin@netbsd.org,>
From: None <cheusov@tut.by>
List: pkgsrc-bugs
Date: 09/18/2007 16:20:00
>Number: 37002
>Category: pkg
>Synopsis: pkgtools/pbulk libexec/scan utility fails on Linux
>Confidential: no
>Severity: serious
>Priority: medium
>Responsible: pkg-manager
>State: open
>Class: sw-bug
>Submitter-Id: net
>Arrival-Date: Tue Sep 18 16:20:00 +0000 2007
>Originator: Aleksey Cheusov
>Release: Linux
>Organization:
home
>Environment:
Linux
>Description:
scan fails like this
pkgsrc-0:/# ( . /usr/pkg_pbulk/etc/pbulk.conf; /usr/pkg_pbulk/libexec/pbulk/scan; )
Scanning...
.................................................. 50/415
.................................................. 100/415
.................................................. 150/415
.................................................. 200/415
.................................................. 250/415
.................................................. 300/415
.................................................. 350/415
.................................................. 400/415
............... 415/415
Resolving...
Scanning...
pbulk-scan: Could not bind socket: Address already in use
pkgsrc-0:/#
This happens because bind(2) is called several times during a few seconds. Explanation is here (item 3) http://www.ibm.com/developerworks/linux/library/l-sockpit/index.html
>How-To-Repeat:
master_mode=yes
limited_list=/not_empty_file
>Fix:
Index: files/pbulk/pscan/master.c
===================================================================
RCS file: /cvsroot/pkgsrc/pkgtools/pbulk/files/pbulk/pscan/master.c,v
retrieving revision 1.4
diff -u -r1.4 master.c
--- files/pbulk/pscan/master.c 21 Jul 2007 15:36:36 -0000 1.4
+++ files/pbulk/pscan/master.c 18 Sep 2007 16:12:30 -0000
@@ -204,6 +204,7 @@
struct event listen_event;
struct sockaddr_in dst;
int fd;
+ int one = 1;
LIST_INIT(&active_peers);
LIST_INIT(&inactive_peers);
@@ -220,6 +221,8 @@
if (ioctl(fd, FIOCLEX, NULL) == -1)
err(1, "Could not set close-on-exec flag");
#endif
+ if (setsockopt (fd, SOL_SOCKET, SO_REUSEADDR, &one, sizeof (one)) == -1)
+ err(1, "Could not setsockopt");
if (bind(fd, (struct sockaddr *)&dst, sizeof(dst)) == -1)
err(1, "Could not bind socket");
if (listen(fd, 5) == -1)