2 * console-io.c: ConsoleDriver internal calls
5 * Gonzalo Paniagua Javier (gonzalo@ximian.com)
7 * Copyright (C) 2005 Novell, Inc. (http://www.novell.com)
23 #ifndef PLATFORM_WIN32
25 #include <sys/ioctl.h>
29 #include <mono/metadata/console-io.h>
30 #include <mono/metadata/exception.h>
32 static gboolean setup_finished;
33 static gboolean atexit_called;
34 static gchar *teardown_str;
38 ves_icall_System_ConsoleDriver_Isatty (HANDLE handle)
42 return (GetFileType (handle) == FILE_TYPE_CHAR);
46 ves_icall_System_ConsoleDriver_SetEcho (MonoBoolean want_echo)
52 ves_icall_System_ConsoleDriver_SetBreak (MonoBoolean want_break)
58 ves_icall_System_ConsoleDriver_InternalKeyAvailable (gint32 timeout)
64 ves_icall_System_ConsoleDriver_TtySetup (MonoString *teardown)
70 static struct termios initial_attr;
73 ves_icall_System_ConsoleDriver_Isatty (HANDLE handle)
77 return isatty (GPOINTER_TO_INT (handle));
81 set_property (gint property, gboolean value)
84 gboolean callset = FALSE;
89 if (tcgetattr (STDIN_FILENO, &attr) == -1)
92 check = (attr.c_lflag & property) != 0;
93 if ((value || check) && !(value && check)) {
96 attr.c_lflag |= property;
98 attr.c_lflag &= ~property;
104 if (tcsetattr (STDIN_FILENO, TCSANOW, &attr) == -1)
111 ves_icall_System_ConsoleDriver_SetEcho (MonoBoolean want_echo)
113 return set_property (ECHO, want_echo);
117 ves_icall_System_ConsoleDriver_SetBreak (MonoBoolean want_break)
119 return set_property (IGNBRK, !want_break);
123 ves_icall_System_ConsoleDriver_InternalKeyAvailable (gint32 timeout)
127 struct timeval *tvptr;
135 FD_SET (STDIN_FILENO, &rfds);
137 divvy = div (timeout, 1000);
138 tv.tv_sec = divvy.quot;
139 tv.tv_usec = divvy.rem;
144 ret = select (STDIN_FILENO + 1, &rfds, NULL, NULL, tvptr);
145 } while (ret == -1 && errno == EINTR);
149 ret = ioctl (STDIN_FILENO, FIONREAD, &nbytes);
154 return (ret > 0) ? ret : 0;
165 if (teardown_str != NULL) {
166 write (STDOUT_FILENO, teardown_str, strlen (teardown_str));
167 g_free (teardown_str);
171 tcflush (STDIN_FILENO, TCIFLUSH);
172 tcsetattr (STDIN_FILENO, TCSANOW, &initial_attr);
173 setup_finished = FALSE;
177 ves_icall_System_ConsoleDriver_TtySetup (MonoString *teardown)
183 if (tcgetattr (STDIN_FILENO, &initial_attr) == -1)
187 attr.c_lflag &= ~ICANON;
188 attr.c_cc [VMIN] = 1;
189 attr.c_cc [VTIME] = 0;
190 if (tcsetattr (STDIN_FILENO, TCSANOW, &attr) == -1)
193 setup_finished = TRUE;
194 if (!atexit_called) {
195 if (teardown != NULL)
196 teardown_str = mono_string_to_utf8 (teardown);
198 atexit (tty_teardown);