Beispiel #1
0
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);
}
Beispiel #2
0
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);
}
Beispiel #3
0
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);
}
Beispiel #4
0
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);
}