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;
continue;
b = (sc->flags & SCF_PARSER_FRIENDLY)? &pfpb : &pb;
if (!b->buf)
- (void)WRITE_STATUS_ITEM(b, item_num, "%s\n",
- msg? msg : "");
+ WRITE_STATUS_ITEM(b, item_num, "%s\n", msg? msg : "");
ret = write(sc->fd, b->buf, b->offset);
if (ret == b->offset)
continue;
{
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)
char *item = stat_item_values[i];
if (!((one << i) & mask))
continue;
- (void)WRITE_STATUS_ITEM(&b, i, "%s\n", item? item : "");
+ WRITE_STATUS_ITEM(&b, i, "%s\n", item? item : "");
}
ret = client_write(fd, b.buf);
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)