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