From 8b1b82b36374e95bcef8195fcd15e4014e73567d Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Fri, 29 Aug 2008 09:36:42 +0200 Subject: client: pass the client struct to processCommand() Start exporting the client struct as an opaque struct. For now, pass it only to processCommand() and processListOfCommands(), and provide a function to extract the socket handle. Later, we will propagate the pointer to all command implementations, and of course to client_print() etc. --- src/client.c | 12 ++++++++++-- src/client.h | 9 +++++++++ src/command.c | 14 +++++++++----- src/command.h | 8 ++++++-- 4 files changed, 34 insertions(+), 9 deletions(-) diff --git a/src/client.c b/src/client.c index c0cca399e..7f47aacd4 100644 --- a/src/client.c +++ b/src/client.c @@ -324,6 +324,14 @@ void client_new(int fd, const struct sockaddr *addr) sockaddr_to_tmp_string(addr)); } +int client_get_fd(struct client *client) +{ + assert(client != NULL); + assert(client->fd >= 0); + + return client->fd; +} + static int client_process_line(struct client *client) { int ret = 1; @@ -335,7 +343,7 @@ static int client_process_line(struct client *client) "list\n", client->num); global_expired = 0; - ret = processListOfCommands(client->fd, + ret = processListOfCommands(client, &(client->permission), &global_expired, client->cmd_list_OK, @@ -384,7 +392,7 @@ static int client_process_line(struct client *client) } else { DEBUG("client %i: process command \"%s\"\n", client->num, line); - ret = processCommand(client->fd, + ret = processCommand(client, &(client->permission), line); DEBUG("client %i: command returned %i\n", client->num, ret); diff --git a/src/client.h b/src/client.h index a4cb4a902..db4bc2023 100644 --- a/src/client.h +++ b/src/client.h @@ -21,6 +21,8 @@ #include "os_compat.h" +struct client; + void client_manager_init(void); void client_manager_deinit(void); int client_manager_io(void); @@ -28,6 +30,13 @@ void client_manager_expire(void); void client_new(int fd, const struct sockaddr *addr); +/** + * Return the file descriptor of this client's socket. This function + * will be removed once we have migrated to passing the client struct + * everywhere. + */ +int client_get_fd(struct client *client); + int client_print(int fd, const char *buffer, size_t len); #endif diff --git a/src/command.c b/src/command.c index 7078e781e..f2468d0b1 100644 --- a/src/command.c +++ b/src/command.c @@ -34,6 +34,7 @@ #include "ack.h" #include "audio.h" #include "dbUtils.h" +#include "client.h" #include "os_compat.h" #define COMMAND_PLAY "play" @@ -1204,9 +1205,11 @@ static CommandEntry *getCommandEntryFromString(char *string, int *permission) return cmd; } -static int processCommandInternal(int fd, mpd_unused int *permission, +static int processCommandInternal(struct client *client, + mpd_unused int *permission, char *commandString, struct strnode *cmdnode) { + int fd = client_get_fd(client); int argc; char *argv[COMMAND_ARGV_MAX] = { NULL }; CommandEntry *cmd; @@ -1232,9 +1235,10 @@ static int processCommandInternal(int fd, mpd_unused int *permission, return ret; } -int processListOfCommands(int fd, int *permission, int *expired, +int processListOfCommands(struct client *client, int *permission, int *expired, int listOK, struct strnode *list) { + int fd = client_get_fd(client); struct strnode *cur = list; int ret = 0; @@ -1243,7 +1247,7 @@ int processListOfCommands(int fd, int *permission, int *expired, while (cur) { DEBUG("processListOfCommands: process command \"%s\"\n", cur->data); - ret = processCommandInternal(fd, permission, cur->data, cur); + ret = processCommandInternal(client, permission, cur->data, cur); DEBUG("processListOfCommands: command returned %i\n", ret); if (ret != 0 || (*expired) != 0) goto out; @@ -1257,9 +1261,9 @@ out: return ret; } -int processCommand(int fd, int *permission, char *commandString) +int processCommand(struct client *client, int *permission, char *commandString) { - return processCommandInternal(fd, permission, commandString, NULL); + return processCommandInternal(client, permission, commandString, NULL); } mpd_fprintf_ void commandError(int fd, int error, const char *fmt, ...) diff --git a/src/command.h b/src/command.h index be935c8b5..030e03767 100644 --- a/src/command.h +++ b/src/command.h @@ -27,10 +27,14 @@ #define COMMAND_RETURN_CLOSE 20 #define COMMAND_MASTER_READY 30 -int processListOfCommands(int fd, int *permission, int *expired, +struct client; + +int processListOfCommands(struct client *client, + int *permission, int *expired, int listOK, struct strnode *list); -int processCommand(int fd, int *permission, char *commandString); +int processCommand(struct client *client, + int *permission, char *commandString); void initCommands(void); -- cgit v1.2.3