{
unsigned int i;
- for (i = 0; i < ARRAY_SIZE(me->oserver->clients); i++) {
+ for (i = 0; i < me->oserver->max_clients; i++) {
struct client *c = me->oserver->clients[i];
if (!c || c == me)
continue;
{
unsigned int i;
- for (i = 0; i < ARRAY_SIZE(me->oserver->clients); i++) {
+ for (i = 0; i < me->oserver->max_clients; i++) {
struct client *c = me->oserver->clients[i];
if (!c || c == me)
continue;
return 0;
}
-static unsigned int max_client(struct client *clients[5])
+static unsigned int find_id(struct oserver *oserver)
{
- unsigned int i, ret = 0;
+ unsigned int id;
- for (i = 0; i < 5; i++) {
- if (clients[i])
- ret = i+1;
+ for (id = 0; id < oserver->max_clients; id++) {
+ if (oserver->clients[id] == NULL)
+ return id;
}
- return ret;
+
+ /* Enlarge. */
+ oserver->clients = talloc_realloc(oserver,
+ oserver->clients,
+ struct client *,
+ ++oserver->max_clients);
+ return id;
}
static void add_client(struct tevent_context *ev,
service_client, client);
tevent_fd_set_auto_close(client->fde);
- /* Find empty slot in array for this client. */
- for (client->id = 0; oserver->clients[client->id]; client->id++);
+ client->id = find_id(oserver);
oserver->clients[client->id] = client;
- talloc_set_destructor(client, cleanup_client);
-
- /* Full? Stop listening... */
- if (client->id == ARRAY_SIZE(oserver->clients)-1)
- tevent_fd_set_flags(oserver->fde, 0);
- oserver->max_clients = max_client(oserver->clients);
-}
-
-static void clear_clients(struct oserver *oserver)
-{
- memset(oserver->clients, 0,
- ARRAY_SIZE(oserver->clients) * sizeof(oserver->clients[0]));
}
static int destroy_oserver(struct oserver *oserver)
static bool complete_server(struct tevent_context *ev,
struct oserver *oserver, const char *dumpfile)
{
- oserver->max_clients = max_client(oserver->clients);
-
/* Re-set this even if restored from file, in case it changed. */
oserver->dumpfile = dumpfile;
if (oserver->dumpfile)
}
/* Restore ignored fields in clients, and talloc hierarchy. */
- for (i = 0; i < ARRAY_SIZE(oserver->clients); i++) {
+ for (i = 0; i < oserver->max_clients; i++) {
struct client *client = oserver->clients[i];
if (!client)
continue;
oserver->argv_len++);
} else
oserver->argv_len = 0;
- clear_clients(oserver);
+ oserver->max_clients = 0;
+ oserver->clients = NULL;
oserver->fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (oserver->fd < 0) {
talloc_free(oserver);