-static int dump_commands(int fd)
-{
- char *buf = para_strdup(""), *tmp = NULL;
- int i;
- ssize_t ret;
-
- FOR_EACH_COMMAND(i) {
- tmp = make_message("%s%s\t%s\n", buf, cmds[i].name,
- cmds[i].description);
- free(buf);
- buf = tmp;
- }
- ret = client_write(fd, buf);
- free(buf);
- return ret;
-}
-
-/*
- * command handlers don't close their fd on errors (ret < 0) so that
- * its caller can send an error message. Otherwise (ret >= 0) it's up
- * to each individual command to close the fd if necessary.
- */
-
-static int com_help(int fd, int argc, char **argv)
-{
- int i, ret;
- char *buf;
- const char *dflt = "No such command. Available commands:\n";
-
- if (argc < 2) {
- ret = dump_commands(fd);
- goto out;
- }
- FOR_EACH_COMMAND(i) {
- if (strcmp(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
- );
- ret = client_write(fd, buf);
- free(buf);
- goto out;
- }
- ret = client_write(fd, dflt);
- if (ret > 0)
- ret = dump_commands(fd);
-out:
- if (ret >= 0)
- close(fd);
- return ret;
-}
-
-static int com_stat(int fd, __a_unused int argc, __a_unused char **argv)
-{
- int i, ret;
- char *buf = NULL;
- long unsigned mask = ~0LU;
-
- 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);
- }
- }
- 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);
- }
-
- for (i = 0; i < NUM_STAT_ITEMS; i++) {
- char *tmp, *v;
- if (!((1 << i) & mask))
- continue;
- v = stat_item_values[i];
- tmp = make_message("%s%s%s", buf? buf: "",
- v? v : "", v? "\n" : "");
- free(buf);
- buf = tmp;
- }
- ret = client_write(fd, buf);
-out:
- if (ret > 0)
- ret = stat_client_add(fd, mask);
- free(buf);
- return ret;
-}
-
-#if 0
-static char *list_filters(void)
-{
- int i, j;
- char *tmp, *msg = make_message("format\tnum\tcmd\n");
-
- FOR_EACH_AUDIO_FORMAT(i) {
- for (j = 0; j < afi[i].num_filters; j++) {
- tmp = make_message("%s\t%i\t%s\n",
- afi[i].name, j, afi[i].filter_cmds[j]);
- msg = para_strcat(msg, tmp);
- free(tmp);
- }
- tmp = make_message("%s\t%i\t%s\n", afi[i].name,
- j, afi[i].write_cmd);
- msg = para_strcat(msg, tmp);
- free(tmp);
- }
- return msg;
-}
-#endif
-
-
-static 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;
-}
-
-static 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)
-{
- audiod_status = AUDIOD_ON;
- close(fd);
- return 1;
-}
-
-static 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)
-{
- audiod_status = AUDIOD_STANDBY;
- close(fd);
- return 1;
-}
-
-static int com_cycle(int fd, int argc, char **argv)
-{
- switch (audiod_status) {
- case AUDIOD_ON:
- return com_sb(fd, argc, argv);
- break;
- case AUDIOD_OFF:
- return com_on(fd, argc, argv);
- break;
- case AUDIOD_STANDBY:
- return com_off(fd, argc, argv);
- break;
- }
- close(fd);
- return 1;
-}
-
-static int check_perms(uid_t uid)
-{
- int i;
-
- if (!conf.user_allow_given)
- return 1;
- for (i = 0; i < conf.user_allow_given; i++)
- if (uid == conf.user_allow_arg[i])
- return 1;
- return -E_UCRED_PERM;
-}
-
-static int handle_connect(void)