X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=audiod_command.c;h=d424cf2e76f32ca90058685b68186b5a00be6a2b;hp=3bb94ad60a8a1079659105b792068e71045c9e01;hb=35726e230f83270ef01000fc57328101a8b0d89f;hpb=e56519a6ef7f28ce4974fc83400418e8dcb47f33;ds=sidebyside diff --git a/audiod_command.c b/audiod_command.c index 3bb94ad6..d424cf2e 100644 --- a/audiod_command.c +++ b/audiod_command.c @@ -1,25 +1,15 @@ /* * Copyright (C) 2005-2007 Andre Noll * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA. + * Licensed under the GPL v2. For licencing details see COPYING. */ /** \file audiod_command.c commands for para_audiod */ -#include "para.h" +#include +#include +#include "para.h" #include "audiod.cmdline.h" #include "list.h" #include "close_on_fork.h" @@ -350,7 +340,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 +396,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 +425,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 +469,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 +512,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