static int stat_client_add(int fd, uint64_t mask, int parser_friendly)
{
struct stat_client *new_client;
+ int ret;
if (num_clients >= MAX_STAT_CLIENTS) {
PARA_ERROR_LOG("maximal number of stat clients (%d) exceeded\n",
MAX_STAT_CLIENTS);
return -E_TOO_MANY_CLIENTS;
}
- PARA_INFO_LOG("adding client on fd %d\n", fd);
- new_client = para_calloc(sizeof(struct stat_client));
- new_client->fd = fd;
+ ret = dup(fd);
+ if (ret < 0)
+ return -ERRNO_TO_PARA_ERROR(errno);
+ new_client = para_calloc(sizeof(*new_client));
+ new_client->fd = ret;
+ PARA_INFO_LOG("adding client on fd %d\n", new_client->fd);
new_client->item_mask = mask;
if (parser_friendly)
new_client->flags = SCF_PARSER_FRIENDLY;
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;
- }
+ if (argc < 2)
+ return dump_commands(fd);
FOR_EACH_COMMAND(i) {
if (strcmp(audiod_cmds[i].name, argv[1]))
continue;
);
ret = client_write(fd, buf);
free(buf);
- goto out;
+ return ret;
}
ret = client_write(fd, dflt);
if (ret > 0)
ret = dump_commands(fd);
-out:
- if (ret >= 0)
- close(fd);
return ret;
}
if (tl)
ret = client_write(fd, tl);
free(tl);
- if (ret > 0)
- close(fd);
return ret;
}
return grab_client_new(fd, argc, argv, &sched);
}
-static int com_term(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)
{
- close(fd);
return -E_AUDIOD_TERM;
}
-static int com_on(int fd, __a_unused int argc, __a_unused char **argv)
+static int com_on(__a_unused 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)
+static int com_off(__a_unused 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)
+static int com_sb(__a_unused 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)
+static int com_cycle(__a_unused int fd, int argc, char **argv)
{
switch (audiod_status) {
case AUDIOD_ON:
return com_off(fd, argc, argv);
break;
}
- close(fd);
return 1;
}
msg = make_message("%s\n", version_single_line("audiod"));
ret = client_write(fd, msg);
free(msg);
- if (ret >= 0)
- close(fd);
return ret;
}
ret = -E_INVALID_AUDIOD_CMD;
out:
free_argv(argv);
- if (clifd > 0 && ret < 0 && ret != -E_CLIENT_WRITE) {
+ if (ret < 0 && ret != -E_CLIENT_WRITE) {
char *tmp = make_message("%s\n", para_strerror(-ret));
client_write(clifd, tmp);
free(tmp);
- close(clifd);
}
+ close(clifd);
return ret;
}