static void finish_job(void *arg) { struct scan_peer *peer = arg; if (strlen(peer->job->scan_output) != peer->output_len) { warnx("Invalid output len received from peer"); kill_peer(peer); return; } LIST_REMOVE(peer, peer_link); process_job(peer->job, JOB_DONE); assign_job(peer); }
static void finish_job(void *arg) { struct build_peer *peer = arg; LIST_REMOVE(peer, peer_link); if (peer->tmp_buf[0] == 'D') process_job(peer->job, JOB_DONE, 1); else if (peer->tmp_buf[0] == 'F') process_job(peer->job, JOB_FAILED, 1); else kill_peer(peer); peer->job = NULL; recv_command(peer); peer = LIST_FIRST(&unassigned_peers); if (peer != NULL) assign_job(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); }
static void recv_output(void *arg) { struct scan_peer *peer = arg; uint32_t output_len; (void)memcpy(&output_len, peer->tmp_buf, 4); output_len = ntohl(output_len); if (output_len == 0) { LIST_REMOVE(peer, peer_link); process_job(peer->job, JOB_DONE); assign_job(peer); return; } if (output_len == 0xffffff) { warnx("Invalid output len received from peer"); kill_peer(peer); return; } peer->job->scan_output = xmalloc(output_len + 1); peer->job->scan_output[output_len] = '\0'; peer->output_len = output_len; deferred_read(peer->fd, peer->job->scan_output, output_len, peer, finish_job, kill_peer); }