PARA_ERROR(FGETS, "fgets error"), \
PARA_ERROR(EOF, "end of file"), \
PARA_ERROR(READ_PATTERN, "did not read expected pattern"), \
+ PARA_ERROR(SHORT_WRITE, "unexpected short write"), \
#define ALSA_WRITE_ERRORS \
#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.
*
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.
*