-/*
+/*
* clients.c:
*
* Copyright (c) 2008 James McKenzie <james@fishsoup.dhs.org>,
*
*/
-static char rcsid[] = "$Id$";
+static char rcsid[] = "$Id: clients.c,v 1.25 2008/05/09 12:35:57 james Exp $";
-/*
- * $Log$
+/*
+ * $Log: clients.c,v $
+ * Revision 1.25 2008/05/09 12:35:57 james
+ * *** empty log message ***
+ *
+ * Revision 1.24 2008/03/11 17:56:04 james
+ * *** empty log message ***
+ *
+ * Revision 1.23 2008/03/11 17:47:24 james
+ * *** empty log message ***
+ *
+ * Revision 1.22 2008/03/07 14:16:44 james
+ * *** empty log message ***
+ *
+ * Revision 1.21 2008/03/07 14:13:40 james
+ * *** empty log message ***
+ *
+ * Revision 1.20 2008/03/07 13:56:39 james
+ * *** empty log message ***
+ *
+ * Revision 1.19 2008/03/07 13:16:02 james
+ * *** empty log message ***
+ *
+ * Revision 1.18 2008/03/03 18:16:16 james
+ * *** empty log message ***
+ *
+ * Revision 1.17 2008/03/03 18:15:19 james
+ * *** empty log message ***
+ *
+ * Revision 1.16 2008/03/03 06:04:42 james
+ * *** empty log message ***
+ *
+ * Revision 1.15 2008/03/02 10:27:24 james
+ * *** empty log message ***
+ *
+ * Revision 1.14 2008/02/28 16:57:51 james
+ * *** empty log message ***
+ *
+ * Revision 1.13 2008/02/28 16:37:16 james
+ * *** empty log message ***
+ *
+ * Revision 1.12 2008/02/28 12:12:24 james
+ * *** empty log message ***
+ *
* Revision 1.11 2008/02/23 11:48:51 james
* *** empty log message ***
*
#include <malloc.h>
#include "clients.h"
-static void
-client_msg (IPC_Msg * m, Context * c)
+
+void
+client_initialize (Client * c, Context * ctx)
+{
+ send_history (ctx->h, c);
+ send_vt102 (ctx->v, c);
+ c->initialized = 1;
+}
+
+void
+client_execute_message (Client * client, IPC_Msg * m, Context * c)
{
switch (m->hdr.type)
{
-
case IPC_MSG_TYPE_NOOP:
break;
case IPC_MSG_TYPE_DEBUG:
- fprintf (stderr, "%p [%d] %s\n", m, m->hdr.size, m->debug.msg);
+ log_f (c->l, "<debug message %s>", m->debug.msg);
break;
case IPC_MSG_TYPE_KEY:
vt102_send (c, m->key.key);
case IPC_MSG_TYPE_SETBAUD:
tty_set_baud (c->t, m->setbaud.baud);
tty_parse_reset (c);
-
log_f (c->l, "<baud changed to %d>", m->setbaud.baud);
break;
case IPC_MSG_TYPE_SENDBREAK:
+ log_f (c->l, "<break sent>");
tty_send_break (c->t);
break;
case IPC_MSG_TYPE_SETFLOW:
+ log_f (c->l, "<flow control turned %s>",
+ m->setflow.flow ? "on" : "off");
tty_set_flow (c->t, m->setflow.flow);
break;
case IPC_MSG_TYPE_SETANSI:
vt102_set_ansi (c->v, m->setansi.ansi);
break;
case IPC_MSG_TYPE_HANGUP:
+ log_f (c->l, "<hangup initiated>");
tty_hangup (c->t);
break;
+ case IPC_MSG_TYPE_SETSIZE:
+ vt102_resize (c, m->setsize.winsize);
+ break;
+ case IPC_MSG_TYPE_RESET:
+ vt102_reset (c);
+ break;
+ case IPC_MSG_TYPE_INITIALIZE:
+ client_initialize (client, c);
+ break;
+ case IPC_MSG_TYPE_KILLME:
+ client->dead++;
+ break;
+
default:
- fprintf (stderr, "Unhandeled message type %d\n", m->hdr.type);
+ log_f (c->l, "<Unhandled message type %d>", m->hdr.type);
}
}
+
void
client_free (Client * c)
{
{
Client *c;
- c = (Client *) malloc (sizeof (Client));
+ c = (Client *) xmalloc (sizeof (Client));
+ c->initialized = 0;
c->dead = 0;
c->s = s;
c->next = cs->head;
fprintf (stderr, "Client at %p created\n", c);
#endif
+ log_f (ctx->l, "<client %p connected - now %d clients>", c, cs->n);
if (ipc_msg_send_debug (s, "new_client"))
c->dead++;
}
void
-clients_reap (Clients * cs)
+clients_reap (Clients * cs, Context * ctx)
{
Client **p, *c;
*p = c->next;
client_free (c);
cs->n--;
+ log_f (ctx->l, "<client %p disconnected - now %d clients>", c,
+ cs->n);
}
else
{
Clients *
clients_new (void)
{
- Clients *ret = (Clients *) malloc (sizeof (Clients));
+ Clients *ret = (Clients *) xmalloc (sizeof (Clients));
ret->n = 0;
ret->head = NULL;
if (c->s->msg)
{
- client_msg (c->s->msg, ctx);
+ client_execute_message (c, c->s->msg, ctx);
socket_consume_msg (c->s);
+ if (c->dead)
+ deaded++;
}
}
if (deaded)
- clients_reap (cs);
+ clients_reap (cs, ctx);
}
void
-clients_shutdown (Clients * cs)
+clients_shutdown (Clients * cs, Context * ctx)
{
Client *c;
}
- clients_reap (cs);
+ clients_reap (cs, ctx);
}
for (c = cs->head; c; c = c->next)
{
- if (!c->dead)
+ if (!c->dead && c->initialized)
if (ipc_msg_send (c->s, (IPC_Msg *) m))
c->dead++;
}
for (c = cs->head; c; c = c->next)
{
- if (!c->dead)
+ if (!c->dead && c->initialized)
if (ipc_msg_send (c->s, (IPC_Msg *) m))
c->dead++;
}