aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjames <>2008-02-09 15:47:28 +0000
committerjames <>2008-02-09 15:47:28 +0000
commit5ee4b614cdc64a13aeeb00bf0e0ecbc234e8852d (patch)
treec422688a5e8a11bd177566121473ba1f0000612b
parenta4101322d71ce2f800d741e98ec8f537c70b663f (diff)
downloadsympathy-5ee4b614cdc64a13aeeb00bf0e0ecbc234e8852d.tar.gz
sympathy-5ee4b614cdc64a13aeeb00bf0e0ecbc234e8852d.tar.bz2
sympathy-5ee4b614cdc64a13aeeb00bf0e0ecbc234e8852d.zip
*** empty log message ***
-rw-r--r--src/Makefile.am5
-rw-r--r--src/context.h29
-rw-r--r--src/project.h7
-rw-r--r--src/ptty.c157
-rw-r--r--src/tty.c206
-rw-r--r--src/tty.h15
6 files changed, 212 insertions, 207 deletions
diff --git a/src/Makefile.am b/src/Makefile.am
index 59bd862..3afac2b 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -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
index 0000000..365931f
--- /dev/null
+++ b/src/context.h
@@ -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__ */
diff --git a/src/project.h b/src/project.h
index e7ed065..9de6b17 100644
--- a/src/project.h
+++ b/src/project.h
@@ -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 ***
*
@@ -86,6 +89,10 @@
#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
index 0000000..dee241b
--- /dev/null
+++ b/src/ptty.c
@@ -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;
+}
diff --git a/src/tty.c b/src/tty.c
index 0539646..8f01f24 100644
--- 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);
-}
diff --git a/src/tty.h b/src/tty.h
index 1da8339..51634ed 100644
--- 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 ***
*
@@ -23,9 +26,17 @@
#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__ */