chiark / gitweb /
*** empty log message ***
[sympathy.git] / src / tty.c
index cd9081022fc7d405c096a9ed4756a444295fe703..de1bdcaf6b4b096a07ff1ac7c84f2c7eaafb0f77 100644 (file)
--- a/src/tty.c
+++ b/src/tty.c
@@ -10,6 +10,12 @@ static char rcsid[] = "$Id$";
 
 /*
  * $Log$
+ * Revision 1.10  2008/02/15 23:52:12  james
+ * *** empty log message ***
+ *
+ * Revision 1.9  2008/02/15 03:32:07  james
+ * *** empty log message ***
+ *
  * Revision 1.8  2008/02/14 10:36:18  james
  * *** empty log message ***
  *
@@ -207,6 +213,25 @@ baud_to_speed_t (int baud)
 void
 tty_pre_select (TTY * t, fd_set * rfds, fd_set * wfds)
 {
+  int line;
+  struct timeval now, dif;
+
+  if (t->hanging_up)
+    {
+
+      gettimeofday (&now, NULL);
+      timersub (&now, &t->hangup_clock, &dif);
+      if (dif.tv_sec)
+        {
+          fprintf (stderr, "+DTR\n");
+
+          line = TIOCM_DTR;
+          ioctl (t->rfd, TIOCMBIS, &line);
+          t->hanging_up = 0;
+        }
+    }
+
+
   FD_SET (t->rfd, rfds);
 }
 
@@ -216,6 +241,8 @@ tty_get_status (TTY * t, TTY_Status * s)
 
   s->lines = 0;
   ioctl (t->rfd, TIOCMGET, &s->lines);
+  if (t->hanging_up)
+    fprintf (stderr, "s->lines & TIOCM_DTR=%x\n", s->lines & TIOCM_DTR);
 
   if (tcgetattr (t->rfd, &s->termios))
     return -1;
@@ -226,6 +253,63 @@ tty_get_status (TTY * t, TTY_Status * s)
   return 0;
 }
 
+void
+tty_set_baud (TTY * t, int rate)
+{
+  struct termios tios = { 0 };
+
+  speed_t s = baud_to_speed_t (rate);
+
+  if (s == (speed_t) - 1)
+    return;
+
+  if (tcgetattr (t->rfd, &tios))
+    return;
+
+  cfsetispeed (&tios, s);
+  cfsetospeed (&tios, s);
+
+  tcsetattr (t->rfd, TCSANOW, &tios);
+}
+
+void
+tty_send_break (TTY * t)
+{
+  tcsendbreak (t->wfd, 0);
+}
+
+void
+tty_set_flow (TTY * t, int flow)
+{
+  struct termios tios = { 0 };
+
+  if (tcgetattr (t->rfd, &tios))
+    return;
+
+  if (flow)
+    tios.c_cflag |= CRTSCTS;
+  else
+    tios.c_cflag &= ~CRTSCTS;
+
+  tcsetattr (t->rfd, TCSANOW, &tios);
+
+}
+
+void
+tty_hangup (TTY * t)
+{
+  int line;
+
+  line = TIOCM_DTR;
+  ioctl (t->rfd, TIOCMBIC, &line);
+
+  t->hanging_up = 1;
+  gettimeofday (&t->hangup_clock, NULL);
+  fprintf (stderr, "-DTR\n");
+
+}
+
+
 #if 0
 int
 tty_post_select (Context * c, fd_set * rfds, fd_set * wfds)