]> Zhao Yanbai Git Server - minix.git/commitdiff
tty/pty: unbreak stty(1) 84/2784/1
authorDavid van Moolenbroek <david@minix3.org>
Mon, 25 Aug 2014 19:34:39 +0000 (19:34 +0000)
committerDavid van Moolenbroek <david@minix3.org>
Thu, 28 Aug 2014 16:29:27 +0000 (16:29 +0000)
Change-Id: I3f857dcbb89e18c7db3a72f4bd6809beb7904bc0

minix/drivers/tty/pty/pty.c
minix/drivers/tty/pty/tty.c
minix/drivers/tty/pty/tty.h
minix/drivers/tty/tty/tty.c

index 772aa5b0931507a10747ed2d3ed7c0c7804ca563..6fc49bc30920f1471fffdb2bf1e52cc2d59d340d 100644 (file)
@@ -45,7 +45,8 @@ typedef struct pty {
   /* Output buffer. */
   int          ocount;         /* # characters in the buffer */
   char         *ohead, *otail; /* head and tail of the circular buffer */
-  char         obuf[2048];     /* buffer for bytes going to the pty reader */
+  char         obuf[TTY_OUT_BYTES];
+                               /* buffer for bytes going to the pty reader */
 
   /* select() data. */
   unsigned int select_ops;     /* Which operations do we want to know about? */
index 48bb9006847020b8a468b8dc13d6b5c3eecd6ef7..1f71a17d5a265038f11c1ebdfdd300c02fab85b6 100644 (file)
@@ -84,6 +84,8 @@ static struct termios termios_defaults = {
 };
 static struct winsize winsize_defaults;        /* = all zeroes */
 
+static const char lined[TTLINEDNAMELEN] = "termios";   /* line discipline */
+
 /* Global variables for the TTY task (declared extern in tty.h). */
 tty_t tty_table[NR_PTYS];
 u32_t system_hz;
@@ -391,17 +393,25 @@ static int do_ioctl(devminor_t minor, unsigned long request, endpoint_t endpt,
        sigchar(tp, SIGWINCH, 0);
        break;
     case TIOCGETD:     /* get line discipline */
-    {
-       int disc = TTYDISC;
-       r = sys_safecopyto(endpt, grant, 0,
-               (vir_bytes) &disc, (vir_bytes) sizeof(disc));
+       i = TTYDISC;
+       r = sys_safecopyto(endpt, grant, 0, (vir_bytes) &i, sizeof(i));
        break;
-    }
     case TIOCSETD:     /* set line discipline */
        printf("TTY: TIOCSETD: can't set any other line discipline.\n");
        r = ENOTTY;
        break;
-
+    case TIOCGLINED:   /* get line discipline as string */
+       r = sys_safecopyto(endpt, grant, 0, (vir_bytes) lined, sizeof(lined));
+       break;
+    case TIOCGQSIZE:   /* get input/output queue sizes */
+       /* Not sure what to report here. We are using input and output queues
+        * of different sizes, and the IOCTL allows for one single value for
+        * both. So far this seems to be just for stty(1) so let's just report
+        * the larger of the two. TODO: revisit queue sizes altogether.
+        */
+       i = MAX(TTY_IN_BYTES, TTY_OUT_BYTES);
+       r = sys_safecopyto(endpt, grant, 0, (vir_bytes) &i, sizeof(i));
+       break;
     case TIOCSCTTY:
        /* Process sets this tty as its controlling tty */
        tp->tty_pgrp = user_endpt;
index 7fae103ee1885b32d336ae4455584bcef20fbbbc..8d353cfecd71960c2840ff4a44ad8e388ac43b9d 100644 (file)
@@ -8,6 +8,7 @@
 #define PTYPX_MINOR     192
 
 #define TTY_IN_BYTES     256   /* tty input queue size */
+#define TTY_OUT_BYTES   2048   /* tty output queue size */
 #define TAB_SIZE           8   /* distance between tab stops */
 #define TAB_MASK           7   /* mask to compute a tab stop position */
 
index 51519cc468b9723448ebdd9fb750659b1b0776f0..841035acd74427530f4be1d904dc44b0cf258332 100644 (file)
@@ -133,6 +133,8 @@ u32_t system_hz;
 u32_t consoleline = CONS_MINOR;
 u32_t kernel_msg_color = 0;
 
+static const char lined[TTLINEDNAMELEN] = "termios";   /* line discipline */
+
 /* SEF functions and variables. */
 static void sef_local_startup(void);
 static int sef_cb_init_fresh(int type, sef_init_info_t *info);
@@ -677,16 +679,20 @@ static int do_ioctl(devminor_t minor, unsigned long request, endpoint_t endpt,
        beep_x(bell.kb_pitch, ticks);
        break;
     case TIOCGETD:     /* get line discipline */
-    {
-       int disc = TTYDISC;
-       r = sys_safecopyto(endpt, grant, 0,
-               (vir_bytes) &disc, (vir_bytes) sizeof(disc));
+       i = TTYDISC;
+       r = sys_safecopyto(endpt, grant, 0, (vir_bytes) &i, sizeof(i));
        break;
-    }
     case TIOCSETD:     /* set line discipline */
        printf("TTY: TIOCSETD: can't set any other line discipline.\n");
        r = ENOTTY;
        break;
+    case TIOCGLINED:   /* get line discipline as string */
+       r = sys_safecopyto(endpt, grant, 0, (vir_bytes) lined, sizeof(lined));
+       break;
+    case TIOCGQSIZE:   /* get input/output queue sizes */
+       i = TTY_IN_BYTES;       /* best we can do.. */
+       r = sys_safecopyto(endpt, grant, 0, (vir_bytes) &i, sizeof(i));
+       break;
     case KIOCSMAP:
        /* Load a new keymap (only /dev/console). */
        if (isconsole(tp)) r = kbd_loadmap(endpt, grant);