Index: pkgtools/pbulk/files/pbulk/pbuild/client.c
==================================================================
--- pkgtools/pbulk/files/pbulk/pbuild/client.c
+++ pkgtools/pbulk/files/pbulk/pbuild/client.c
@@ -82,10 +82,12 @@
 	if (recv_bytes == -1)
 		err(1, "Could not read from socket");
 	if (recv_bytes != 4)
 		errx(1, "Premature end while reading build info from socket");
 	build_info_len = ntohl(build_info_len);
+	if (build_info_len == 0)
+		exit(0);
 	if (build_info_len < 10 || build_info_len > 0xffffff)
 		errx(1, "Invalid build info length from master");
 
 	build_info = xmalloc(build_info_len + 1);
 	build_info[build_info_len] = '\0';

Index: pkgtools/pbulk/files/pbulk/pbuild/master.c
==================================================================
--- pkgtools/pbulk/files/pbulk/pbuild/master.c
+++ pkgtools/pbulk/files/pbulk/pbuild/master.c
@@ -68,10 +68,15 @@
 	char *buf;
 };
 
 static void	assign_job(void *);
 static void	recv_command(struct build_peer *);
+
+static void
+do_nothing(void *arg)
+{
+}
 
 static void
 kill_peer(void *arg)
 {
 	struct build_peer *peer = arg;
@@ -177,12 +182,16 @@
 	struct timeval tv;
 	struct build_peer *peer;
 
 	event_del(&listen_event);
 	(void)close(listen_event_socket);
-	LIST_FOREACH(peer, &inactive_peers, peer_link)
-		(void)shutdown(peer->fd, SHUT_RDWR);
+	LIST_FOREACH(peer, &inactive_peers, peer_link) {
+		uint32_t net_build_info_len = htonl(0);
+		(void)memcpy(peer->tmp_buf, &net_build_info_len, 4);
+		deferred_write(peer->fd, peer->tmp_buf, 4, peer, do_nothing,
+		    kill_peer);
+	}
 	tv.tv_sec = 1;
 	tv.tv_usec = 0;
 	event_loopexit(&tv);
 }
 

Index: pkgtools/pbulk/files/pbulk/pscan/client.c
==================================================================
--- pkgtools/pbulk/files/pbulk/pscan/client.c
+++ pkgtools/pbulk/files/pbulk/pscan/client.c
@@ -75,10 +75,12 @@
 	if (recv_bytes == 0) 
 		exit(0);
 	if (recv_bytes != 2)
 		errx(1, "Premature end while reading path length from socket");
 	path_len = ntohs(path_len);
+	if (path_len == 0)
+		exit(0);
 	if (path_len < 3)
 		errx(1, "Invalid path length from master");
 
 	path = xmalloc(path_len + 1);
 	path[path_len] = '\0';

Index: pkgtools/pbulk/files/pbulk/pscan/master.c
==================================================================
--- pkgtools/pbulk/files/pbulk/pscan/master.c
+++ pkgtools/pbulk/files/pbulk/pscan/master.c
@@ -68,10 +68,15 @@
 
 	size_t output_len;
 };
 
 static void	assign_job(struct scan_peer *);
+
+static void
+do_nothing(void *arg)
+{
+}
 
 static void
 kill_peer(void *arg)
 {
 	struct scan_peer *peer = arg;
@@ -154,12 +159,17 @@
 	struct timeval tv;
 	struct scan_peer *peer;
 
 	event_del(&listen_event);
 	(void)close(listen_event_socket);
-	LIST_FOREACH(peer, &inactive_peers, peer_link)
-		(void)shutdown(peer->fd, SHUT_RDWR);
+	LIST_FOREACH(peer, &inactive_peers, peer_link) {
+		uint16_t net_job_len = htons(0);
+		(void)memcpy(peer->tmp_buf, &net_job_len, 2);
+
+		deferred_write(peer->fd, peer->tmp_buf, 2, peer, do_nothing,
+		    kill_peer);
+	}
 	tv.tv_sec = 1;
 	tv.tv_usec = 0;
 	event_loopexit(&tv);
 }