diff options
author | james <> | 2008-02-09 15:47:28 +0000 |
---|---|---|
committer | james <> | 2008-02-09 15:47:28 +0000 |
commit | 5ee4b614cdc64a13aeeb00bf0e0ecbc234e8852d (patch) | |
tree | c422688a5e8a11bd177566121473ba1f0000612b /src/tty.c | |
parent | a4101322d71ce2f800d741e98ec8f537c70b663f (diff) | |
download | sympathy-5ee4b614cdc64a13aeeb00bf0e0ecbc234e8852d.tar.gz sympathy-5ee4b614cdc64a13aeeb00bf0e0ecbc234e8852d.tar.bz2 sympathy-5ee4b614cdc64a13aeeb00bf0e0ecbc234e8852d.zip |
*** empty log message ***
Diffstat (limited to 'src/tty.c')
-rw-r--r-- | src/tty.c | 206 |
1 files changed, 2 insertions, 204 deletions
@@ -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); -} |