X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fptty.c;h=5a462e49ac960dc3787e834a3593a047f14a3070;hb=refs%2Fheads%2Fmaster;hp=860928e0135aa5ea81aa0802c22c46921a124047;hpb=0162da6f3043d60c28882b33f77c44afca226d46;p=sympathy.git diff --git a/src/ptty.c b/src/ptty.c index 860928e..5a462e4 100644 --- a/src/ptty.c +++ b/src/ptty.c @@ -1,15 +1,63 @@ -/* +/* * ptty.c: * - * Copyright (c) 2008 James McKenzie , + * Copyright (c) 2008 James McKenzie , * All rights reserved. * */ -static char rcsid[] = "$Id$"; +static char rcsid[] = "$Id: ptty.c,v 1.23 2008/03/12 01:30:23 james Exp $"; -/* - * $Log$ +/* + * $Log: ptty.c,v $ + * Revision 1.23 2008/03/12 01:30:23 james + * *** empty log message *** + * + * Revision 1.22 2008/03/12 01:26:56 james + * *** empty log message *** + * + * Revision 1.21 2008/03/10 11:49:33 james + * *** empty log message *** + * + * Revision 1.20 2008/03/07 13:16:02 james + * *** empty log message *** + * + * Revision 1.19 2008/03/07 12:37:04 james + * *** empty log message *** + * + * Revision 1.18 2008/03/03 06:04:42 james + * *** empty log message *** + * + * Revision 1.17 2008/03/02 10:37:56 james + * *** empty log message *** + * + * Revision 1.16 2008/02/28 16:57:52 james + * *** empty log message *** + * + * Revision 1.15 2008/02/27 09:42:53 james + * *** empty log message *** + * + * Revision 1.14 2008/02/27 09:42:22 james + * *** empty log message *** + * + * Revision 1.13 2008/02/27 01:31:38 james + * *** empty log message *** + * + * Revision 1.12 2008/02/27 01:31:14 james + * *** empty log message *** + * + * Revision 1.11 2008/02/26 23:23:17 james + * *** empty log message *** + * + * Revision 1.10 2008/02/24 00:42:53 james + * *** empty log message *** + * + * Revision 1.9 2008/02/23 13:05:58 staffcvs + * *** empty log message *** + * + * Revision 1.8 2008/02/23 11:48:37 james + * *** empty log message *** + * * Revision 1.7 2008/02/22 17:07:00 james * *** empty log message *** * @@ -51,8 +99,7 @@ static char rcsid[] = "$Id$"; #include "project.h" -typedef struct -{ +typedef struct { TTY_SIGNATURE; int fd; pid_t child; @@ -79,19 +126,18 @@ ptty_read (TTY * _t, void *buf, int len) PTTY *t = (PTTY *) _t; int red, done = 0; - do - { + do { - red = wrap_read (t->fd, buf, len); - if (red < 0) - return -1; - if (!red) - return done; + red = wrap_read (t->fd, buf, len); + if (red < 0) + return -1; + if (!red) + return done; - buf += red; - len -= red; - done += red; - } + buf += red; + len -= red; + done += red; + } while (len); @@ -105,19 +151,18 @@ ptty_write (TTY * _t, void *buf, int len) int writ, done = 0; PTTY *t = (PTTY *) _t; - do - { + do { - writ = wrap_write (t->fd, buf, len); - if (writ < 0) - return -1; - if (!writ) - sleep (1); + writ = wrap_write (t->fd, buf, len); + if (writ < 0) + return -1; + if (!writ) + sleep (1); - buf += writ; - len -= writ; - done += writ; - } + buf += writ; + len -= writ; + done += writ; + } while (len); @@ -125,44 +170,55 @@ ptty_write (TTY * _t, void *buf, int len) } TTY * -ptty_open (char *path, char *argv[]) +ptty_open (char *path, char *argv[], CRT_Pos * size) { PTTY *t; pid_t child; char name[1024]; struct winsize winsize = { 0 }; - struct termios termios; + struct termios ctermios = { 0 }; int fd; char *default_argv[] = { "-", (char *) 0 }; - default_termios (&termios); + client_termios (&ctermios); + winsize.ws_row = size ? size->y : VT102_ROWS_24; + winsize.ws_col = size ? size->x : VT102_COLS_80; - winsize.ws_row = VT102_ROWS; - winsize.ws_col = VT102_COLS; + child = forkpty (&fd, name, &ctermios, &winsize); - child = forkpty (&fd, name, &termios, &winsize); + switch (child) { + case -1: /* boo hiss */ + return NULL; + case 0: /* waaah */ + setenv ("TERM", "xterm", 1); + if (!path) + path = "/bin/sh"; - switch (child) - { - case -1: /*boo hiss */ - return NULL; - case 0: /*waaah */ - setenv ("TERM", "xterm", 1); - setenv ("LANG", "C", 1); - if (!path) - path = "/bin/sh"; - - if (!argv) - argv = default_argv; + if (!argv) + argv = default_argv; + if (path[0] == '/') execv (path, argv); - _exit (-1); - } + else + execvp (path, argv); + + _exit (-1); + } set_nonblocking (fd); - t = (PTTY *) malloc (sizeof (PTTY)); +#if 0 + { + struct termios termios = { 0 }; + + tcgetattr (fd, &termios); + default_termios (&termios); + tcsetattr (fd, TCSANOW, &termios); + } +#endif + + t = (PTTY *) xmalloc (sizeof (PTTY)); strncpy (t->name, name, sizeof (t->name)); t->name[sizeof (t->name) - 1] = 0;