NEWS update.
[paraslash.git] / audiod_command.c
index b790fc15b1e3226950706bd1180210382792047b..eed9fc154c7191513c3e315a65fe552641823b1b 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2005-2009 Andre Noll <maan@systemlinux.org>
+ * Copyright (C) 2005-2011 Andre Noll <maan@systemlinux.org>
  *
  * Licensed under the GPL v2. For licencing details see COPYING.
  */
@@ -24,6 +24,7 @@
 #include "net.h"
 #include "daemon.h"
 #include "string.h"
+#include "write.h"
 #include "fd.h"
 #include "audiod_command_list.h"
 
@@ -192,18 +193,22 @@ __malloc static char *audiod_status_string(void)
 
 static int get_play_time_slot_num(void)
 {
-       int i, oldest = -1;
+       int i, oldest_slot = -1;
+       struct timeval oldest_wstime = {0, 0};
 
        FOR_EACH_SLOT(i) {
                struct slot_info *s = &slot[i];
-               if (!s->wng)
+               struct timeval wstime;
+               if (!s->wns)
                        continue;
-               if (oldest >= 0 && tv_diff(&s->wstime, &slot[oldest].wstime,
-                               NULL) > 0)
+               btr_get_node_start(s->wns[0].btrn, &wstime);
+               if (oldest_slot >= 0 && tv_diff(&wstime, &oldest_wstime, NULL) > 0)
                        continue;
-               oldest = i;
+               oldest_wstime = wstime;
+               oldest_slot = i;
        }
-       return oldest;
+       //PARA_CRIT_LOG("oldest slot: %d\n", oldest_slot);
+       return oldest_slot;
 }
 
 __malloc static char *decoder_flags(void)
@@ -216,9 +221,9 @@ __malloc static char *decoder_flags(void)
                char flag = '0';
                if (s->receiver_node)
                        flag += 1;
-               if (s->fc)
+               if (s->fns)
                        flag += 2;
-               if (s->wng)
+               if (s->wns)
                        flag += 4;
                flags[i] = flag;
        }
@@ -416,31 +421,32 @@ static int check_perms(uid_t uid)
 }
 
 /**
- * handle arriving connections on the local socket
+ * Handle arriving connections on the local socket.
  *
- * \param accept_fd the fd to call accept() on
+ * \param accept_fd The fd to accept connections on.
+ * \param rfds If \a accept_fd is not set in \a rfds, do nothing.
  *
- * This is called whenever para_audiod's main task detects an incoming
- * connection by the readability of \a accept_fd. This function reads the
- * command sent by the peer, checks the connecting user's permissions by using
- * unix socket credentials (if supported by the OS) and calls the corresponding
- * command handler if permissions are OK.
+ * This is called in each iteration of the select loop. If there is an incoming
+ * connection on \a accept_fd, this function reads the command sent by the peer,
+ * checks the connecting user's permissions by using unix socket credentials
+ * (if supported by the OS) and calls the corresponding command handler if
+ * permissions are OK.
  *
- * \return positive on success, negative on errors
+ * \return Positive on success, negative on errors, zero if there was no
+ * connection to accept.
  *
  * \sa para_accept(), recv_cred_buffer()
  * */
-int handle_connect(int accept_fd)
+int handle_connect(int accept_fd, fd_set *rfds)
 {
-       int i, argc, ret, clifd = -1;
+       int i, argc, ret, clifd;
        char buf[MAXLINE], **argv = NULL;
        struct sockaddr_un unix_addr;
        uid_t uid;
 
-       ret = para_accept(accept_fd, &unix_addr, sizeof(struct sockaddr_un));
-       if (ret < 0)
-               goto out;
-       clifd = ret;
+       ret = para_accept(accept_fd, rfds, &unix_addr, sizeof(struct sockaddr_un), &clifd);
+       if (ret <= 0)
+               return ret;
        ret = recv_cred_buffer(clifd, buf, sizeof(buf) - 1);
        if (ret < 0)
                goto out;