* ser-go32.c (dos_get_tty_state): Fail if the (fake) handle was
authorEli Zaretskii <eliz@gnu.org>
Wed, 15 Mar 2000 11:10:52 +0000 (11:10 +0000)
committerEli Zaretskii <eliz@gnu.org>
Wed, 15 Mar 2000 11:10:52 +0000 (11:10 +0000)
not opened by dos_open, but let the 3 standard handles go through
unharmed.

gdb/ser-go32.c

index 0474000e61a5c5a184a15a77f4021bf7208b9403..1d5eea23449db883ffe17e511010aa2bc1bf3954 100644 (file)
@@ -488,6 +488,10 @@ dos_open (scb, name)
       return -1;
     }
 
+  /* FIXME: this is a Bad Idea (tm)!  One should *never* invent file
+     handles, since they might be already used by other files/devices.
+     The Right Way to do this is to create a real handle by dup()'ing
+     some existing one.  */
   fd = name[3] - '1';
   port = &ports[fd];
   if (port->refcnt++ > 0)
@@ -650,6 +654,19 @@ dos_get_tty_state (scb)
   struct dos_ttystate *port = &ports[scb->fd];
   struct dos_ttystate *state;
 
+  /* Are they asking about a port we opened?  */
+  if (port->refcnt <= 0)
+    {
+      /* We've never heard about this port.  We should fail this call,
+        unless they are asking about one of the 3 standard handles,
+        in which case we pretend the handle was open by us if it is
+        connected to a terminal device.  This is beacuse Unix
+        terminals use the serial interface, so GDB expects the
+        standard handles to go through here.  */
+      if (scb->fd >= 3 || !isatty (scb->fd))
+       return NULL;
+    }
+
   state = (struct dos_ttystate *) xmalloc (sizeof *state);
   *state = *port;
   return (serial_ttystate) state;