Packages
nerves_runtime
0.11.9
0.13.13
0.13.12
0.13.11
retired
0.13.10
0.13.9
0.13.8
0.13.7
0.13.6
0.13.5
0.13.4
0.13.3
0.13.2
0.13.1
0.13.0
0.12.0
0.11.10
0.11.9
0.11.8
0.11.7
0.11.6
0.11.5
0.11.4
0.11.3
0.11.2
0.11.1
0.11.0
0.10.3
0.10.2
0.10.1
0.10.0
retired
0.9.5
0.9.4
0.9.3
0.9.2
0.9.1
0.9.0
0.8.0
0.7.0
0.6.5
0.6.4
0.6.3
0.6.2
0.6.1
0.6.0
0.5.3
0.5.2
0.5.1
0.5.0
0.4.4
0.4.3
0.4.2
0.4.1
0.4.0
0.3.1
0.3.0
0.2.0
0.1.2
0.1.1
0.1.0
Small, general runtime utilities for Nerves devices
Current section
Files
Jump to
Current section
Files
src/kmsg_tailer.c
#include <err.h>
#include <errno.h>
#include <fcntl.h>
#include <poll.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <unistd.h>
#define KMSG_PATH "/dev/kmsg"
#define BUFFER_SIZE 4096
static void handle_kmsg(int fd)
{
char buffer[BUFFER_SIZE];
ssize_t amt = read(fd, buffer, sizeof(buffer));
if (amt < 0 && errno != EINTR)
err(EXIT_FAILURE, "read %s", KMSG_PATH);
while (amt > 0) {
ssize_t written = write(STDOUT_FILENO, buffer, amt);
if (written < 0 && errno != EINTR)
err(EXIT_FAILURE, "write stdout");
amt -= written;
}
}
int kmsg_tailer_main(int argc, char *argv[])
{
(void) argc;
(void) argv;
int fd = open(KMSG_PATH, O_RDONLY | O_CLOEXEC);
if (fd < 0)
err(EXIT_FAILURE, "open %s", KMSG_PATH);
for (;;) {
struct pollfd fdset[2];
fdset[0].fd = fd;
fdset[0].events = POLLIN;
fdset[0].revents = 0;
fdset[1].fd = STDIN_FILENO;
fdset[1].events = POLLIN;
fdset[1].revents = 0;
int rc = poll(fdset, 2, -1);
if (rc < 0) {
// Retry if EINTR
if (errno == EINTR)
continue;
err(EXIT_FAILURE, "poll");
}
if (fdset[0].revents & (POLLIN | POLLHUP))
handle_kmsg(fd);
// Any notification from Erlang is to exit
if (fdset[1].revents & (POLLIN | POLLHUP))
break;
}
return 0;
}