static void assign_job(struct scan_peer *peer) { size_t job_len; uint16_t net_job_len; peer->job = clients_started ? get_job() : NULL; if (peer->job == NULL) { LIST_INSERT_HEAD(&inactive_peers, peer, peer_link); if (LIST_EMPTY(&active_peers) && clients_started) shutdown_master(); return; } LIST_INSERT_HEAD(&active_peers, peer, peer_link); peer->job->scan_output = NULL; job_len = strlen(peer->job->pkg_location); if (job_len > 0xffff) errx(1, "Location inside pkgsrc tree too long"); net_job_len = htons(job_len); (void)memcpy(peer->tmp_buf, &net_job_len, 2); deferred_write(peer->fd, peer->tmp_buf, 2, peer, send_job_path, kill_peer); }
static void send_build_stats(struct build_peer *peer) { struct build_stat st; uint32_t tmp; build_stats(&st); peer->buf = xmalloc(7 * 4); tmp = htonl(st.open_jobs); (void)memcpy(peer->buf, &tmp, 4); tmp = htonl(st.in_processing); (void)memcpy(peer->buf + 4, &tmp, 4); tmp = htonl(st.failed); (void)memcpy(peer->buf + 8, &tmp, 4); tmp = htonl(st.prefailed); (void)memcpy(peer->buf + 12, &tmp, 4); tmp = htonl(st.indirect_failed); (void)memcpy(peer->buf + 16, &tmp, 4); tmp = htonl(st.indirect_prefailed); (void)memcpy(peer->buf + 20, &tmp, 4); tmp = htonl(st.done); (void)memcpy(peer->buf + 24, &tmp, 4); deferred_write(peer->fd, peer->buf, 7 * 4, peer, sent_build_stats, kill_peer); }
static void send_build_info(void *arg) { struct build_peer *peer = arg; deferred_write(peer->fd, peer->job->begin, peer->job->end - peer->job->begin, peer, recv_status, kill_peer); }
static void send_job_path(void *arg) { struct scan_peer *peer = arg; deferred_write(peer->fd, peer->job->pkg_location, strlen(peer->job->pkg_location), peer, recv_output_len, kill_peer); }
static void assign_job(void *arg) { struct build_peer *peer = arg; size_t build_info_len; uint32_t net_build_info_len; if (peer->tmp_buf[0] == 'S') { send_build_stats(peer); return; } if (peer->tmp_buf[0] != 'G') { kill_peer(peer); return; } LIST_REMOVE(peer, peer_link); peer->job = get_job(); if (peer->job == NULL) { LIST_INSERT_HEAD(&unassigned_peers, peer, peer_link); if (LIST_EMPTY(&active_peers)) event_loopexit(NULL); return; } LIST_INSERT_HEAD(&active_peers, peer, peer_link); build_info_len = peer->job->end - peer->job->begin; if (build_info_len > 0xffffff) errx(1, "Build info too long"); net_build_info_len = htonl(build_info_len); (void)memcpy(peer->tmp_buf, &net_build_info_len, 4); deferred_write(peer->fd, peer->tmp_buf, 4, peer, send_build_info, kill_peer); peer = LIST_FIRST(&unassigned_peers); if (peer != NULL) assign_job(peer); }