fix two bugs concerning blocking fds
[paraslash.git] / fd.c
diff --git a/fd.c b/fd.c
index b913009369ba6029fcdf4fa8378c9d926e30dd10..d53a3b4521fdbec1e16aa3263ba07f699feac40c 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 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.
  *
  *
  * \return The return value of the underlying select() call.
  *
@@ -56,11 +56,11 @@ int file_exists(const char *fn)
  * \sa select(2) select_tut(2)
  */
 int para_select(int n, fd_set *readfds, fd_set *writefds,
  * \sa select(2) select_tut(2)
  */
 int para_select(int n, fd_set *readfds, fd_set *writefds,
-               struct timeval *timeout)
+               struct timeval *timeout_tv)
 {
        int ret, err;
        do {
 {
        int ret, err;
        do {
-               ret = select(n, readfds, writefds, NULL, timeout);
+               ret = select(n, readfds, writefds, NULL, timeout_tv);
                err = errno;
        } while (ret < 0 && err == EINTR);
        if (ret < 0)
                err = errno;
        } while (ret < 0 && err == EINTR);
        if (ret < 0)
@@ -140,3 +140,29 @@ __must_check int para_fread(void *dest, size_t nbytes, size_t nmemb, FILE *strea
                return 0;
        return -E_FREAD;
 }
                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;
+}