fade: Print the mixer device.
[paraslash.git] / afs.c
diff --git a/afs.c b/afs.c
index 40ef7ad..2b748f2 100644 (file)
--- a/afs.c
+++ b/afs.c
@@ -857,37 +857,42 @@ static int execute_server_command(fd_set *rfds)
        return open_next_audio_file();
 }
 
-static void execute_afs_command(int fd, uint32_t expected_cookie)
+/* returns 0 if no data available, 1 else */
+static int execute_afs_command(int fd, fd_set *rfds, uint32_t expected_cookie)
 {
        uint32_t cookie;
        int query_shmid;
        char buf[sizeof(cookie) + sizeof(query_shmid)];
-       int ret = recv_bin_buffer(fd, buf, sizeof(buf));
+       size_t n;
+       int ret = read_nonblock(fd, buf, sizeof(buf), rfds, &n);
 
        if (ret < 0)
                goto err;
-       if (ret != sizeof(buf)) {
+       if (n == 0)
+               return 0;
+       if (n != sizeof(buf)) {
                PARA_NOTICE_LOG("short read (%d bytes, expected %lu)\n",
                        ret, (long unsigned) sizeof(buf));
-               return;
+               return 1;
        }
        cookie = *(uint32_t *)buf;
        if (cookie != expected_cookie) {
-               PARA_NOTICE_LOG("received invalid cookie(got %u, expected %u)\n",
+               PARA_NOTICE_LOG("received invalid cookie (got %u, expected %u)\n",
                        (unsigned)cookie, (unsigned)expected_cookie);
-               return;
+               return 1;
        }
        query_shmid = *(int *)(buf + sizeof(cookie));
        if (query_shmid < 0) {
                PARA_WARNING_LOG("received invalid query shmid %d)\n",
                        query_shmid);
-               return;
+               return 1;
        }
        ret = call_callback(fd, query_shmid);
        if (ret >= 0)
-               return;
+               return 1;
 err:
        PARA_NOTICE_LOG("%s\n", para_strerror(-ret));
+       return 1;
 }
 
 /** Shutdown connection if query has not arrived until this many seconds. */
@@ -908,9 +913,8 @@ static void command_post_select(struct sched *s, struct task *t)
        }
        /* Check the list of connected clients. */
        list_for_each_entry_safe(client, tmp, &afs_client_list, node) {
-               if (FD_ISSET(client->fd, &s->rfds))
-                       execute_afs_command(client->fd, ct->cookie);
-               else { /* prevent bogus connection flooding */
+               ret = execute_afs_command(client->fd, &s->rfds, ct->cookie);
+               if (ret == 0) { /* prevent bogus connection flooding */
                        struct timeval diff;
                        tv_diff(now, &client->connect_time, &diff);
                        if (diff.tv_sec < AFS_CLIENT_TIMEOUT)