Merge commit 'remotes/fml/master'
[paraslash.git] / fd.c
diff --git a/fd.c b/fd.c
index d90bd1a..48e2faf 100644 (file)
--- a/fd.c
+++ b/fd.c
 #include "para.h"
 #include "error.h"
 
+/*
+ * Write a buffer to a file descriptor, re-write on short writes.
+ *
+ * \param fd The file descriptor.
+ * \param buf The buffer to be sent.
+ * \param len The length of \a buf.
+ *
+ * \return Standard. In any case, the number of bytes that have been written is
+ * stored in \a len.
+ */
+int write_all(int fd, const char *buf, size_t *len)
+{
+       size_t total = *len;
+
+       assert(total);
+       *len = 0;
+       while (*len < total) {
+               int ret = write(fd, buf + *len, total - *len);
+               if (ret == -1)
+                       return -ERRNO_TO_PARA_ERROR(errno);
+               *len += ret;
+       }
+       return 1;
+}
+
 /**
  * Check whether a file exists.
  *
@@ -67,7 +92,7 @@ int para_select(int n, fd_set *readfds, fd_set *writefds,
  *
  * \return Standard.
  */
-int mark_fd_blocking(int fd)
+__must_check int mark_fd_blocking(int fd)
 {
        int flags = fcntl(fd, F_GETFL);
        if (flags < 0)
@@ -85,7 +110,7 @@ int mark_fd_blocking(int fd)
  *
  * \return Standard.
  */
-int mark_fd_nonblocking(int fd)
+__must_check int mark_fd_nonblocking(int fd)
 {
        int flags = fcntl(fd, F_GETFL);
        if (flags < 0)