chiark / gitweb /
*** empty log message ***
authorjames <james>
Sat, 9 Feb 2008 15:47:28 +0000 (15:47 +0000)
committerjames <james>
Sat, 9 Feb 2008 15:47:28 +0000 (15:47 +0000)
src/Makefile.am
src/context.h [new file with mode: 0644]
src/project.h
src/ptty.c [new file with mode: 0644]
src/tty.c
src/tty.h

index 59bd862bcc69554cca3fe2537ce256ec5962a52f..3afac2b292e1d9f9ef3cd9da3643f7040b031eb5 100644 (file)
@@ -8,6 +8,9 @@
 # $Id$
 #
 # $Log$
+# Revision 1.6  2008/02/09 15:47:28  james
+# *** empty log message ***
+#
 # Revision 1.5  2008/02/08 15:06:42  james
 # *** empty log message ***
 #
@@ -30,7 +33,7 @@
 INCLUDES = 
 
 SRCS= ansi.c crt.c html.c libsympathy.c render.c  version.c vt102.c tty.c \
-       history.c buf.c
+       history.c buf.c ptty.c
 CPROTO=cproto
 
 SYMPATHYSRCS=${SRCS}
diff --git a/src/context.h b/src/context.h
new file mode 100644 (file)
index 0000000..365931f
--- /dev/null
@@ -0,0 +1,29 @@
+/*
+ * context.h:
+ *
+ * Copyright (c) 2008 James McKenzie <james@fishsoup.dhs.org>,
+ * All rights reserved.
+ *
+ */
+
+/*
+ * $Id$
+ */
+
+/*
+ * $Log$
+ * Revision 1.1  2008/02/09 15:47:28  james
+ * *** empty log message ***
+ *
+ */
+
+#ifndef __CONTEXT_H__
+#define __CONTEXT_H__
+
+typedef struct {
+VT102 *v;
+TTY *t;
+History *h;
+} Context;
+
+#endif /* __CONTEXT_H__ */
index e7ed065080e1664ef967ed62c32a4c45638de4b4..9de6b17cfb6ff8fd440732cb69e3a76bf91a41cb 100644 (file)
@@ -12,6 +12,9 @@
 
 /*
  * $Log$
+ * Revision 1.6  2008/02/09 15:47:28  james
+ * *** empty log message ***
+ *
  * Revision 1.5  2008/02/07 00:39:13  james
  * *** empty log message ***
  *
 #include "ansi.h"
 #include "vt102.h"
 #include "keys.h"
+#include "history.h"
+#include "ring.h"
+
+#include "context.h"
 
 #include "prototypes.h"
 
diff --git a/src/ptty.c b/src/ptty.c
new file mode 100644 (file)
index 0000000..dee241b
--- /dev/null
@@ -0,0 +1,157 @@
+/*
+ * ptty.c:
+ *
+ * Copyright (c) 2008 James McKenzie <james@fishsoup.dhs.org>,
+ * All rights reserved.
+ *
+ */
+
+static char rcsid[] = "$Id$";
+
+/*
+ * $Log$
+ * Revision 1.1  2008/02/09 15:47:28  james
+ * *** empty log message ***
+ *
+ * Revision 1.2  2008/02/07 11:11:14  staffcvs
+ * *** empty log message ***
+ *
+ * Revision 1.1  2008/02/07 01:02:52  james
+ * *** empty log message ***
+ *
+ * Revision 1.3  2008/02/06 17:53:28  james
+ * *** empty log message ***
+ *
+ * Revision 1.2  2008/02/04 02:05:06  james
+ * *** empty log message ***
+ *
+ * Revision 1.1  2008/02/04 01:32:39  james
+ * *** empty log message ***
+ *
+ */
+
+#include "project.h"
+
+
+typedef struct {
+       TTY_SIGNATURE;
+       int fd;
+       pid_t child;
+} PTTY;
+
+
+void ptty_close(TTY *_t)
+{
+PTTY *t=(PTTY *) _t;
+
+if (!t) return;
+
+close(t->fd);
+free(t);
+}
+
+
+
+static int
+ptty_read (TTY * _t, void *buf, int len)
+{
+PTTY *t=(PTTY *)_t;
+  int red, done = 0;
+
+  do
+    {
+
+      red = wrap_read (t->fd, buf, len);
+      if (red < 0)
+        return -1;
+      if (!red)
+        return done;
+
+      buf += red;
+      len -= red;
+      done += red;
+    }
+  while (len);
+
+
+  return done;
+}
+
+
+static int
+ptty_write (TTY * _t, void *buf, int len)
+{
+  int writ, done = 0;
+  PTTY *t=(PTTY *) _t;
+
+  do
+    {
+
+      writ = wrap_write (t->fd, buf, len);
+      if (writ < 0)
+        return -1;
+      if (!writ)
+        sleep (1);
+
+      buf += writ;
+      len -= writ;
+      done += writ;
+    }
+  while (len);
+
+
+  return done;
+}
+
+TTY * ptty_open(char *path,char *argv[])
+{
+  PTTY *t;
+  pid_t child;
+  char name[1024];
+  struct winsize winsize = { 0 };
+  struct termios termios;
+  int fd;
+  char *default_argv={"-",(char *) 0};
+
+  child = forkpty (&fd, name, &termios, &winsize);
+
+  switch (child)
+    {
+    case -1:                   /*boo hiss */
+      return -1;
+    case 0:                    /*waaah */
+      setenv ("TERM", "vt102", 1);
+      setenv ("LANG", "C", 1);
+       if (!path) 
+               path="/bin/sh";
+       if (!argv) 
+               argv=default_argv;
+               
+      execv (path,argv);
+      _exit (-1);
+    }
+
+  set_nonblocking (fd);
+
+  t=(PTTY*) malloc(sizeof(PTTY));
+
+  strncpy(t->name,name,sizeof(t->name));
+  t->name[sizeof(t->name)-1]=0;
+
+  t->read=ptty_read;
+  t->write=ptty_write;
+  t->close=ptty_close;
+
+  default_termios (&termios);
+
+  winsize.ws_row = VT102_ROWS;
+  winsize.ws_col = VT102_COLS;
+
+  t->fd = open_fd_to_pty (path,argv);
+  t->pid=child;
+  t->rfd=t->fd;
+  t->wfd=0;
+
+  return (TTY *) t;
+}
index 053964672647b345bbc1bb423780cf0ec0f357ed..8f01f2493bd256c1253b933fa5dd9ee5a4cccb28 100644 (file)
--- a/src/tty.c
+++ b/src/tty.c
@@ -1,5 +1,5 @@
 /*
- * testtty.c:
+ * tty.c:
  *
  * Copyright (c) 2008 James McKenzie <james@fishsoup.dhs.org>,
  * All rights reserved.
@@ -10,210 +10,8 @@ static char rcsid[] = "$Id$";
 
 /*
  * $Log$
- * Revision 1.2  2008/02/07 11:11:14  staffcvs
- * *** empty log message ***
- *
- * Revision 1.1  2008/02/07 01:02:52  james
- * *** empty log message ***
- *
- * Revision 1.3  2008/02/06 17:53:28  james
- * *** empty log message ***
- *
- * Revision 1.2  2008/02/04 02:05:06  james
- * *** empty log message ***
- *
- * Revision 1.1  2008/02/04 01:32:39  james
+ * Revision 1.3  2008/02/09 15:47:28  james
  * *** empty log message ***
  *
  */
 
