filter_chain.c: Cosmetics.
[paraslash.git] / fd.c
diff --git a/fd.c b/fd.c
index 0adab0f..5885172 100644 (file)
--- a/fd.c
+++ b/fd.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2006-2007 Andre Noll <maan@systemlinux.org>
+ * Copyright (C) 2006-2008 Andre Noll <maan@systemlinux.org>
  *
  * Licensed under the GPL v2. For licencing details see COPYING.
  */
 #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)
@@ -129,16 +154,16 @@ void para_fd_set(int fd, fd_set *fds, int *max_fileno)
 }
 
 /**
-* Paraslash's wrapper for fgets(3).
-
-* \param line Pointer to the buffer to store the line.
-* \param size The size of the buffer given by \a line.
-* \param f The stream to read from.
-*
-* \return Unlike the standard fgets() function, an integer value
-* is returned. On success, this function returns 1. On errors, -E_FGETS
-* is returned. A zero return value indicates an end of file condition.
-*/
+ * Paraslash's wrapper for fgets(3).
+ *
+ * \param line Pointer to the buffer to store the line.
+ * \param size The size of the buffer given by \a line.
+ * \param f The stream to read from.
+ *
+ * \return Unlike the standard fgets() function, an integer value
+ * is returned. On success, this function returns 1. On errors, -E_FGETS
+ * is returned. A zero return value indicates an end of file condition.
+ */
 __must_check int para_fgets(char *line, int size, FILE *f)
 {
 again:
@@ -311,8 +336,7 @@ int para_mkdir(const char *path, mode_t mode)
  * open call is closed after mmap().  Otherwise the file is kept open and the
  * file descriptor is returned in \a fd_ptr.
  *
- * \return Positive on success, negative on errors. Possible errors include: \p
- * E_FSTAT, any errors returned by para_open(), \p E_EMPTY, \p E_MMAP.
+ * \return Standard.
  *
  * \sa para_open(), mmap(2).
  */
@@ -369,17 +393,19 @@ out:
  */
 int para_munmap(void *start, size_t length)
 {
+       int err;
        if (munmap(start, length) >= 0)
                return 1;
+       err = errno;
        PARA_ERROR_LOG("munmap (%p/%zu) failed: %s\n", start, length,
-               strerror(errno));
-       return -E_MUNMAP;
+               strerror(err));
+       return -ERRNO_TO_PARA_ERROR(err);
 }
 
 /**
- * check a file descriptor for writability
+ * Check a file descriptor for writability.
  *
- * \param fd the file descriptor
+ * \param fd The file descriptor.
  *
  * \return positive if fd is ready for writing, zero if it isn't, negative if
  * an error occurred.