aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMax Kellermann <max@duempel.org>2008-08-29 09:36:42 +0200
committerMax Kellermann <max@duempel.org>2008-08-29 09:36:42 +0200
commit8b1b82b36374e95bcef8195fcd15e4014e73567d (patch)
tree90efdb2f715a44e2ccc3387e479cf56512225e01
parent2c8aa8efde879b6b9396aaa06edfa4506c55842e (diff)
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.
-rw-r--r--src/client.c12
-rw-r--r--src/client.h9
-rw-r--r--src/command.c14
-rw-r--r--src/command.h8
4 files changed, 34 insertions, 9 deletions
diff --git a/src/client.c b/src/client.c
index c0cca399..7f47aacd 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 a4cb4a90..db4bc202 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 7078e781..f2468d0b 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 be935c8b..030e0376 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);