From b1f5cc058d5f2880b75b7af5dcc746942c2d7279 Mon Sep 17 00:00:00 2001 From: james Date: Sat, 9 Feb 2008 15:47:28 +0000 Subject: [PATCH 1/1] *** empty log message *** --- src/Makefile.am | 5 +- src/context.h | 29 +++++++ src/project.h | 7 ++ src/ptty.c | 157 ++++++++++++++++++++++++++++++++++++ src/tty.c | 206 +----------------------------------------------- src/tty.h | 15 +++- 6 files changed, 212 insertions(+), 207 deletions(-) create mode 100644 src/context.h create mode 100644 src/ptty.c 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 , + * 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 , + * 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 , * 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__ */ -- 2.30.2