X-Git-Url: http://git.tuebingen.mpg.de/?a=blobdiff_plain;f=audiod_command.c;h=bb54dfab87f7965a18f6cccbe6bc4077c147fa29;hb=HEAD;hp=795e2ac84657150a1a8d64947e30a7ba4a217796;hpb=b142089267ef501e438c3dc77ecf19bead3d4e58;p=paraslash.git diff --git a/audiod_command.c b/audiod_command.c index 795e2ac8..5f0b35a5 100644 --- a/audiod_command.c +++ b/audiod_command.c @@ -81,27 +81,12 @@ static int num_clients; /** The list of all status items used by para_{server,audiod,gui}. */ const char *status_item_list[] = {STATUS_ITEMS}; -static void dump_stat_client_list(void) -{ - struct stat_client *sc; - - list_for_each_entry(sc, &client_list, node) - PARA_INFO_LOG("stat client on fd %d\n", sc->fd); -} -/** - * Add a status client to the list. - * - * \param fd The file descriptor of the client. - * \param mask Bitfield of status items for this client. - * \param parser_friendly Enable parser-friendly output mode. +/* + * Add a status client to the global client list and increment num_clients. * - * Only those status items having the bit set in \a mask will be - * sent to the client. - * - * \return Positive value on success, or -E_TOO_MANY_CLIENTS if - * the number of connected clients exceeds #MAX_STAT_CLIENTS. + * The mask parameter specifies which status items are sent to the client. */ -static int stat_client_add(int fd, uint64_t mask, int parser_friendly) +static int stat_client_add(int fd, uint64_t mask, bool parser_friendly) { struct stat_client *new_client; int ret; @@ -114,14 +99,13 @@ static int stat_client_add(int fd, uint64_t mask, int parser_friendly) ret = dup(fd); if (ret < 0) return -ERRNO_TO_PARA_ERROR(errno); - new_client = para_calloc(sizeof(*new_client)); + new_client = zalloc(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; para_list_add(&new_client->node, &client_list); - dump_stat_client_list(); num_clients++; return 1; } @@ -180,20 +164,12 @@ void stat_client_write_item(int item_num) continue; /* write error or short write */ close_stat_client(sc); - dump_stat_client_list(); } free(pb.buf); free(pfpb.buf); } -/** - * Check if string is a known status item. - * - * \param item Buffer containing the text to check. - * - * \return If \a item is a valid status item, the number of that status item is - * returned. Otherwise, this function returns \p -E_UNKNOWN_STAT_ITEM. - */ +/* Check if the given string is a known status item and return its index. */ static int stat_item_valid(const char *item) { int i; @@ -240,6 +216,42 @@ static int com_help(int fd, struct lls_parse_result *lpr) } EXPORT_AUDIOD_CMD_HANDLER(help) +static int com_ll(int fd, struct lls_parse_result *lpr) +{ + unsigned ll; + char *errctx; + const char *sev[] = {SEVERITIES}; + const char *arg; + int ret = lls(lls_check_arg_count(lpr, 0, 1, &errctx)); + + if (ret < 0) { + char *tmp = make_message("%s\n", errctx); + free(errctx); + client_write(fd, tmp); + free(tmp); + return ret; + } + if (lls_num_inputs(lpr) == 0) { + char *msg; + ll = daemon_get_loglevel(); + msg = make_message("%s\n", sev[ll]); + ret = client_write(fd, msg); + free(msg); + return ret; + } + arg = lls_input(0, lpr); + for (ll = 0; ll < NUM_LOGLEVELS; ll++) { + if (!strcmp(arg, sev[ll])) + break; + } + if (ll >= NUM_LOGLEVELS) + return -ERRNO_TO_PARA_ERROR(EINVAL); + PARA_INFO_LOG("new log level: %s\n", sev[ll]); + daemon_set_loglevel(ll); + return 1; +} +EXPORT_AUDIOD_CMD_HANDLER(ll) + static int com_tasks(int fd, __a_unused struct lls_parse_result *lpr) { int ret; @@ -255,7 +267,8 @@ EXPORT_AUDIOD_CMD_HANDLER(tasks) static int com_stat(int fd, struct lls_parse_result *lpr) { - int i, ret, parser_friendly = 0; + int i, ret; + bool parser_friendly = false; uint64_t mask = 0; const uint64_t one = 1; struct para_buffer b = {.flags = 0}; @@ -267,7 +280,7 @@ static int com_stat(int fd, struct lls_parse_result *lpr) return ret; r = lls_opt_result(LSG_AUDIOD_CMD_STAT_OPT_PARSER_FRIENDLY, lpr); if (lls_opt_given(r) > 0) { - parser_friendly = 1; + parser_friendly = true; b.flags = PBF_SIZE_PREFIX; } num_inputs = lls_num_inputs(lpr);