X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=audiod_command.c;h=3bb94ad60a8a1079659105b792068e71045c9e01;hp=312cfee1027f21f48291d520c7ee746e7671292d;hb=974c42fd818babdfd2590df59b2a74a80398e826;hpb=c715d5c6ec226fe172ef3b8a52ccf769b745594b diff --git a/audiod_command.c b/audiod_command.c index 312cfee1..3bb94ad6 100644 --- a/audiod_command.c +++ b/audiod_command.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2005-2006 Andre Noll + * Copyright (C) 2005-2007 Andre Noll * * 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,153 +34,10 @@ #include "daemon.h" #include "string.h" #include "fd.h" - -/** defines one command of para_audiod */ -struct audiod_command { - /** the name of the command */ - const char *name; - /** pointer to the function that handles the command */ - int (*handler)(int, int, char**); - /** - * if the command prefers to handle the full line (rather than the usual - * argv[] array), it stores a pointer to the corresponding line handling - * function here. In this case, the above \a handler pointer must be NULL. - */ - int (*line_handler)(int, char*); - /** one-line description of the command */ - const char *description; - /** summary of the command line options */ - const char *synopsis; - /** the long help text */ - const char *help; -}; -static int com_grab(int, char *); -static int com_cycle(int, int, char **); -static int com_help(int, int, char **); -static int com_kill(int, int, char **); -static int com_off(int, int, char **); -static int com_on(int, int, char **); -static int com_sb(int, int, char **); -static int com_stat(int, int, char **); -static int com_tasks(int, int, char **); -static int com_term(int, int, char **); -static struct audiod_command cmds[] = { -{ -.name = "cycle", -.handler = com_cycle, -.description = "switch to next mode", -.synopsis = "cycle", -.help = - -"on -> standby -> off -> on\n" - -}, -{ -.name = "grab", -.line_handler = com_grab, -.description = "grab the audio stream", -.synopsis = "-- grab [grab_options]", -.help = - -"grab ('splice') the audio stream at any position in the filter \n" -"chain and send that data back to the client. Try\n" -"\t para_audioc -- grab -h\n" -"for the list of available options.\n" -}, - -{ -.name = "help", -.handler = com_help, -.description = "display command list or help for given command", -.synopsis = "help [command]", -.help = - -"When I was younger, so much younger than today, I never needed\n" -"anybody's help in any way. But now these days are gone, I'm not so\n" -"self assured. Now I find I've changed my mind and opened up the doors.\n" -"\n" -" -- Beatles: Help\n" - -}, -{ -.name = "kill", -.handler = com_kill, -.description = "kill an active audiod task", -.synopsis = "kill task_id [task_id ...]", -.help = - -"call sched_unregister() and the event_handler of the given task(s)\n" - -}, -{ -.name = "off", -.handler = com_off, -.description = "deactivate para_audiod", -.synopsis = "off", -.help = - -"Close connection to para_server and stop all decoders.\n" - -}, -{ -.name = "on", -.handler = com_on, -.description = "activate para_audiod", -.synopsis = "on", -.help = - -"Establish connection to para_server, retrieve para_server's current\n" -"status. If playing, start corresponding decoder. Otherwise stop\n" -"all decoders.\n" - -}, -{ -.name = "sb", -.handler = com_sb, -.description = "enter standby mode", -.synopsis = "sb", -.help = - -"Stop all decoders but leave connection to para_server open.\n" - -}, -{ -.name = "stat", -.handler = com_stat, -.description = "print status information", -.synopsis = "stat [item1 ...]", -.help = - -"Dump given status items (all if none given) to stdout.\n" - -}, -{ -.name = "tasks", -.handler = com_tasks, -.description = "list current tasks", -.synopsis = "tasks", -.help = - -"print the list of task ids together with the status of each task\n" - -}, -{ -.name = "term", -.handler = com_term, -.description = "terminate audiod", -.synopsis = "term", -.help = - -"Stop all decoders, shut down connection to para_server and exit.\n" - -}, -{ -.name = NULL, -} -}; +#include "audiod_command_list.h" /** iterate over the array of all audiod commands */ -#define FOR_EACH_COMMAND(c) for (c = 0; cmds[c].name; c++) +#define FOR_EACH_COMMAND(c) for (c = 0; audiod_cmds[c].name; c++) static int client_write(int fd, const char *buf) { @@ -284,8 +141,8 @@ static int dump_commands(int fd) ssize_t ret; FOR_EACH_COMMAND(i) { - tmp = make_message("%s%s\t%s\n", buf, cmds[i].name, - cmds[i].description); + tmp = make_message("%s%s\t%s\n", buf, audiod_cmds[i].name, + audiod_cmds[i].description); free(buf); buf = tmp; } @@ -300,7 +157,7 @@ static int dump_commands(int fd) * to each individual command to close the fd if necessary. */ -static int com_help(int fd, int argc, char **argv) +int com_help(int fd, int argc, char **argv) { int i, ret; char *buf; @@ -311,16 +168,16 @@ static int com_help(int fd, int argc, char **argv) goto out; } FOR_EACH_COMMAND(i) { - if (strcmp(cmds[i].name, argv[1])) + if (strcmp(audiod_cmds[i].name, argv[1])) continue; buf = make_message( "NAME\n\t%s -- %s\n" "SYNOPSIS\n\tpara_audioc %s\n" "DESCRIPTION\n%s\n", argv[1], - cmds[i].description, - cmds[i].synopsis, - cmds[i].help + audiod_cmds[i].description, + audiod_cmds[i].usage, + audiod_cmds[i].help ); ret = client_write(fd, buf); free(buf); @@ -335,7 +192,7 @@ out: return ret; } -static int com_tasks(int fd, __a_unused int argc, __a_unused char **argv) +int com_tasks(int fd, __a_unused int argc, __a_unused char **argv) { char *tl = get_task_list(); int ret = 1; @@ -347,7 +204,7 @@ static int com_tasks(int fd, __a_unused int argc, __a_unused char **argv) return ret; } -static int com_kill(int fd, int argc, char **argv) +int com_kill(int fd, int argc, char **argv) { int i, ret = 1; if (argc < 2) @@ -362,7 +219,7 @@ static int com_kill(int fd, int argc, char **argv) return ret; } -static int com_stat(int fd, __a_unused int argc, __a_unused char **argv) +int com_stat(int fd, __a_unused int argc, __a_unused char **argv) { int i, ret; char *buf = NULL; @@ -456,7 +313,7 @@ static struct filter_node *find_filter_node(int slot_num, int format, int filter return NULL; } -static int com_grab(int fd, char *cmdline) +int com_grab(int fd, char *cmdline) { struct grab_client *gc; struct filter_node *fn; @@ -493,34 +350,34 @@ err_out: return 1; } -static int __noreturn com_term(int fd, __a_unused int argc, __a_unused char **argv) +int __noreturn com_term(int fd, __a_unused int argc, __a_unused char **argv) { close(fd); clean_exit(EXIT_SUCCESS, "terminating on user request"); } -static int com_on(int fd, __a_unused int argc, __a_unused char **argv) +int com_on(int fd, __a_unused int argc, __a_unused char **argv) { audiod_status = AUDIOD_ON; close(fd); return 1; } -static int com_off(int fd, __a_unused int argc, __a_unused char **argv) +int com_off(int fd, __a_unused int argc, __a_unused char **argv) { audiod_status = AUDIOD_OFF; close(fd); return 1; } -static int com_sb(int fd, __a_unused int argc, __a_unused char **argv) +int com_sb(int fd, __a_unused int argc, __a_unused char **argv) { audiod_status = AUDIOD_STANDBY; close(fd); return 1; } -static int com_cycle(int fd, int argc, char **argv) +int com_cycle(int fd, int argc, char **argv) { switch (audiod_status) { case AUDIOD_ON: @@ -575,21 +432,21 @@ int handle_connect(int accept_fd) *p = '\0'; p++; } - for (i = 0; cmds[i].name; i++) { + for (i = 0; audiod_cmds[i].name; i++) { int j; - if (strcmp(cmds[i].name, cmd)) + if (strcmp(audiod_cmds[i].name, cmd)) continue; - if (cmds[i].handler) { + if (audiod_cmds[i].handler) { argc = split_args(buf, &argv, "\n"); PARA_INFO_LOG("argv[0]: %s, argc= %d\n", argv[0], argc); - ret = cmds[i].handler(clifd, argc, argv); + ret = audiod_cmds[i].handler(clifd, argc, argv); goto out; } for (j = 0; p[j]; j++) if (p[j] == '\n') p[j] = ' '; PARA_INFO_LOG("cmd: %s, options: %s\n", cmd, p); - ret = cmds[i].line_handler(clifd, p); + ret = audiod_cmds[i].line_handler(clifd, p); goto out; } ret = -E_INVALID_AUDIOD_CMD;