#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.
*
}
/**
-* 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:
if (*dir)
return 1;
ret = -ERRNO_TO_PARA_ERROR(errno);
-/* Ignore return value of fchdir() and close(). We're busted anyway. */
- if (cwd)
- fchdir(*cwd);
+ /* Ignore return value of fchdir() and close(). We're busted anyway. */
+ if (cwd) {
+ int __a_unused ret2 = fchdir(*cwd); /* STFU, gcc */
+ }
close_cwd:
if (cwd)
close(*cwd);
*/
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.