aboutsummaryrefslogtreecommitdiff
path: root/winsup/cygwin/tty.h
diff options
context:
space:
mode:
authorChristopher Faylor <me@cgf.cx>2000-09-07 16:23:51 +0000
committerChristopher Faylor <me@cgf.cx>2000-09-07 16:23:51 +0000
commit29ac7f89e36e5f5b46286cdbb5501bcea3ce2055 (patch)
tree53317078f39b909b63757eadca3cf80fdd654738 /winsup/cygwin/tty.h
parentc1644acb233ed749b28b4139604ab134cf1cd34c (diff)
downloadnewlib-29ac7f89e36e5f5b46286cdbb5501bcea3ce2055.zip
newlib-29ac7f89e36e5f5b46286cdbb5501bcea3ce2055.tar.gz
newlib-29ac7f89e36e5f5b46286cdbb5501bcea3ce2055.tar.bz2
Split out tty and shared_info stuff into their own headers and use throughout.
Include sys/termios.h for files which need it. * tty.h: New file. * shared_info.h: New file. * fhandler.h: Move inline methods that rely on tty stuff to fhandler_console.cc. * fhandler_tty.cc (fhandler_pty_master::process_slave_output): Set output_done_event immediately after reading data to speed up tty output processing. (process_output): Set write_error to errno or zero. (fhandler_tty_slave::write): Check previous write error prior to writing to slave end of pipe. This allows tty output to be slightly less synchronous. * fhandler_console.cc (fhandler_console::tcsetpgrp): Moved here from fhandler.h. (fhandler_console::set_input_state): Ditto.
Diffstat (limited to 'winsup/cygwin/tty.h')
-rw-r--r--winsup/cygwin/tty.h143
1 files changed, 143 insertions, 0 deletions
diff --git a/winsup/cygwin/tty.h b/winsup/cygwin/tty.h
new file mode 100644
index 0000000..f4fa671
--- /dev/null
+++ b/winsup/cygwin/tty.h
@@ -0,0 +1,143 @@
+/* tty.h: shared info for cygwin
+
+ Copyright 2000 Cygnus Solutions.
+
+This file is part of Cygwin.
+
+This software is a copyrighted work licensed under the terms of the
+Cygwin license. Please consult the file "CYGWIN_LICENSE" for
+details. */
+
+
+/* tty tables */
+
+#define INP_BUFFER_SIZE 256
+#define OUT_BUFFER_SIZE 256
+#define NTTYS 128
+#define TTY_CONSOLE 0x40000000
+#define tty_attached(p) ((p)->ctty >= 0 && (p)->ctty != TTY_CONSOLE)
+
+/* Input/Output/ioctl events */
+
+#define OUTPUT_DONE_EVENT "cygtty%d.output.done"
+#define IOCTL_REQUEST_EVENT "cygtty%d.ioctl.request"
+#define IOCTL_DONE_EVENT "cygtty%d.ioctl.done"
+#define RESTART_OUTPUT_EVENT "cygtty%d.output.restart"
+#define OUTPUT_MUTEX "cygtty%d.output.mutex"
+#define TTY_SLAVE_ALIVE "cygtty%x.slave_alive"
+#define TTY_MASTER_ALIVE "cygtty%x.master_alive"
+
+#include <sys/termios.h>
+
+enum
+{
+ TTY_INITIALIZED = 1, /* Set if tty is initialized */
+ TTY_RSTCONS = 2 /* Set if console needs to be set to "non-cooked" */
+};
+
+#define TTYISSETF(x) __ISSETF (tc, x, TTY)
+#define TTYSETF(x) __SETF (tc, x, TTY)
+#define TTYCLEARF(x) __CLEARF (tc, x, TTY)
+#define TTYCONDSETF(n, x) __CONDSETF(n, tc, x, TTY)
+
+#ifndef MIN_CTRL_C_SLOP
+#define MIN_CTRL_C_SLOP 50
+#endif
+
+class tty_min
+{
+ pid_t sid; /* Session ID of tty */
+public:
+ DWORD status;
+ pid_t pgid;
+ int OutputStopped;
+ int ntty;
+ DWORD last_ctrl_c; // tick count of last ctrl-c
+
+ tty_min (int t = -1, pid_t s = -1) : sid (s), ntty (t) {}
+ void setntty (int n) {ntty = n;}
+ pid_t getpgid () {return pgid;}
+ void setpgid (int pid) {pgid = pid;}
+ int getsid () {return sid;}
+ void setsid (pid_t tsid) {sid = tsid;}
+ struct termios ti;
+ struct winsize winsize;
+
+ /* ioctl requests buffer */
+ int cmd;
+ union
+ {
+ struct termios termios;
+ struct winsize winsize;
+ int value;
+ pid_t pid;
+ } arg;
+ /* XXX_retval variables holds master's completion codes. Error are stored as
+ * -ERRNO
+ */
+ int ioctl_retval;
+
+ int write_error;
+};
+
+class fhandler_pty_master;
+
+class tty: public tty_min
+{
+ HANDLE get_event (const char *fmt, BOOL inherit);
+public:
+ HWND hwnd; /* Console window handle tty belongs to */
+
+ DWORD master_pid; /* Win32 PID of tty master process */
+
+ HANDLE from_master, to_slave;
+ HANDLE from_slave, to_master;
+
+ int read_retval;
+ BOOL was_opened; /* True if opened at least once. */
+
+ void init ();
+ HANDLE create_inuse (const char *);
+ BOOL common_init (fhandler_pty_master *);
+ BOOL alive (const char *fmt);
+ BOOL slave_alive ();
+ BOOL master_alive ();
+ HWND gethwnd () {return hwnd;}
+ void sethwnd (HWND wnd) {hwnd = wnd;}
+ int make_pipes (fhandler_pty_master *ptym);
+ HANDLE open_output_mutex (BOOL inherit = FALSE)
+ {
+ char buf[80];
+ __small_sprintf (buf, OUTPUT_MUTEX, ntty);
+ return OpenMutex (MUTEX_ALL_ACCESS, inherit, buf);
+ }
+ BOOL exists ()
+ {
+ HANDLE h = open_output_mutex ();
+ if (h)
+ {
+ CloseHandle (h);
+ return 1;
+ }
+ return slave_alive ();
+ }
+};
+
+class tty_list
+{
+ tty ttys[NTTYS];
+
+public:
+ tty * operator [](int n) {return ttys + n;}
+ int allocate_tty (int n); /* n non zero if allocate a tty, pty otherwise */
+ int connect_tty (int);
+ void terminate ();
+ void init ();
+ tty_min *get_tty (int n);
+};
+
+void __stdcall tty_init ();
+void __stdcall tty_terminate ();
+int __stdcall attach_tty (int);
+void __stdcall create_tty_master (int);
+extern "C" int ttyslot (void);