X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fserial.c;h=4399cf42ab5f2f87c4e6f538eca76e419d7e5357;hb=refs%2Fheads%2Fmaster;hp=429c2e3771652165ff34b27adb5202dd0d5742c0;hpb=743fe12d3868d3653e667988284b2477ec833297;p=sympathy.git diff --git a/src/serial.c b/src/serial.c index 429c2e3..4399cf4 100644 --- a/src/serial.c +++ b/src/serial.c @@ -1,15 +1,57 @@ -/* +/* * serial.c: * - * Copyright (c) 2008 James McKenzie , + * Copyright (c) 2008 James McKenzie , * All rights reserved. * */ -static char rcsid[] = "$Id$"; +static char rcsid[] = "$Id: serial.c,v 1.18 2011/02/06 16:51:22 james Exp $"; -/* - * $Log$ +/* + * $Log: serial.c,v $ + * Revision 1.18 2011/02/06 16:51:22 james + * *** empty log message *** + * + * Revision 1.17 2008/03/10 11:49:33 james + * *** empty log message *** + * + * Revision 1.16 2008/03/07 13:16:02 james + * *** empty log message *** + * + * Revision 1.15 2008/03/07 12:37:04 james + * *** empty log message *** + * + * Revision 1.14 2008/03/03 06:04:42 james + * *** empty log message *** + * + * Revision 1.13 2008/03/02 10:37:56 james + * *** empty log message *** + * + * Revision 1.12 2008/02/28 16:57:52 james + * *** empty log message *** + * + * Revision 1.11 2008/02/26 23:23:17 james + * *** empty log message *** + * + * Revision 1.10 2008/02/24 00:47:14 james + * *** empty log message *** + * + * Revision 1.9 2008/02/24 00:42:53 james + * *** empty log message *** + * + * Revision 1.8 2008/02/23 13:05:58 staffcvs + * *** empty log message *** + * + * Revision 1.7 2008/02/15 23:52:12 james + * *** empty log message *** + * + * Revision 1.6 2008/02/15 19:51:30 james + * *** empty log message *** + * + * Revision 1.5 2008/02/15 19:09:00 james + * *** empty log message *** + * * Revision 1.4 2008/02/15 16:48:56 james * *** empty log message *** * @@ -56,29 +98,14 @@ static char rcsid[] = "$Id$"; #include #include -#define NLOCKFILES 10 -typedef struct -{ - char *lockfiles[NLOCKFILES]; - char *potential_lockfiles[NLOCKFILES]; - struct timeval last_content_check; -} Serial_lock; - -typedef struct -{ +typedef struct { TTY_SIGNATURE; - Serial_lock lock; + Serial_lock *lock; int fd; } Serial; -static void -serial_check_lock (Serial * t) -{ -} - - static void serial_close (TTY * _t) { @@ -87,35 +114,35 @@ serial_close (TTY * _t) if (!t) return; + tcflush (t->fd, TCIOFLUSH); close (t->fd); free (t); } - static int serial_read (TTY * _t, void *buf, int len) { Serial *t = (Serial *) _t; int red, done = 0; - serial_check_lock (t); + t->blocked = serial_lock_check (t->lock); + if (t->blocked) return 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 done ? done:-1; + if (!red) + return done; - buf += red; - len -= red; - done += red; - } + buf += red; + len -= red; + done += red; + } while (len); @@ -124,28 +151,27 @@ serial_read (TTY * _t, void *buf, int len) static int -ptty_write (TTY * _t, void *buf, int len) +serial_write (TTY * _t, void *buf, int len) { int writ, done = 0; Serial *t = (Serial *) _t; - serial_check_lock (t); + t->blocked = serial_lock_check (t->lock); if (t->blocked) return 0; - 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); @@ -153,7 +179,7 @@ ptty_write (TTY * _t, void *buf, int len) } TTY * -serial_open (char *path) +serial_open (char *path, int lock_mode) { Serial *t; pid_t child; @@ -161,28 +187,46 @@ serial_open (char *path) struct winsize winsize = { 0 }; struct termios termios; int fd; + Serial_lock *l; + l = serial_lock_new (path, lock_mode); + if (!l) + return NULL; - default_termios (&termios); - fd = open (path, O_RDWR); + fd = open (path, O_RDWR | O_NOCTTY | O_NONBLOCK); set_nonblocking (fd); - t = (Serial *) malloc (sizeof (Serial)); + + if (tcgetattr (fd, &termios)) { + close (fd); + return NULL; + } + default_termios (&termios); + + if (tcsetattr (fd, TCSANOW, &termios)) { + close (fd); + return NULL; + } + + t = (Serial *) xmalloc (sizeof (Serial)); + + t->lock = l; strncpy (t->name, path, sizeof (t->name)); t->name[sizeof (t->name) - 1] = 0; t->recv = serial_read; - //t->xmit = serial_write; + t->xmit = serial_write; t->close = serial_close; t->fd = fd; t->rfd = t->fd; t->wfd = t->fd; - t->size.x = VT102_COLS; - t->size.y = VT102_ROWS; - t->blocked = 0; + t->size.x = VT102_COLS_80; + t->size.y = VT102_ROWS_24; + t->blocked = serial_lock_check (t->lock); + t->hanging_up = 0; return (TTY *) t; }