Beispiel #1
0
static void read_client_command(uev_t *w, void *arg, int UNUSED(events))
{
	int              active = 1;
	ctrl_t          *ctrl = (ctrl_t *)arg;
	ssize_t          len;
	uint16_t         port, op, block;
	struct sockaddr *addr = (struct sockaddr *)&ctrl->client_sa;
	socklen_t        addr_len = sizeof(ctrl->client_sa);

	/* Reset inactivity timer. */
	uev_timer_set(&ctrl->timeout_watcher, INACTIVITY_TIMER, 0);

	memset(ctrl->buf, 0, ctrl->bufsz);
	len = recvfrom(ctrl->sd, ctrl->buf, ctrl->bufsz, 0, addr, &addr_len);
	if (-1 == len) {
		if (errno != EINTR)
			ERR(errno, "Failed reading command/status from client");

		uev_exit(w->ctx);
		return;
	}

	convert_address(&ctrl->client_sa, ctrl->clientaddr, sizeof(ctrl->clientaddr));
	port   = ntohs(((struct sockaddr_in *)addr)->sin_port);
	op     = ntohs(ctrl->th->th_opcode);
	block  = ntohs(ctrl->th->th_block);

	switch (op) {
	case RRQ:
		len -= ctrl->th->th_stuff - ctrl->buf;
		if (parse_RRQ(ctrl, ctrl->th->th_stuff, len)) {
			ERR(errno, "Failed parsing TFTP RRQ");
			active = 0;
			break;
		}
		DBG("tftp RRQ %s from %s:%d", ctrl->file, ctrl->clientaddr, port);
		active = handle_RRQ(ctrl);
		free(ctrl->file);
		break;

	case ERROR:
		DBG("tftp ERROR: %hd", ntohs(ctrl->th->th_code));
		active = 0;
		break;

	case ACK:
		DBG("tftp ACK, block # %hu", block);
		active = handle_ACK(ctrl, block);
		break;

	default:
		DBG("tftp opcode: %hd", op);
		DBG("tftp block#: %hu", block);
		break;
	}

	if (!active)
		uev_exit(w->ctx);
}
Beispiel #2
0
static void read_stdin(uev_t *w, void *arg, int UNUSED(events))
{
	char buf[512];
	size_t len;
	struct mbus_arg *marg = (struct mbus_arg *)arg;

	if (!fgets(buf, sizeof(buf), marg->fp)) {
		uev_exit(w->ctx);
		return;
	}

	len = sendto(marg->sd, buf, strlen(buf) - 1, 0, (struct sockaddr *)&sa, sizeof(sa));
	if (len != strlen(buf) - 1) {
		perror("Failed sendto()");
		uev_exit(w->ctx);
		return;
	}
}
Beispiel #3
0
static void read_socket(uev_t *w, void UNUSED(*arg), int UNUSED(events))
{
	char buf[512];
	size_t len;

	memset(buf, 0, sizeof(buf));
	len = recvfrom(w->fd, buf, sizeof(buf) - 1, 0, NULL, 0);
	if (len < 0) {
		perror("Failed recvfrom()");
		uev_exit(w->ctx);
		return;
	}

	buf[len + 1] = 0;
	puts(buf);
}
Beispiel #4
0
int wdt_exit(uev_ctx_t *ctx)
{
	/* Let plugins exit before we leave main loop */
	wdt_plugins_exit(ctx);

	/* Be nice, sync any buffered data to disk first. */
	sync();

	if (fd != -1) {
		INFO("Forced watchdog reboot.");
		wdt_set_timeout(1);
		close(fd);
	}

	/* Tell main() to loop until reboot ... */
	wait_reboot = 1;

	/* Leave main loop. */
	return uev_exit(ctx);
}
Beispiel #5
0
int wdt_close(uev_ctx_t *ctx)
{
	/* Let plugins exit before we leave main loop */
	wdt_plugins_exit(ctx);

	if (fd != -1) {
		if (magic) {
			INFO("Disabling HW watchdog timer before (safe) exit.");
			if (-1 == write(fd, "V", 1))
				PERROR("Failed disabling HW watchdog before exit, system will likely reboot now");
		} else {
			INFO("Exiting, watchdog still active.  Expect reboot!");
			/* Be nice, sync any buffered data to disk first. */
			sync();
		}

		close(fd);
	}

	/* Leave main loop. */
	return uev_exit(ctx);
}
Beispiel #6
0
static void cb(uev_t *w, void *arg, int events)
{
	if (UEV_ERROR == events)
		fprintf(stderr, "timer watcher failed, ignoring ...\n");

	fail_unless(w == &timer1);

	fail_unless(uev_timer_active(&timer2));
	fail_unless(!uev_timer_active(&timer3));
	fail_unless(uev_cron_active(&cron1));
	fail_unless(uev_cron_active(&cron2));

	uev_timer_stop(&timer2);
	uev_timer_stop(&cron2);

	fail_unless(!uev_timer_active(&timer2));
	fail_unless(!uev_cron_active(&cron2));

	/* Restart timer and see if we fail in uev_exit() */
	uev_timer_start(&timer2);

	uev_exit(w->ctx);
}