chiark / gitweb /
*** empty log message ***
authorjames <james>
Thu, 14 Feb 2008 10:34:30 +0000 (10:34 +0000)
committerjames <james>
Thu, 14 Feb 2008 10:34:30 +0000 (10:34 +0000)
apps/client.c
apps/clients.c
apps/clients.h
apps/sympathyd.c
src/tty.c
src/tty.h

index 90bcf609bd2528e7000db6295082d92137b9eca6..28526f223a7f37dde24e3342f69da982c9335d9f 100644 (file)
@@ -10,6 +10,9 @@ static char rcsid[] = "$Id$";
 
 /*
  * $Log$
+ * Revision 1.4  2008/02/14 10:34:30  james
+ * *** empty log message ***
+ *
  * Revision 1.3  2008/02/14 02:46:44  james
  * *** empty log message ***
  *
@@ -24,6 +27,8 @@ static char rcsid[] = "$Id$";
 #include <sympathy.h>
 #include "client.h"
 
+  //vt102_status_line (v, "VT102 foo bar baz I'm the urban spaceman baby");
+
 static void
 server_msg (IPC_Msg * m, Context * c)
 {
@@ -47,6 +52,9 @@ server_msg (IPC_Msg * m, Context * c)
     case IPC_MSG_TYPE_TERM:
       vt102_parse (c, m->term.term, m->term.len);
       break;
+    case IPC_MSG_TYPE_STATUS:
+       vt102_status_line(c->v,m->status.status);
+       break;
     default:
       fprintf (stderr, "Unhandeled message type %d\n", m->hdr.type);
     }
index b5bafcdabd42e146565beb74f61074b2245edc73..cd7bcee8d7593829a1fef8beacfb6c34cc9eea4e 100644 (file)
@@ -10,6 +10,9 @@ static char rcsid[] = "$Id$";
 
 /*
  * $Log$
+ * Revision 1.4  2008/02/14 10:34:30  james
+ * *** empty log message ***
+ *
  * Revision 1.3  2008/02/14 02:46:44  james
  * *** empty log message ***
  *
@@ -148,8 +151,61 @@ clients_post_select (Clients * cs, Context * ctx, fd_set * rfds,
     clients_reap (cs);
 }
 
+
+void
+clients_shutdown (Clients * cs)
+{
+  Client *c;
+
+  for (c = cs->head; c; c = c->next)
+    {
+      c->dead++;
+    }
+
+
+  clients_reap (cs);
+}
+
+
+
+
+
+
 int
-clients_output (Clients * cs, void *buf, int len)
+send_status (Clients * cs, char *msg)
+{
+  char mbuf[IPC_MAX_BUF + sizeof (IPC_Msg_status)];
+  IPC_Msg_status *m = (IPC_Msg_status *) mbuf;
+  int len;
+
+  Client *c;
+
+  if (!msg) return;
+  len=strlen(msg)+1;
+
+  if (!len)
+    return;
+  if (len > IPC_MAX_BUF)
+    len = IPC_MAX_BUF;
+
+  m->size = len + sizeof (IPC_Msg_status);
+  m->type = IPC_MSG_TYPE_STATUS;
+  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++;
+    }
+
+  return len;
+}
+
+
+int
+send_output (Clients * cs, void *buf, int len)
 {
   char mbuf[IPC_MAX_BUF + sizeof (IPC_Msg_term)];
   IPC_Msg_term *m = (IPC_Msg_term *) mbuf;
@@ -178,15 +234,33 @@ clients_output (Clients * cs, void *buf, int len)
 }
 
 void
-clients_shutdown (Clients * cs)
+send_history (History * h, Client * c)
 {
-  Client *c;
+  int rptr = h->wptr;
 
-  for (c = cs->head; c; c = c->next)
+  HISTORY_INC (h, rptr);
+
+  HISTORY_INC (h, rptr);
+  while (rptr != h->wptr)
     {
-      c->dead++;
+      History_ent *l = &h->lines[rptr];
+      if (l->valid)
+        {
+
+          if (ipc_msg_send_history (c->s, l))
+            c->dead++;
+
+        }
+      HISTORY_INC (h, rptr);
     }
+}
 
+void
+send_vt102 (VT102 * v, Client * c)
+{
+  if (ipc_msg_send_vt102 (c->s, v))
+    c->dead++;
 
-  clients_reap (cs);
 }
+
+
index c59a521c49fac7e689de69338e00fba5d2926b3d..605b3cda8834a9ab7c421767e16d4d4cf677ca91 100644 (file)
@@ -12,6 +12,9 @@
 
 /*
  * $Log$
+ * Revision 1.4  2008/02/14 10:34:30  james
+ * *** empty log message ***
+ *
  * Revision 1.3  2008/02/14 02:46:44  james
  * *** empty log message ***
  *
@@ -40,11 +43,18 @@ typedef struct
 } Clients;
 
 
-extern Clients *clients_new (void);
-extern void clients_pre_select (Clients *, fd_set *, fd_set *);
-extern void clients_post_select (Clients *, Context *, fd_set *, fd_set *);
-extern Client *clients_new_client (Clients *, Socket *, Context *);
-extern void clients_shutdown (Clients *);
-extern int clients_output (Clients *, void *, int);
+/* clients.c */
+extern void client_free(Client *c);
+extern Client *clients_new_client(Clients *cs, Socket *s, Context *ctx);
+extern void clients_reap(Clients *cs);
+extern Clients *clients_new(void);
+extern void clients_pre_select(Clients *cs, fd_set *rfds, fd_set *wfds);
+extern void clients_post_select(Clients *cs, Context *ctx, fd_set *rfds, fd_set *wfds);
+extern void clients_shutdown(Clients *cs);
+
+extern int send_output(Clients *cs, void *buf, int len);
+extern int send_status(Clients *cs, char *msg);
+extern void send_history(History *h, Client *c);
+extern void send_vt102(VT102 *v, Client *c);
 
