aboutsummaryrefslogtreecommitdiff
path: root/libi3
diff options
context:
space:
mode:
authorMichael Stapelberg <stapelberg@users.noreply.github.com>2018-08-08 19:14:15 +0200
committerGitHub <noreply@github.com>2018-08-08 19:14:15 +0200
commit5a54a1ab04e663940e8967eda8ad41f3314ad5a8 (patch)
tree6e203c00d89fd8b89dbc2f419b4f144a2cc03c50 /libi3
parent3ea3935e6a64f38429c0e32522e14055aa0bccfa (diff)
parent37d0105c8328f718740c2ae9bae0dff87287a467 (diff)
downloadi3-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.c22
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;