]> git.ipfire.org Git - thirdparty/kmod.git/commitdiff
libkmod-util: add helper function to write to fd
authorLucas De Marchi <lucas.demarchi@profusion.mobi>
Mon, 16 Jan 2012 17:46:01 +0000 (15:46 -0200)
committerLucas De Marchi <lucas.demarchi@profusion.mobi>
Mon, 16 Jan 2012 18:05:46 +0000 (16:05 -0200)
libkmod/libkmod-util.c
libkmod/libkmod-util.h

index a681906a514e228ff0d0e1d3e5c2569d8862a825..7c2611b38e7acd37a5d25ea40f43cd85b77a5d79 100644 (file)
@@ -230,6 +230,31 @@ ssize_t read_str_safe(int fd, char *buf, size_t buflen)
        return done;
 }
 
+ssize_t write_str_safe(int fd, const char *buf, size_t buflen)
+{
+       size_t todo = buflen;
+       size_t done = 0;
+
+       do {
+               ssize_t r = write(fd, buf + done, todo);
+
+               if (r == 0)
+                       break;
+               else if (r > 0) {
+                       todo -= r;
+                       done += r;
+               } else {
+                       if (errno == EAGAIN || errno == EWOULDBLOCK ||
+                                                               errno == EINTR)
+                               continue;
+                       else
+                               return -errno;
+               }
+       } while (todo > 0);
+
+       return done;
+}
+
 int read_str_long(int fd, long *value, int base)
 {
        char buf[32], *end;
index e8ed5ad48169153a272da0713127aedc1f6026ff..c9a1a218b58bfc35163e89dad29f640e815fef58 100644 (file)
@@ -15,6 +15,7 @@ char *underscores(struct kmod_ctx *ctx, char *s) __attribute__((nonnull(1, 2)));
 void *memdup(const void *p, size_t n) __attribute__((nonnull(1)));
 
 ssize_t read_str_safe(int fd, char *buf, size_t buflen) __must_check __attribute__((nonnull(2)));
+ssize_t write_str_safe(int fd, const char *buf, size_t buflen) __attribute__((nonnull(2)));
 int read_str_long(int fd, long *value, int base) __must_check __attribute__((nonnull(2)));
 int read_str_ulong(int fd, unsigned long *value, int base) __must_check __attribute__((nonnull(2)));
 char *strchr_replace(char *s, int c, char r);