int run_chassis_tbs(struct katcp_dispatch *d, struct katcp_arb *a, unsigned int mode) { struct input_event event; int rr, fd; fd = fileno_arb_katcp(d, a); if(mode & KATCP_ARB_READ){ rr = read(fd, &event, sizeof(struct input_event)); if(rr == sizeof(struct input_event)){ log_message_katcp(d, KATCP_LEVEL_TRACE, NULL, "input event type=%d, code=%d, value=%d", event.type, event.code, event.value); if(event.type == EV_KEY && (event.value > 0)){ switch(event.code){ case KEY_POWER : case KEY_SYSRQ : log_message_katcp(d, KATCP_LEVEL_WARN, NULL, "power button pressed, shutting down"); terminate_katcp(d, KATCP_EXIT_HALT); break; } } } } return 0; }
int write_event_tbs(struct katcp_dispatch *d, struct katcp_arb *a, int type, int code, int value) { int fd, result; struct input_event event; fd = fileno_arb_katcp(d, a); if(fd < 0){ log_message_katcp(d, KATCP_LEVEL_ERROR, NULL, "no valid file descriptor as event target"); return -1; } event.type = type; event.code = code; event.value = value; result = write(fd, &event, sizeof(struct input_event)); if(result == sizeof(struct input_event)){ return 0; } if(result < 0){ log_message_katcp(d, KATCP_LEVEL_ERROR, NULL, "event write failed: %s", strerror(errno)); } else { log_message_katcp(d, KATCP_LEVEL_ERROR, NULL, "logic problem, short event write"); } return -1; }
int accept_flat_katcp(struct katcp_dispatch *d, struct katcp_arb *a, unsigned int mode) { #define LABEL_BUFFER 32 int fd, nfd; unsigned int len; struct sockaddr_in sa; struct katcp_flat *f; struct katcp_listener *kl; char label[LABEL_BUFFER]; long opts; int result; result = 0; if(mode & KATCP_ARB_READ){ fd = fileno_arb_katcp(d, a); len = sizeof(struct sockaddr_in); nfd = accept(fd, (struct sockaddr *) &sa, &len); if(nfd < 0){ log_message_katcp(d, KATCP_LEVEL_TRACE, NULL, "accept on %s failed: %s", name_arb_katcp(d, a), strerror(errno)); return 0; } kl = data_arb_katcp(d, a); sane_listener_katcl(kl); if(kl->l_group == NULL){ log_message_katcp(d, KATCP_LEVEL_ERROR, NULL, "group needed for accept"); close(fd); return 0; } opts = fcntl(nfd, F_GETFL, NULL); if(opts >= 0){ opts = fcntl(nfd, F_SETFL, opts | O_NONBLOCK); } fcntl(nfd, F_SETFD, FD_CLOEXEC); snprintf(label, LABEL_BUFFER, "%s:%d", inet_ntoa(sa.sin_addr), ntohs(sa.sin_port)); label[LABEL_BUFFER - 1] = '\0'; log_message_katcp(d, KATCP_LEVEL_INFO, NULL, "accepted new connection from %s via %s", label, name_arb_katcp(d, a)); f = create_flat_katcp(d, nfd, KATCP_FLAT_TOCLIENT, label, kl->l_group); if(f == NULL){ close(nfd); } } if(mode & KATCP_ARB_STOP){ kl = data_arb_katcp(d, a); sane_listener_katcl(kl); release_listener_katcp(d, kl); } if(mode & KATCP_ARB_WRITE){ log_message_katcp(d, KATCP_LEVEL_FATAL, NULL, "listener callback called in mode 0x%x", mode); result = (-1); } return result; #undef LABEL_BUFFER }