X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=audiod_command.c;h=da5a2dc5e882a4de2fe61152a6d0979f3dd04cf5;hp=98e83b3cefc1e40a17c7a7e902dcf914dd07a92c;hb=a601afd9c3c5819a0f2361bf073b7c737dcdab45;hpb=299df142bb50bacebc0b3050768f941bc95b5b6f;ds=sidebyside diff --git a/audiod_command.c b/audiod_command.c index 98e83b3c..da5a2dc5 100644 --- a/audiod_command.c +++ b/audiod_command.c @@ -16,7 +16,6 @@ #include "sched.h" #include "ggo.h" #include "filter.h" -#include "grab_client.cmdline.h" #include "grab_client.h" #include "error.h" @@ -214,61 +213,9 @@ int com_stat(int fd, int argc, char **argv) return ret; } -static struct filter_node *find_filter_node(int slot_num, int format, int filternum) +int com_grab(int fd, int argc, char **argv) { - int i; - - FOR_EACH_SLOT(i) { - struct slot_info *s = &slot[i]; - if (s->format < 0 || !s->fc) - continue; - if (slot_num >= 0 && slot_num != i) - continue; - if (format >= 0 && s->format != format) - continue; - if (num_filters(i) <= filternum) - continue; - /* success */ - return s->fc->filter_nodes + filternum; - } - return NULL; -} - -int com_grab(int fd, char *cmdline) -{ - struct grab_client *gc; - struct filter_node *fn; - int i, err; - char *msg; - - gc = grab_client_new(fd, cmdline, &err); - if (!gc) - goto err_out; - fn = find_filter_node(gc->conf->slot_arg, gc->audio_format_num, gc->conf->filter_num_arg); - if (fn) - activate_grab_client(gc, fn); - return 1; -err_out: - if (err != -E_GC_HELP_GIVEN && err != -E_GC_VERSION_GIVEN) - return err; - if (err == -E_GC_HELP_GIVEN) { - msg = make_message("%s\n\n", grab_client_args_info_usage); - for (i = 0; grab_client_args_info_help[i]; i++) { - char *tmp = make_message("%s%s\n", msg, - grab_client_args_info_help[i]); - free(msg); - msg = tmp; - } - } else - msg = make_message("%s %s\n", - GRAB_CLIENT_CMDLINE_PARSER_PACKAGE, - GRAB_CLIENT_CMDLINE_PARSER_VERSION); - err = client_write(fd, msg); - free(msg); - if (err < 0) - return err; - close(fd); - return 1; + return grab_client_new(fd, argc, argv); } __noreturn int com_term(int fd, __a_unused int argc, __a_unused char **argv) @@ -345,7 +292,7 @@ static int check_perms(uid_t uid) int handle_connect(int accept_fd) { int i, argc, ret, clifd = -1; - char *cmd = NULL, *p, *buf = para_calloc(MAXLINE), **argv = NULL; + char buf[MAXLINE], **argv = NULL; struct sockaddr_un unix_addr; uid_t uid; @@ -353,7 +300,7 @@ int handle_connect(int accept_fd) if (ret < 0) goto out; clifd = ret; - ret = recv_cred_buffer(clifd, buf, MAXLINE - 1); + ret = recv_cred_buffer(clifd, buf, sizeof(buf) - 1); if (ret < 0) goto out; uid = ret; @@ -361,36 +308,20 @@ int handle_connect(int accept_fd) ret = check_perms(uid); if (ret < 0) goto out; - cmd = para_strdup(buf); - p = strchr(cmd, '\n'); - if (!p) - p = ""; - else { - *p = '\0'; - p++; - } - for (i = 0; audiod_cmds[i].name; i++) { - int j; - if (strcmp(audiod_cmds[i].name, cmd)) + ret = create_argv(buf, "\n", &argv); + if (ret < 0) + goto out; + argc = ret; + //PARA_INFO_LOG("argv[0]: %s, argc = %d\n", argv[0], argc); + FOR_EACH_COMMAND(i) { + if (strcmp(audiod_cmds[i].name, argv[0])) continue; - if (audiod_cmds[i].handler) { - argc = split_args(buf, &argv, "\n"); - PARA_INFO_LOG("argv[0]: %s, argc= %d\n", argv[0], argc); - 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 = audiod_cmds[i].line_handler(clifd, p); + ret = audiod_cmds[i].handler(clifd, argc, argv); goto out; } ret = -E_INVALID_AUDIOD_CMD; out: - free(cmd); - free(buf); - free(argv); + free_argv(argv); if (clifd > 0 && ret < 0 && ret != -E_CLIENT_WRITE) { char *tmp = make_message("%s\n", para_strerror(-ret)); client_write(clifd, tmp); @@ -399,6 +330,7 @@ out: } return ret; } + /** * Send the current audiod status to all connected stat clients. */