X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~mdw/git/disorder/blobdiff_plain/460b9539a7c15580e41a71bbc0f47ae776238915..ad2f8275a5fc0dba29ca97bc02342d1f1627e590:/clients/disorder.c diff --git a/clients/disorder.c b/clients/disorder.c index 46e2c2d..5817766 100644 --- a/clients/disorder.c +++ b/clients/disorder.c @@ -1,6 +1,6 @@ /* * This file is part of DisOrder. - * Copyright (C) 2004, 2005, 2006 Richard Kettlewell + * Copyright (C) 2004, 2005, 2006, 2007 Richard Kettlewell * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -34,6 +34,8 @@ #include #include #include +#include +#include #include "configuration.h" #include "syscalls.h" @@ -148,6 +150,8 @@ static void cf_shutdown(disorder_client *c, static void cf_reconfigure(disorder_client *c, char attribute((unused)) **argv) { + /* Re-check configuration for server */ + if(config_read(1)) fatal(0, "cannot read configuration"); if(disorder_reconfigure(c)) exit(EXIT_FAILURE); } @@ -375,6 +379,34 @@ static void cf_unset_global(disorder_client *c, char **argv) { if(disorder_unset_global(c, argv[0])) exit(EXIT_FAILURE); } +static int isarg_integer(const char *s) { + if(!*s) return 0; + while(*s) { + if(!isdigit((unsigned char)*s)) + return 0; + ++s; + } + return 1; +} + +static void cf_new(disorder_client *c, + char **argv) { + char **vec; + + if(disorder_new_tracks(c, &vec, 0, argv[0] ? atoi(argv[0]) : 0)) + exit(EXIT_FAILURE); + while(*vec) + xprintf("%s\n", nullcheck(utf82mb(*vec++))); +} + +static void cf_rtp_address(disorder_client *c, + char attribute((unused)) **argv) { + char *address, *port; + + if(disorder_rtp_address(c, &address, &port)) exit(EXIT_FAILURE); + xprintf("address: %s\nport: %s\n", address, port); +} + static const struct command { const char *name; int min, max; @@ -412,6 +444,8 @@ static const struct command { "Copy event log to stdout" }, { "move", 2, 2, cf_move, 0, "TRACK DELTA", "Move a track in the queue" }, + { "new", 0, 1, cf_new, isarg_integer, "[MAX]", + "Get the most recently added MAX tracks" }, { "part", 3, 3, cf_part, 0, "TRACK CONTEXT PART", "Find a track name part" }, { "pause", 0, 0, cf_pause, 0, "", @@ -441,6 +475,8 @@ static const struct command { "Resolve alias for TRACK" }, { "resume", 0, 0, cf_resume, 0, "", "Resume after a pause" }, + { "rtp-address", 0, 0, cf_rtp_address, 0, "", + "Report server's broadcast address" }, { "scratch", 0, 0, cf_scratch, 0, "", "Scratch the currently playing track" }, { "scratch-id", 1, 1, cf_scratch, 0, "ID", @@ -497,11 +533,13 @@ static void help_commands(void) { int main(int argc, char **argv) { int n, i, j; disorder_client *c = 0; - const char *s; int status = 0; struct vector args; - mem_init(1); + mem_init(); + /* garbage-collect PCRE's memory */ + pcre_malloc = xmalloc; + pcre_free = xfree; if(!setlocale(LC_CTYPE, "")) fatal(errno, "error calling setlocale"); while((n = getopt_long(argc, argv, "hVc:dHL", options, 0)) >= 0) { switch(n) { @@ -513,9 +551,8 @@ int main(int argc, char **argv) { default: fatal(0, "invalid option"); } } - if(config_read()) fatal(0, "cannot read configuration"); + if(config_read(0)) fatal(0, "cannot read configuration"); if(!(c = disorder_new(1))) exit(EXIT_FAILURE); - s = config_get_file("socket"); if(disorder_connect(c)) exit(EXIT_FAILURE); n = optind; /* accumulate command args */ @@ -551,4 +588,3 @@ c-basic-offset:2 comment-column:40 End: */ -/* arch-tag:0ff200f4c42e9b04dd781fa89c6129f6 */