From edc8ea045a1b69b97591736c6028390daed283c5 Mon Sep 17 00:00:00 2001 From: Peter Hutterer Date: Fri, 13 Jun 2025 16:10:40 +1000 Subject: [PATCH] eis: don't warn about EPIPE, just debug-log it While it's not the friendliest way of a client to exit, we do need to expect clients to disconnect any time and that shouldn't trigger warnings, it's somewhat expected behavior. Part-of: --- src/libeis-client.c | 6 +++++- test/test-eis.c | 39 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+), 1 deletion(-) diff --git a/src/libeis-client.c b/src/libeis-client.c index 1620728..7af94dd 100644 --- a/src/libeis-client.c +++ b/src/libeis-client.c @@ -245,7 +245,11 @@ eis_client_send_message(struct eis_client *client, const struct brei_object *obj eis_client_queue_unsent(client, client->source, steal(&buf)); rc = 0; } else if (rc < 0){ - log_warn(eis, "failed to send message: %s", strerror(-rc)); + if (rc == -EPIPE) { + log_debug(eis, "failed to send message: %s", strerror(-rc)); + } else { + log_warn(eis, "failed to send message: %s", strerror(-rc)); + } source_remove(client->source); } } diff --git a/test/test-eis.c b/test/test-eis.c index 0dd32b9..9e1adab 100644 --- a/test/test-eis.c +++ b/test/test-eis.c @@ -24,8 +24,11 @@ #include "config.h" +#include "unistd.h" + #include "util-munit.h" #include "util-version.h" +#include "util-strings.h" #include "eierpecken.h" @@ -604,3 +607,39 @@ MUNIT_TEST(test_eis_ping) return MUNIT_OK; } + +MUNIT_TEST(eistest_ignore_EPIPE) +{ + _unref_(peck) *peck = peck_new(); + + peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_ACCEPT_CLIENT); + peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_DEFAULT_SEAT); + peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_HANDLE_BIND_SEAT); + peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_ADD_POINTER); + peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_RESUME_DEVICE); + peck_dispatch_until_stable(peck); + + peck_dispatch_until_stable(peck); + + /* Forcibly close the pipe */ + with_client(peck) { + int fd = peck_get_ei_fd(peck); + close(fd); + } + + with_server(peck) { + eis_log_set_priority(eis, EIS_LOG_PRIORITY_DEBUG); + peck_eis_enable_log_capture(peck); + /* Do something that tries to send a message to the client, doesn't matter what */ + eis_device_pause(peck_eis_get_default_pointer(peck)); + peck_eis_disable_log_capture(peck); + + char **warnings = peck_eis_get_log_capture(peck, EIS_LOG_PRIORITY_WARNING); + munit_assert_false(strv_find_substring(warnings, "Broken pipe", NULL)); + + char **debugs = peck_eis_get_log_capture(peck, EIS_LOG_PRIORITY_DEBUG); + munit_assert_true(strv_find_substring(debugs, "Broken pipe", NULL)); + } + + return MUNIT_OK; +}