NEWS update
[paraslash.git] / audiod_command.c
index 3bb94ad60a8a1079659105b792068e71045c9e01..2d5bb79917b760f117997d42a7752dba6da82da0 100644 (file)
@@ -350,7 +350,7 @@ err_out:
        return 1;
 }
 
-int __noreturn com_term(int fd, __a_unused int argc, __a_unused char **argv)
+__noreturn int com_term(int fd, __a_unused int argc, __a_unused char **argv)
 {
        close(fd);
        clean_exit(EXIT_SUCCESS, "terminating on user request");
@@ -406,11 +406,27 @@ static int check_perms(uid_t uid)
        return -E_UCRED_PERM;
 }
 
+/**
+ * handle arriving connections on the local socket
+ *
+ * \param accept_fd the fd to call accept() on
+ *
+ * This is called whenever para_audiod's main task detects an incoming
+ * connection by the readability of \a accept_fd. This function reads the
+ * command sent by the peer, checks the connecting user's permissions by using
+ * unix socket credentials (if supported by the OS) and calls the corresponding
+ * command handler if permissions are OK.
+ *
+ * \return positive on success, negative on errors
+ *
+ * \sa para_accept(), recv_cred_buffer()
+ * */
 int handle_connect(int accept_fd)
 {
        int i, argc, ret, clifd = -1;
        char *cmd = NULL, *p, *buf = para_calloc(MAXLINE), **argv = NULL;
        struct sockaddr_un unix_addr;
+       uid_t uid;
 
        ret = para_accept(accept_fd, &unix_addr, sizeof(struct sockaddr_un));
        if (ret < 0)
@@ -419,8 +435,9 @@ int handle_connect(int accept_fd)
        ret = recv_cred_buffer(clifd, buf, MAXLINE - 1);
        if (ret < 0)
                goto out;
+       uid = ret;
        PARA_INFO_LOG("connection from user %i, buf: %s\n",  ret, buf);
-       ret = check_perms(ret);
+       ret = check_perms(uid);
        if (ret < 0)
                goto out;
        ret = -E_INVALID_AUDIOD_CMD;
@@ -462,7 +479,9 @@ out:
        }
        return ret;
 }
-
+/**
+ * send the current audiod status to all connected stat clients
+ */
 void audiod_status_dump(void)
 {
        struct timeval *t = wstime();
@@ -503,6 +522,7 @@ void audiod_status_dump(void)
        old = stat_task->stat_item_values[SI_DECODER_FLAGS];
        new = decoder_flags();
        if (!old || strcmp(old, new)) {
+               free(old);
                stat_client_write(new, SI_DECODER_FLAGS);
                stat_task->stat_item_values[SI_DECODER_FLAGS] = new;
        } else