aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMax Kellermann <max@duempel.org>2008-08-28 20:03:06 +0200
committerEric Wong <normalperson@yhbt.net>2008-09-01 18:35:18 -0700
commit7c5a476927734aec99ba87d744ac46ff7e890dd5 (patch)
treecb368f2d6d7ce4c60907bdad6c0ef7bc39cfb2c4
parent1e6af706599c733a707e9fd32f0ef733d1908362 (diff)
downloadmpd-7c5a476927734aec99ba87d744ac46ff7e890dd5.tar.gz
mpd-7c5a476927734aec99ba87d744ac46ff7e890dd5.tar.xz
mpd-7c5a476927734aec99ba87d744ac46ff7e890dd5.zip
client: added function client_by_fd()
The code becomes less complex and more readable when we move this linear search into a separate mini function.
-rw-r--r--src/client.c34
1 files changed, 21 insertions, 13 deletions
diff --git a/src/client.c b/src/client.c
index 54c62bc83..c4693193f 100644
--- a/src/client.c
+++ b/src/client.c
@@ -686,30 +686,38 @@ static void client_write_deferred(struct client *client)
}
}
-int client_print(int fd, const char *buffer, size_t buflen)
+static struct client *client_by_fd(int fd)
{
static unsigned int i;
+
+ assert(fd >= 0);
+
+ if (i < client_max_connections && clients[i].fd >= 0 &&
+ clients[i].fd == fd)
+ return &clients[i];
+
+ for (i = 0; i < client_max_connections; i++)
+ if (clients[i].fd == fd)
+ return &clients[i];
+
+ return NULL;
+}
+
+int client_print(int fd, const char *buffer, size_t buflen)
+{
size_t copylen;
struct client *client;
assert(fd >= 0);
- if (i >= client_max_connections ||
- clients[i].fd < 0 || clients[i].fd != fd) {
- for (i = 0; i < client_max_connections; i++) {
- if (clients[i].fd == fd)
- break;
- }
- if (i == client_max_connections)
- return -1;
- }
+ client = client_by_fd(fd);
+ if (client == NULL)
+ return -1;
/* if fd isn't found or client is going to be closed, do nothing */
- if (clients[i].expired)
+ if (client->expired)
return 0;
- client = clients + i;
-
while (buflen > 0 && !client->expired) {
size_t left;