NEWS update.
[paraslash.git] / afs.c
diff --git a/afs.c b/afs.c
index 40ef7ad25e454f312a55a48699ca896b59da7171..0464eb77de8918f8b38d5a41c5a792212a271c5f 100644 (file)
--- a/afs.c
+++ b/afs.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2007-2010 Andre Noll <maan@systemlinux.org>
+ * Copyright (C) 2007-2011 Andre Noll <maan@systemlinux.org>
  *
  * Licensed under the GPL v2. For licencing details see COPYING.
  */
@@ -233,7 +233,7 @@ int send_callback_request(callback_function *f, struct osl_object *query,
        *(uint32_t *) buf = afs_socket_cookie;
        *(int *) (buf + sizeof(afs_socket_cookie)) = query_shmid;
 
-       ret = create_remote_socket(conf.afs_socket_arg);
+       ret = connect_local_socket(conf.afs_socket_arg);
        if (ret < 0)
                goto out;
        fd = ret;
@@ -468,7 +468,6 @@ again:
        }
        ret = open_and_update_audio_file(aft_row, score, &afd);
        if (ret < 0) {
-               PARA_ERROR_LOG("%s\n", para_strerror(-ret));
                ret = score_delete(aft_row);
                if (ret < 0) {
                        PARA_ERROR_LOG("%s\n", para_strerror(-ret));
@@ -857,37 +856,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 +912,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)
@@ -947,7 +950,7 @@ static void register_command_task(uint32_t cookie)
 
        ct->task.pre_select = command_pre_select;
        ct->task.post_select = command_post_select;
-       sprintf(ct->task.status, "command task");
+       sprintf(ct->task.status, "afs command task");
        register_task(&ct->task);
 }