]> git.tuebingen.mpg.de Git - paraslash.git/blobdiff - fd.c
fd: Let write_all() return an error on short writes.
[paraslash.git] / fd.c
diff --git a/fd.c b/fd.c
index 830b15dad62f755ee75e1999b656d78a15890d10..01c7ed8e83552734b1077d444fc055f89f7695c9 100644 (file)
--- a/fd.c
+++ b/fd.c
 #include "string.h"
 #include "fd.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.
- */
-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 len;
-}
-
-/**
- * Send a buffer given by a format string.
- *
- * \param fd The file descriptor.
- * \param fmt A format string.
- *
- * \return Standard.
- */
-__printf_2_3 int write_va_buffer(int fd, const char *fmt, ...)
-{
-       char *msg;
-       int ret;
-
-       PARA_VSPRINTF(fmt, msg);
-       ret = write_buffer(fd, msg);
-       free(msg);
-       return ret;
-}
-
 /**
  * Write a buffer to a file descriptor, re-writing on short writes.
  *
@@ -109,6 +66,48 @@ int write_nonblock(int fd, const char *buf, size_t len)
        return written;
 }
 
+/**
+ * Write all data to a file descriptor.
+ *
+ * \param fd The file descriptor.
+ * \param buf The buffer to be sent.
+ * \param len The length of \a buf.
+ *
+ * This is like \ref write_nonblock() but returns \p -E_SHORT_WRITE if not
+ * all data could be written.
+ *
+ * \return Number of bytes written on success, negative error code else.
+ */
+int write_all(int fd, const char *buf, size_t len)
+{
+       int ret = write_nonblock(fd, buf, len);
+
+       if (ret < 0)
+               return ret;
+       if (ret != len)
+               return -E_SHORT_WRITE;
+       return ret;
+}
+
+/**
+ * Write a buffer given by a format string.
+ *
+ * \param fd The file descriptor.
+ * \param fmt A format string.
+ *
+ * \return The return value of the underlying call to \ref write_all().
+ */
+__printf_2_3 int write_va_buffer(int fd, const char *fmt, ...)
+{
+       char *msg;
+       int ret;
+
+       PARA_VSPRINTF(fmt, msg);
+       ret = write_buffer(fd, msg);
+       free(msg);
+       return ret;
+}
+
 /**
  * Read from a non-blocking file descriptor into multiple buffers.
  *