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); }
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; } }
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); }
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); }
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); }
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); }