-#include "project.h"
-
-static void
-set_nonblocking (int fd)
-{
-  long arg;
-  arg = fcntl (fd, F_GETFL, arg);
-  arg |= O_NONBLOCK;
-  fcntl (fd, F_SETFL, arg);
-}
-
-static void
-set_blocking (int fd)
-{
-  long arg;
-  arg = fcntl (fd, F_GETFL, arg);
-  arg &= ~O_NONBLOCK;
-  fcntl (fd, F_SETFL, arg);
-}
-
-static void
-default_termios (struct termios *termios)
-{
-
-  memset (termios, 0, sizeof (termios));
-
-  termios->c_iflag = ICRNL | IXON;
-  termios->c_oflag = OPOST | ONLCR | NL0 | CR0 | TAB0 | BS0 | VT0 | FF0;
-  termios->c_lflag =
-    ISIG | ICANON | IEXTEN | ECHO | ECHOE | ECHOK | ECHOCTL | ECHOKE;
-
-  termios->c_cc[VINTR] = 003;
-  termios->c_cc[VQUIT] = 034;
-  termios->c_cc[VERASE] = 0177;
-  termios->c_cc[VKILL] = 025;
-  termios->c_cc[VEOF] = 004;
-  termios->c_cc[VEOL] = 0;
-  termios->c_cc[VEOL2] = 0;
-  termios->c_cc[VSTART] = 021;
-  termios->c_cc[VSTOP] = 023;
-  termios->c_cc[VSUSP] = 032;
-  termios->c_cc[VLNEXT] = 026;
-  termios->c_cc[VWERASE] = 027;
-  termios->c_cc[VREPRINT] = 022;
-  termios->c_cc[VDISCARD] = 017;
-
-  termios->c_cflag = CS8 | CREAD | CLOCAL;
-
-  cfsetispeed (termios, B9600);
-  cfsetospeed (termios, B9600);
-}
-
-
-static int
-open_fd_to_bash (void)          /*thump */
-{
-  pid_t child;
-  int fd;
-  struct winsize winsize = { 0 };
-  struct termios termios;
-
-  default_termios (&termios);
-
-  winsize.ws_row = VT102_ROWS;
-  winsize.ws_col = VT102_COLS;
-
-  child = forkpty (&fd, NULL, &termios, &winsize);
-
-  switch (child)
-    {
-    case -1:                   /*boo hiss */
-      return -1;
-    case 0:                    /*waaah */
-      setenv ("TERM", "vt102", 1);
-      setenv ("LANG", "C", 1);
-      execl ("/bin/sh", "-", (char *) 0);
-      _exit (-1);
-    }
-
-  return fd;
-}
-
-
-TTY *
-tty_new_test (void)
-{
-  TTY *t;
-  t = (TTY *) malloc (sizeof (TTY));
-  t->fd = open_fd_to_bash ();
-
-  set_nonblocking (t->fd);
-
-  return t;
-}
-
-static int
-wrap_read (int fd, void *buf, int len)
-{
-  int red;
-
-  red = read (fd, buf, len);
-  if (!red)
-    return -1;
-
-  if ((red < 0) && (errno == EAGAIN))
-    red = 0;
-
-  return red;
-}
-
-static int
-wrap_write (int fd, void *buf, int len)
-{
-  int writ;
-
-  writ = write (fd, buf, len);
-  if (!writ)
-    return -1;
-
-  if ((writ < 0) && (errno == -EAGAIN))
-    writ = 0;
-
-  return writ;
-}
-
-int
-tty_read (TTY * t, void *buf, int len)
-{
-  int red, done = 0;
-
-
-  do
-    {
-
-      red = wrap_read (t->fd, buf, len);
-      if (red < 0)
-        return -1;
-      if (!red)
-        return done;
-
-      buf += red;
-      len -= red;
-      done += red;
-    }
-  while (len);
-
-
-  return done;
-}
-
-
-int
-tty_write (TTY * t, void *buf, int len)
-{
-  int writ, done = 0;
-
-#if 0
-  {
-    int i;
-    uint8_t *p = buf;
-    for (i = 0; i < len; ++i)
-      fprintf (stderr, "vw: %03o %c\n", p[i], p[i] > 31 ? p[i] : 32);
-  }
-#endif
-
-  do
-    {
-
-      writ = wrap_write (t->fd, buf, len);
-      if (writ < 0)
-        return -1;
-      if (!writ)
-        sleep (1);
-
-      buf += writ;
-      len -= writ;
-      done += writ;
-    }
-  while (len);
-
-
-  return done;
-}
-
-void
-tty_free (TTY * t)
-{
-  close (t->fd);
-  free (t);
-}
index 1da83393eb5989593a5fea0afed1baa41b8668ac..51634edf713fa34a4f8916e6097b2210caee4491 100644 (file)
--- a/src/tty.h
+++ b/src/tty.h
@@ -12,6 +12,9 @@
 
 /*
  * $Log$
+ * Revision 1.3  2008/02/09 15:47:28  james
+ * *** empty log message ***
+ *
  * Revision 1.2  2008/02/07 00:43:27  james
  * *** empty log message ***
  *
 #ifndef __TTY_H__
 #define __TTY_H__
 
-typedef struct
+#define TTY_SIGNATURE \
+       char name[1024]; \
+       void (*close)(struct TTY_struct *); \
+       int (*recv)(struct TTY_struct *,void *buf,int len); \
+       int (*xmit)(struct TTY_struct *,void *buf,int len); \
+       int rfd; \
+       int wfd
+
+typedef struct TTY_struct
 {
-  int fd;
+  TTY_SIGNATURE;
 } TTY;
 
 #endif /* __TTY_H__ */