/*
- * Copyright (C) 2005-2008 Andre Noll <maan@systemlinux.org>
+ * Copyright (C) 2005-2009 Andre Noll <maan@systemlinux.org>
*
* Licensed under the GPL v2. For licencing details see COPYING.
*/
#include "list.h"
#include "close_on_fork.h"
#include "sched.h"
+#include "ggo.h"
#include "filter.h"
#include "grab_client.cmdline.h"
#include "grab_client.h"
return make_message("%s: %s\n", status_item_list[SI_AUDIOD_STATUS], status);
}
-static struct timeval *wstime(void)
+static int get_play_time_slot_num(void)
{
- int i;
- struct timeval *max = NULL;
+ int i, oldest = -1;
+
FOR_EACH_SLOT(i) {
struct slot_info *s = &slot[i];
if (!s->wng)
continue;
- if (max && tv_diff(&s->wstime, max, NULL) <= 0)
+ if (oldest >= 0 && tv_diff(&s->wstime, &slot[oldest].wstime,
+ NULL) > 0)
continue;
- max = &s->wstime;
+ oldest = i;
}
- return max;
+ return oldest;
}
+
__malloc static char *decoder_flags(void)
{
int i;
return ret;
}
-int com_stat(int fd, __a_unused int argc, __a_unused char **argv)
+int com_stat(int fd, int argc, char **argv)
{
int i, ret;
char *buf = NULL;
- long unsigned mask = ~0LU;
+ uint64_t mask = 0;
+ const uint64_t one = 1;
if (argc > 1) {
- mask = 0;
for (i = 1; i < argc; i++) {
ret = stat_item_valid(argv[i]);
if (ret < 0)
return ret;
- mask |= (1 << ret);
- }
- }
- PARA_INFO_LOG("mask: 0x%lx\n", mask);
- if (mask & (1 << SI_PLAY_TIME)) {
- struct timeval *t = wstime();
- char *ts = get_time_string(t);
- if (ts) {
- ret = client_write(fd, ts);
- if (ret < 0)
- goto out;
- free(ts);
+ mask |= (one << ret);
}
- }
- if (mask & (1 << SI_AUDIOD_UPTIME)) {
- char *tmp, *us = uptime_str();
- tmp = make_message("%s: %s\n",
- status_item_list[SI_AUDIOD_UPTIME], us);
- free(us);
- ret = client_write(fd, tmp);
- if (ret < 0)
- goto out;
- free(tmp);
- }
- if (mask & (1 << SI_AUDIOD_STATUS)) {
- char *s = audiod_status_string();
- ret = client_write(fd, s);
- if (ret < 0)
- goto out;
- free(s);
- }
- if (mask & (1 << SI_DECODER_FLAGS)) {
- char *df = decoder_flags();
- ret = client_write(fd, df);
- if (ret < 0)
- goto out;
- free(df);
- }
+ } else
+ mask--; /* set all bits */
+ PARA_INFO_LOG("mask: 0x%llx\n", (long long unsigned)mask);
FOR_EACH_STATUS_ITEM(i) {
char *tmp, *v;
- if (!((1 << i) & mask))
+ if (!((one << i) & mask))
continue;
v = stat_item_values[i];
- tmp = make_message("%s%s%s", buf? buf: "",
- v? v : "", v? "\n" : "");
+ if (!v)
+ continue;
+ tmp = make_message("%s%s%s", buf? buf: "", v,
+ strrchr(v, '\n')? "" : "\n");
free(buf);
buf = tmp;
}
ret = client_write(fd, buf);
-out:
if (ret > 0)
ret = stat_client_add(fd, mask);
free(buf);
ret = check_perms(uid);
if (ret < 0)
goto out;
- ret = -E_INVALID_AUDIOD_CMD;
cmd = para_strdup(buf);
p = strchr(cmd, '\n');
if (!p)
*/
void audiod_status_dump(void)
{
- struct timeval *t = wstime();
+ int slot_num = get_play_time_slot_num();
char *old, *new, *tmp;
old = stat_item_values[SI_PLAY_TIME];
- new = get_time_string(t);
+ new = get_time_string(slot_num);
if (new) {
if (!old || strcmp(old, new)) {
free(old);
free(new);
}
- new = uptime_str();
+ tmp = uptime_str();
+ new = make_message("%s: %s\n", status_item_list[SI_AUDIOD_UPTIME],
+ tmp);
+ free(tmp);
old = stat_item_values[SI_AUDIOD_UPTIME];
if (!old || strcmp(old, new)) {
free(old);
- tmp = make_message("%s: %s\n",
- status_item_list[SI_AUDIOD_UPTIME], new);
- stat_client_write(tmp, SI_AUDIOD_UPTIME);
- free(tmp);
+ stat_client_write(new, SI_AUDIOD_UPTIME);
stat_item_values[SI_AUDIOD_UPTIME] = new;
} else
free(new);