Handle UEV_HUP properly in examples and unit tests

If an I/O watcher callback fails to read(), returning zero, we check
events for UEV_HUP to detect EOF or socket remote end shutdown().

Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
This commit is contained in:
Joachim Nilsson committed 2017-11-14 12:56:39 +01:00
1 parent d52254b4ec
commit 2bea4192db
3 files changed
+21 -7

No files matched your search

+9 -1
View File
@@ -43,16 +43,24 @@ struct js_event {
*/ */
static void joystick_cb(uev_t *w, void *arg, int events) static void joystick_cb(uev_t *w, void *arg, int events)
{ {
ssize_t len;
if (UEV_ERROR == events) { if (UEV_ERROR == events) {
warnx("Spurious problem with the joystick watcher, restarting."); warnx("Spurious problem with the joystick watcher, restarting.");
uev_io_start(w); uev_io_start(w);
} }
if (read(w->fd, &e, sizeof(e)) < 0) { len = read(w->fd, &e, sizeof(e));
if (len < 0) {
warn("Failed reading joystick event"); warn("Failed reading joystick event");
return; return;
} }
if (len == 0 || UEV_HUP == events) {
warn("Joystick disconnected");
return;
}
switch (e.type) { switch (e.type) {
case 1: case 1:
printf("Button %d %s\n", e.number, e.value ? "pressed" : "released"); printf("Button %d %s\n", e.number, e.value ? "pressed" : "released");
+1 -1
View File
@@ -35,7 +35,7 @@ void process_stdin(uev_t *w, void *arg, int events)
return; return;
} }
if (len == 0) { if (len == 0 || UEV_HUP == events) {
warnx("Connection closed."); warnx("Connection closed.");
return; return;
} }
+11 -5
View File
@@ -72,7 +72,7 @@ static void signal_cb(uev_t *w, void *UNUSED(arg), int events)
static void pipe_read_cb(uev_t *w, void UNUSED(*arg), int events) static void pipe_read_cb(uev_t *w, void UNUSED(*arg), int events)
{ {
int cnt; int len;
char msg[50]; char msg[50];
if (UEV_ERROR == events) { if (UEV_ERROR == events) {
@@ -87,13 +87,19 @@ static void pipe_read_cb(uev_t *w, void UNUSED(*arg), int events)
uev_timer_set(watchdog, 1000, 0); uev_timer_set(watchdog, 1000, 0);
/* Here we can read() from in or w->fd, either works. */ /* Here we can read() from in or w->fd, either works. */
cnt = read(w->fd, msg, sizeof(msg)); len = read(w->fd, msg, sizeof(msg));
if (cnt < 0) { if (len < 0) {
perror(__func__); perror(__func__);
goto error; goto error;
} }
// fprintf(stderr, "READ %.*s %d\n", cnt, msg, cnt);
fprintf(stderr, "%.*s.%d ", cnt, msg, cnt); if (len == 0 || UEV_HUP == events) {
fprintf(stderr, "Other end of pipe closed, no more data\n");
return;
}
// fprintf(stderr, "READ %.*s %d\n", len, msg, len);
fprintf(stderr, "%.*s.%d ", len, msg, len);
} }
static void pipe_write_cb(uev_t *w, void *arg, int UNUSED(events)) static void pipe_write_cb(uev_t *w, void *arg, int UNUSED(events))