Cosmetics: Rename samplerate to sample_rate.
[paraslash.git] / fd.c
diff --git a/fd.c b/fd.c
index d56a31101ade30bd8790d8082f8a3be5f5b84004..978ada45de9211dc84363874682603d0d6d6e558 100644 (file)
--- a/fd.c
+++ b/fd.c
@@ -49,10 +49,6 @@ int write_all(int fd, const char *buf, size_t *len)
  * \param fd The file descriptor.
  * \param buf the buffer to write.
  * \param len the number of bytes of \a buf.
- * \param max_bytes_per_write Do not write more than that many bytes at once.
- *
- * If \a max_bytes_per_write is non-zero, do not send more than that many bytes
- * per write().
  *
  * EAGAIN is not considered an error condition.  For example CCID3 has a
  * sending wait queue which fills up and is emptied asynchronously. The EAGAIN
@@ -61,8 +57,7 @@ int write_all(int fd, const char *buf, size_t *len)
  *
  * \return Negative on errors, number of bytes written else.
  */
-int write_nonblock(int fd, const char *buf, size_t len,
-               size_t max_bytes_per_write)
+int write_nonblock(int fd, const char *buf, size_t len)
 {
        size_t written = 0;
        int ret = 0;
@@ -70,8 +65,6 @@ int write_nonblock(int fd, const char *buf, size_t len,
        while (written < len) {
                size_t num = len - written;
 
-               if (max_bytes_per_write && max_bytes_per_write < num)
-                       num = max_bytes_per_write;
                ret = write(fd, buf + written, num);
                if (ret < 0 && errno == EAGAIN)
                        return written;
@@ -178,23 +171,48 @@ int read_nonblock(int fd, void *buf, size_t sz, fd_set *rfds, size_t *num_bytes)
 }
 
 /**
- * Simple wrapper for readv().
+ * Read a buffer and check its content for a pattern.
  *
- * \param fd The file descriptor to read from.
- * \param iov Scatter/gather array used in readv().
- * \param iovcnt Number of elements in \a iov.
+ * \param fd The file descriptor to receive from.
+ * \param pattern The expected pattern.
+ * \param bufsize The size of the internal buffer.
+ * \param rfds Passed to read_nonblock().
  *
- * \return A negative error code on errors, the return value of the underlying
- * call to readv() otherwise.
+ * This function tries to read at most \a bufsize bytes from the non-blocking
+ * file descriptor \a fd. If at least \p strlen(\a pattern) bytes have been
+ * received, the beginning of the received buffer is compared with \a pattern,
+ * ignoring case.
  *
- * \sa readv(2).
+ * \return Positive if \a pattern was received, negative on errors, zero if no data
+ * was available to read.
+ *
+ * \sa \ref read_nonblock(), \sa strncasecmp(3).
  */
-int para_readv(int fd, struct iovec *iov, int iovcnt)
+int read_pattern(int fd, const char *pattern, size_t bufsize, fd_set *rfds)
 {
-       int ret = readv(fd, iov, iovcnt);
+       size_t n, len;
+       char *buf = para_malloc(bufsize + 1);
+       int ret = read_nonblock(fd, buf, bufsize, rfds, &n);
 
+       buf[n] = '\0';
        if (ret < 0)
-               return -ERRNO_TO_PARA_ERROR(errno);
+               goto out;
+       ret = 0;
+       if (n == 0)
+               goto out;
+       ret = -E_READ_PATTERN;
+       len = strlen(pattern);
+       if (n < len)
+               goto out;
+       if (strncasecmp(buf, pattern, len) != 0)
+               goto out;
+       ret = 1;
+out:
+       if (ret < 0) {
+               PARA_NOTICE_LOG("%s\n", para_strerror(-ret));
+               PARA_NOTICE_LOG("recvd %zu bytes: %s\n", n, buf);
+       }
+       free(buf);
        return ret;
 }