summary |
shortlog |
log |
commit | commitdiff |
tree
raw |
patch |
inline | side by side (from parent 1:
6aea41e)
It has always been the case that a positive return value from a
command handler causes audiod to dump all audiod status items to all
clients. This behaviour is not documented though, and some command
handlers get it wrong. In fact, the help, stat, tasks, grab, version
commands all return positive values although those commands never
change any status items.
This comment documents the meaning of the return value and fixes up
the above command handlers.
struct audiod_command {
const char *name;
/* Pointer to the function that handles the command. */
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;
audiod_command_handler_t *handler;
/* One-line description. */
const char *description;
- 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;
FOR_EACH_COMMAND(i) {
if (strcmp(audiod_cmds[i].name, argv[1]))
continue;
);
ret = client_write(fd, buf);
free(buf);
);
ret = client_write(fd, buf);
free(buf);
- ret = client_write(fd, dflt);
+ ret = client_write(fd, "No such command. Available commands:\n");
if (ret > 0)
ret = dump_commands(fd);
if (ret > 0)
ret = dump_commands(fd);
+out:
+ return ret < 0? ret : 0;
}
static int com_tasks(int fd, __a_unused int argc, __a_unused char **argv)
}
static int com_tasks(int fd, __a_unused int argc, __a_unused char **argv)
if (tl)
ret = client_write(fd, tl);
free(tl);
if (tl)
ret = client_write(fd, tl);
free(tl);
+ return ret < 0? ret : 0;
}
static int com_stat(int fd, int argc, char **argv)
}
static int com_stat(int fd, int argc, char **argv)
if (ret >= 0)
ret = stat_client_add(fd, mask, parser_friendly);
free(b.buf);
if (ret >= 0)
ret = stat_client_add(fd, mask, parser_friendly);
free(b.buf);
+ return ret < 0? ret : 0;
}
static int com_grab(int fd, int argc, char **argv)
{
}
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)
}
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);
msg = make_message("%s\n", version_single_line("audiod"));
ret = client_write(fd, msg);
free(msg);
+ return ret < 0? ret : 0;
}
static int check_perms(uid_t uid, uid_t *whitelist)
}
static int check_perms(uid_t uid, uid_t *whitelist)