-#endif /* __CLIENTS_H__ */
+#endif
index 49dd3120bc759b37522d2aca31aeabc9951adc0b..352b6a9f01bf34759e16c95e44fcc5a7fb0c1cd2 100644 (file)
@@ -11,6 +11,9 @@ static char rcsid[] =
 
 /*
  * $Log$
+ * Revision 1.9  2008/02/14 10:34:47  james
+ * *** empty log message ***
+ *
  * Revision 1.8  2008/02/14 10:34:30  james
  * *** empty log message ***
  *
@@ -174,7 +177,7 @@ log_line_changes (Context * ctx, int old, int new)
 }
 
 static char *
-do_line (char *ptr,int lines, int line)
+do_line (char *ptr, int lines, int line)
 {
   char *lname;
 
@@ -207,8 +210,9 @@ check_status (Context * c, Clients * cs)
 
   log_line_changes (c, old_status.lines, status.lines);
 
-  t=c->t->name;
-  if (!strncmp(t,"/dev/",5)) t+=5;
+  t = c->t->name;
+  if (!strncmp (t, "/dev/", 5))
+    t += 5;
   while (*t)
     *(ptr++) = *(t++);
 
@@ -220,12 +224,13 @@ check_status (Context * c, Clients * cs)
   ptr = do_line (ptr, status.lines, TIOCM_DSR);
   ptr = do_line (ptr, status.lines, TIOCM_RI);
 
-  if (status.crtscts) {
-       t=", Flow";
-  while (*t)
-    *(ptr++) = *(t++);
+  if (status.crtscts)
+    {
+      t = ", Flow";
+      while (*t)
+        *(ptr++) = *(t++);
     }
+
   if (status.lines & TIOCM_CD)
     {
       ptr +=
@@ -239,7 +244,9 @@ check_status (Context * c, Clients * cs)
                  status.cd_edge_sec % 60);
     }
 
-  ptr += sprintf (ptr, ", %d client%s", status.nclients,(status.nclients==1) ? "":"s");
+  ptr +=
+    sprintf (ptr, ", %d client%s", status.nclients,
+             (status.nclients == 1) ? "" : "s");
 
   *ptr = 0;
 
index ca4936bbc81b3c03a24aef54481bb2933307e4e9..fb60246c51a488e226500193f88cd57ca49c18b7 100644 (file)
--- a/src/tty.c
+++ b/src/tty.c
@@ -10,6 +10,9 @@ static char rcsid[] = "$Id$";
 
 /*
  * $Log$
+ * Revision 1.7  2008/02/14 10:34:30  james
+ * *** empty log message ***
+ *
  * Revision 1.6  2008/02/13 16:59:34  james
  * *** empty log message ***
  *
@@ -27,12 +30,198 @@ static char rcsid[] = "$Id$";
 
 #include "project.h"
 
+static int
+speed_t_to_baud (speed_t s)
+{
+  switch (s)
+    {
+#ifdef B0
+    case B0:
+      return 0;
+#endif
+#ifdef B50
+    case B50:
+      return 50;
+#endif
+#ifdef B75
+    case B75:
+      return 75;
+#endif
+#ifdef B110
+    case B110:
+      return 110;
+#endif
+#ifdef B134
+    case B134:
+      return 134;
+#endif
+#ifdef B150
+    case B150:
+      return 150;
+#endif
+#ifdef B200
+    case B200:
+      return 200;
+#endif
+#ifdef B300
+    case B300:
+      return 300;
+#endif
+#ifdef B600
+    case B600:
+      return 600;
+#endif
+#ifdef B1200
+    case B1200:
+      return 1200;
+#endif
+#ifdef B1800
+    case B1800:
+      return 1800;
+#endif
+#ifdef B2400
+    case B2400:
+      return 2400;
+#endif
+#ifdef B4800
+    case B4800:
+      return 4800;
+#endif
+#ifdef B9600
+    case B9600:
+      return 9600;
+#endif
+#ifdef B19200
+    case B19200:
+      return 19200;
+#endif
+#ifdef B38400
+    case B38400:
+      return 38400;
+#endif
+#ifdef B57600
+    case B57600:
+      return 57600;
+#endif
+#ifdef B115200
+    case B115200:
+      return 115200;
+#endif
+#ifdef B230400
+    case B230400:
+      return 230400;
+#endif
+    }
+
+  return -1;
+}
+
+static speed_t
+baud_to_speed_t (int baud)
+{
+  switch (baud)
+    {
+#ifdef B0
+    case 0:
+      return B0;
+#endif
+#ifdef B50
+    case 50:
+      return B50;
+#endif
+#ifdef B75
+    case 75:
+      return B75;
+#endif
+#ifdef B110
+    case 110:
+      return B110;
+#endif
+#ifdef B134
+    case 134:
+      return B134;
+#endif
+#ifdef B150
+    case 150:
+      return B150;
+#endif
+#ifdef B200
+    case 200:
+      return B200;
+#endif
+#ifdef B300
+    case 300:
+      return B300;
+#endif
+#ifdef B600
+    case 600:
+      return B600;
+#endif
+#ifdef B1200
+    case 1200:
+      return B1200;
+#endif
+#ifdef B1800
+    case 1800:
+      return B1800;
+#endif
+#ifdef B2400
+    case 2400:
+      return B2400;
+#endif
+#ifdef B4800
+    case 4800:
+      return B4800;
+#endif
+#ifdef B9600
+    case 9600:
+      return B9600;
+#endif
+#ifdef B19200
+    case 19200:
+      return B19200;
+#endif
+#ifdef B38400
+    case 38400:
+      return B38400;
+#endif
+#ifdef B57600
+    case 57600:
+      return B57600;
+#endif
+#ifdef B115200
+    case 115200:
+      return B115200;
+#endif
+#ifdef B230400
+    case 230400:
+      return B230400;
+#endif
+    }
+  return -1;
+}
+
 void
 tty_pre_select (TTY * t, fd_set * rfds, fd_set * wfds)
 {
   FD_SET (t->rfd, rfds);
 }
 
+int
+tty_get_status (TTY * t, TTY_Status * s)
+{
+
+       s->lines=0;
+  ioctl (t->rfd, TIOCMGET, &s->lines);
+
+  if (tcgetattr (t->rfd, &s->termios))
+    return -1;
+  s->baud=speed_t_to_baud(cfgetispeed(&s->termios));
+
+  return 0;
+}
+
 #if 0
 int
 tty_post_select (Context * c, fd_set * rfds, fd_set * wfds)
index 91b14c664b491711d5eb3305b34dc9afae9ab350..5286c28134b4a22e4f0c439da82eea88b2d4b197 100644 (file)
--- a/src/tty.h
+++ b/src/tty.h
@@ -12,6 +12,9 @@
 
 /*
  * $Log$
+ * Revision 1.6  2008/02/14 10:34:30  james
+ * *** empty log message ***
+ *
  * Revision 1.5  2008/02/13 09:12:21  james
  * *** empty log message ***
  *
@@ -46,4 +49,10 @@ typedef struct TTY_struct
   TTY_SIGNATURE;
 } TTY;
 
+typedef struct {
+  int lines;
+  struct termios termios;
+  int baud;
+} TTY_Status;
+
 #endif /* __TTY_H__ */