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); }