/*
- * Copyright (C) 2005-2009 Andre Noll <maan@systemlinux.org>
+ * Copyright (C) 2005-2010 Andre Noll <maan@systemlinux.org>
*
* Licensed under the GPL v2. For licencing details see COPYING.
*/
#include <regex.h>
#include <sys/types.h>
#include <dirent.h>
+#include <stdbool.h>
#include "para.h"
#include "audiod.cmdline.h"
#include "list.h"
#include "sched.h"
#include "ggo.h"
+#include "buffer_tree.h"
#include "filter.h"
#include "grab_client.h"
#include "error.h"
#include "net.h"
#include "daemon.h"
#include "string.h"
+#include "write.h"
#include "fd.h"
#include "audiod_command_list.h"
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)
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;
}
}
/**
- * 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;