#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.
*
* len indicates that some bytes have been written but the next write would
* block.
*/
-int write_nonblock(int fd, const char *buf, size_t len)
+int xwrite(int fd, const char *buf, size_t len)
{
size_t written = 0;
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 xwrite() 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 = xwrite(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.
*
* If \a rfds is not \p NULL and the (non-blocking) file descriptor \a fd is
* not set in \a rfds, this function returns early without doing anything.
* Otherwise The function tries to read up to \a sz bytes from \a fd. As for
- * write_nonblock(), EAGAIN is not considered an error condition. However, EOF
+ * xwrite(), EAGAIN is not considered an error condition. However, EOF
* is.
*
* \return Zero or a negative error code. If the underlying call to readv(2)
* have been read before the error occurred. In this case \a num_bytes is
* positive.
*
- * \sa \ref write_nonblock(), read(2), readv(2).
+ * \sa \ref xwrite(), read(2), readv(2).
*/
int readv_nonblock(int fd, struct iovec *iov, int iovcnt, fd_set *rfds,
size_t *num_bytes)