struct audiod_command {
const char *name;
/* Pointer to the function that handles the command. */
+ /*
+ * Command handlers must never never close their file descriptor. A
+ * positive return value tells audiod that the status items have
+ * changed. In this case audiod will send an updated version of all
+ * status items to to each connected stat client.
+ */
audiod_command_handler_t *handler;
/* One-line description. */
const char *description;
{
int i, ret;
char *buf;
- const char *dflt = "No such command. Available commands:\n";
- if (argc < 2)
- return dump_commands(fd);
+ if (argc < 2) {
+ ret = dump_commands(fd);
+ goto out;
+ }
FOR_EACH_COMMAND(i) {
if (strcmp(audiod_cmds[i].name, argv[1]))
continue;
);
ret = client_write(fd, buf);
free(buf);
- return ret;
+ goto out;
}
- ret = client_write(fd, dflt);
+ ret = client_write(fd, "No such command. Available commands:\n");
if (ret > 0)
ret = dump_commands(fd);
- return ret;
+out:
+ return ret < 0? ret : 0;
}
static int com_tasks(int fd, __a_unused int argc, __a_unused char **argv)
if (tl)
ret = client_write(fd, tl);
free(tl);
- return ret;
+ return ret < 0? ret : 0;
}
static int com_stat(int fd, int argc, char **argv)
if (ret >= 0)
ret = stat_client_add(fd, mask, parser_friendly);
free(b.buf);
- return ret;
+ return ret < 0? ret : 0;
}
static int com_grab(int fd, int argc, char **argv)
{
- return grab_client_new(fd, argc, argv, &sched);
+ int ret = grab_client_new(fd, argc, argv, &sched);
+ return ret < 0? ret : 0;
}
static int com_term(__a_unused int fd, __a_unused int argc, __a_unused char **argv)
msg = make_message("%s\n", version_single_line("audiod"));
ret = client_write(fd, msg);
free(msg);
- return ret;
+ return ret < 0? ret : 0;
}
static int check_perms(uid_t uid, uid_t *whitelist)