diff options
author | Michael Stapelberg <stapelberg@users.noreply.github.com> | 2018-08-08 19:14:15 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-08-08 19:14:15 +0200 |
commit | 5a54a1ab04e663940e8967eda8ad41f3314ad5a8 (patch) | |
tree | 6e203c00d89fd8b89dbc2f419b4f144a2cc03c50 /libi3 | |
parent | 3ea3935e6a64f38429c0e32522e14055aa0bccfa (diff) | |
parent | 37d0105c8328f718740c2ae9bae0dff87287a467 (diff) | |
download | i3-5a54a1ab04e663940e8967eda8ad41f3314ad5a8.tar.gz i3-5a54a1ab04e663940e8967eda8ad41f3314ad5a8.zip |
Merge pull request #3263 from orestisf1993/misbehaving-ipc-queue-2999
Kill misbehaving subscribed clients instead of hanging
Diffstat (limited to 'libi3')
-rw-r--r-- | libi3/safewrappers.c | 22 |
1 files changed, 20 insertions, 2 deletions
diff --git a/libi3/safewrappers.c b/libi3/safewrappers.c index 94ad4ee6..04bbda44 100644 --- a/libi3/safewrappers.c +++ b/libi3/safewrappers.c @@ -68,10 +68,9 @@ int sasprintf(char **strp, const char *fmt, ...) { ssize_t writeall(int fd, const void *buf, size_t count) { size_t written = 0; - ssize_t n = 0; while (written < count) { - n = write(fd, buf + written, count - written); + const ssize_t n = write(fd, buf + written, count - written); if (n == -1) { if (errno == EINTR || errno == EAGAIN) continue; @@ -83,6 +82,25 @@ ssize_t writeall(int fd, const void *buf, size_t count) { return written; } +ssize_t writeall_nonblock(int fd, const void *buf, size_t count) { + size_t written = 0; + + while (written < count) { + const ssize_t n = write(fd, buf + written, count - written); + if (n == -1) { + if (errno == EAGAIN) { + return written; + } else if (errno == EINTR) { + continue; + } else { + return n; + } + } + written += (size_t)n; + } + return written; +} + ssize_t swrite(int fd, const void *buf, size_t count) { ssize_t n; |