chiark / gitweb /
Install serialmgr and run_sympathy in examples directory (uncompressed)
[sympathy.git] / apps / clients.c
index 4c4ea212fd46e57fbc0c7893a66dc88e4a173150..9f97a676d59e0b105de56b8272ad873883ba70a4 100644 (file)
@@ -1,15 +1,45 @@
-/*
+/* 
  * clients.c:
  *
- * Copyright (c) 2008 James McKenzie <james@fishsoup.dhs.org>,
+ * Copyright (c) 2008 James McKenzie <sympathy@madingley.org>,
  * All rights reserved.
  *
  */
 
-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 ***
  *
@@ -65,48 +95,68 @@ static char rcsid[] = "$Id$";
 #include <malloc.h>
 #include "clients.h"
 
+
 void
-client_msg (IPC_Msg * m, Context * c)
+client_initialize (Client * c, Context * ctx)
 {
-  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);
-    break;
-  case IPC_MSG_TYPE_KEY:
-    vt102_send (c, m->key.key);
-    break;
-  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:
-    tty_send_break (c->t);
-    break;
-  case IPC_MSG_TYPE_SETFLOW:
-    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:
-    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;
-  default:
-    fprintf (stderr, "Unhandeled message type %d\n", m->hdr.type);
-  }
+  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:
+      log_f (c->l, "<debug message %s>", m->debug.msg);
+      break;
+    case IPC_MSG_TYPE_KEY:
+      vt102_send (c, m->key.key);
+      break;
+    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:
+      log_f (c->l, "<Unhandled message type %d>", m->hdr.type);
+    }
+}
+
+
 void
 client_free (Client * c)
 {
@@ -124,8 +174,9 @@ clients_new_client (Clients * cs, Socket * s, Context * ctx)
 {
   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;
@@ -137,6 +188,7 @@ clients_new_client (Clients * cs, Socket * s, Context * ctx)
   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++;
@@ -145,28 +197,34 @@ clients_new_client (Clients * cs, Socket * s, Context * ctx)
 }
 
 void
-clients_reap (Clients * cs)
+clients_reap (Clients * cs, Context * ctx)
 {
   Client **p, *c;
 
 
-  for (p = &cs->head; *p;) {
-    Client *c = *p;
-
-    if (c->dead) {
-      *p = c->next;
-      client_free (c);
-      cs->n--;
-    } else {
-      p = &(c->next);
+  for (p = &cs->head; *p;)
+    {
+      Client *c = *p;
+
+      if (c->dead)
+        {
+          *p = c->next;
+          client_free (c);
+          cs->n--;
+          log_f (ctx->l, "<client %p disconnected - now %d clients>", c,
+                 cs->n);
+        }
+      else
+        {
+          p = &(c->next);
+        }
     }
-  }
 }
 
 Clients *
 clients_new (void)
 {
-  Clients *ret = (Clients *) malloc (sizeof (Clients));
+  Clients *ret = (Clients *) xmalloc (sizeof (Clients));
 
   ret->n = 0;
   ret->head = NULL;
@@ -179,9 +237,10 @@ clients_pre_select (Clients * cs, fd_set * rfds, fd_set * wfds)
 {
   Client *c;
 
-  for (c = cs->head; c; c = c->next) {
-    socket_pre_select (c->s, rfds, wfds);
-  }
+  for (c = cs->head; c; c = c->next)
+    {
+      socket_pre_select (c->s, rfds, wfds);
+    }
 }
 
 void
@@ -191,35 +250,41 @@ clients_post_select (Clients * cs, Context * ctx, fd_set * rfds,
   Client *c;
   int deaded = 0;
 
-  for (c = cs->head; c; c = c->next) {
-    if (socket_post_select (c->s, rfds, wfds)) {
-      c->dead++;
-      deaded++;
-    }
+  for (c = cs->head; c; c = c->next)
+    {
+      if (socket_post_select (c->s, rfds, wfds))
+        {
+          c->dead++;
+          deaded++;
+        }
+
+      if (c->s->msg)
+        {
+          client_execute_message (c, c->s->msg, ctx);
+          socket_consume_msg (c->s);
+          if (c->dead)
+            deaded++;
+        }
 
-    if (c->s->msg) {
-      client_msg (c->s->msg, ctx);
-      socket_consume_msg (c->s);
     }
 
-  }
-
   if (deaded)
-    clients_reap (cs);
+    clients_reap (cs, ctx);
 }
 
 
 void
-clients_shutdown (Clients * cs)
+clients_shutdown (Clients * cs, Context * ctx)
 {
   Client *c;
 
-  for (c = cs->head; c; c = c->next) {
-    c->dead++;
-  }
+  for (c = cs->head; c; c = c->next)
+    {
+      c->dead++;
+    }
 
 
-  clients_reap (cs);
+  clients_reap (cs, ctx);
 }
 
 
@@ -250,11 +315,12 @@ send_status (Clients * cs, char *msg)
   strncpy (m->status, msg, IPC_MAX_BUF);
   m->status[IPC_MAX_BUF - 1] = 0;
 
-  for (c = cs->head; c; c = c->next) {
-    if (!c->dead)
-      if (ipc_msg_send (c->s, (IPC_Msg *) m))
-        c->dead++;
-  }
+  for (c = cs->head; c; c = c->next)
+    {
+      if (!c->dead && c->initialized)
+        if (ipc_msg_send (c->s, (IPC_Msg *) m))
+          c->dead++;
+    }
 
   return len;
 }
@@ -278,11 +344,12 @@ send_output (Clients * cs, void *buf, int len)
   m->len = len;
   memcpy (m->term, buf, len);
 
-  for (c = cs->head; c; c = c->next) {
-    if (!c->dead)
-      if (ipc_msg_send (c->s, (IPC_Msg *) m))
-        c->dead++;
-  }
+  for (c = cs->head; c; c = c->next)
+    {
+      if (!c->dead && c->initialized)
+        if (ipc_msg_send (c->s, (IPC_Msg *) m))
+          c->dead++;
+    }
 
 
   return len;
@@ -296,16 +363,18 @@ send_history (History * h, Client * c)
   HISTORY_INC (h, rptr);
 
   HISTORY_INC (h, rptr);
-  while (rptr != h->wptr) {
-    History_ent *l = &h->lines[rptr];
-    if (l->valid) {
+  while (rptr != h->wptr)
+    {
+      History_ent *l = &h->lines[rptr];
+      if (l->valid)
+        {
 
-      if (ipc_msg_send_history (c->s, l))
-        c->dead++;
+          if (ipc_msg_send_history (c->s, l))
+            c->dead++;
 
+        }
+      HISTORY_INC (h, rptr);
     }
-    HISTORY_INC (h, rptr);
-  }
 }
 
 void