mirror of
https://github.com/troglobit/libuev.git
synced 2026-11-06 15:50:52 +00:00
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:
1 parent
d52254b4ec
commit
2bea4192db
3 files changed
+21
-7
No files matched your search
+9
-1
@@ -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
@@ -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
@@ -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))
|
||||||
|
|||||||
Reference in new issue
Block a user