* Based on Russell Stuart's conspy.c
* http://ace-host.stuart.id.au/russell/files/conspy.c
*
- * Licensed under GPLv2 or later, see file License in this tarball for details.
+ * Licensed under GPLv2 or later, see file LICENSE in this source tree.
*/
//applet:IF_CONSPY(APPLET(conspy, _BB_DIR_BIN, _BB_SUID_DROP))
//config:config CONSPY
//config: bool "conspy"
//config: default n
+//config: depends on PLATFORM_LINUX
//config: help
//config: A text-mode VNC like program for Linux virtual terminals.
//config: example: conspy NUM shared access to console num
static NOINLINE void start_shell_in_child(const char* tty_name)
{
- int pid = vfork();
- if (pid < 0) {
- bb_perror_msg_and_die("vfork");
- }
+ int pid = xvfork();
if (pid == 0) {
struct termios termchild;
char *shell = getenv("SHELL");
G.key_count += bytes_read;
handle = xopen(tty_name, O_WRONLY);
result = ioctl(handle, KDGKBMODE, &kbd_mode);
- if (result == -1)
- /* nothing */;
- else if (kbd_mode != K_XLATE && kbd_mode != K_UNICODE)
- G.key_count = 0; // scan code mode
- else {
+ if (result >= 0) {
char *p = keybuf;
- for (; G.key_count != 0 && result != -1; p++, G.key_count--) {
+
+ if (kbd_mode != K_XLATE && kbd_mode != K_UNICODE) {
+ G.key_count = 0; // scan code mode
+ }
+ for (; G.key_count != 0; p++, G.key_count--) {
result = ioctl(handle, TIOCSTI, p);
+ if (result < 0) {
+ memmove(keybuf, p, G.key_count);
+ break;
+ }
// If there is an application on console which reacts
// to keypresses, we need to make our first sleep
// shorter to quickly redraw whatever it printed there.
poll_timeout_ms = 20;
}
- if (G.key_count)
- memmove(keybuf, p, G.key_count);
}
// Close & re-open tty in case they have
// swapped virtual consoles
// We sometimes get spurious IO errors on the TTY
// as programs close and re-open it
- if (result != -1)
+ if (result >= 0)
G.ioerror_count = 0;
else if (errno != EIO || ++G.ioerror_count > 4)
cleanup(1);