introduce para_fgets(), a wrapper for fgets()
[paraslash.git] / fd.c
diff --git a/fd.c b/fd.c
index 36b3769..d53a3b4 100644 (file)
--- a/fd.c
+++ b/fd.c
@@ -47,8 +47,8 @@ int file_exists(const char *fn)
  * \param n the highest-numbered descriptor in any of the two sets, plus 1
  * \param readfds fds that should be checked for readability
  * \param writefds fds that should be checked for writablility
- * \param timeout upper bound on the amount of time elapsed before select()
- *  returns
+ * \param timeout_tv upper bound on the amount of time elapsed before select()
+ * returns
  *
  * \return The return value of the underlying select() call.
  *
@@ -140,3 +140,29 @@ __must_check int para_fread(void *dest, size_t nbytes, size_t nmemb, FILE *strea
                return 0;
        return -E_FREAD;
 }
+/**
+* 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 (fgets(line, size, f))
+               return 1;
+       if (feof(f))
+               return 0;
+       if (!ferror(f))
+               return -E_FGETS;
+       if (errno != EINTR) {
+               PARA_ERROR_LOG("%s\n", strerror(errno));
+               return -E_FGETS;
+       }
+       clearerr(f);
+       goto again;
+}