- int c;
- char cur_esc = 0;
- serial_ttystate ttystate;
- struct serial *port_desc; /* TTY port */
-
- dont_repeat ();
-
- if (args)
- fprintf_unfiltered (gdb_stderr, "This command takes no args. They have been ignored.\n");
-
- printf_unfiltered ("[Entering connect mode. Use ~. or ~^D to escape]\n");
-
- tty_desc = serial_fdopen (0);
- port_desc = last_serial_opened;
-
- ttystate = serial_get_tty_state (tty_desc);
-
- serial_raw (tty_desc);
- serial_raw (port_desc);
-
- make_cleanup (cleanup_tty, ttystate);
-
- while (1)
- {
- int mask;
-
- mask = serial_wait_2 (tty_desc, port_desc, -1);
-
- if (mask & 2)
- { /* tty input */
- char cx;
-
- while (1)
- {
- c = serial_readchar (tty_desc, 0);
-
- if (c == SERIAL_TIMEOUT)
- break;
-
- if (c < 0)
- perror_with_name (_("connect"));
-
- cx = c;
- serial_write (port_desc, &cx, 1);
-
- switch (cur_esc)
- {
- case 0:
- if (c == '\r')
- cur_esc = c;
- break;
- case '\r':
- if (c == '~')
- cur_esc = c;
- else
- cur_esc = 0;
- break;
- case '~':
- if (c == '.' || c == '\004')
- return;
- else
- cur_esc = 0;
- }
- }
- }
-
- if (mask & 1)
- { /* Port input */
- char cx;
-
- while (1)
- {
- c = serial_readchar (port_desc, 0);
-
- if (c == SERIAL_TIMEOUT)
- break;
-
- if (c < 0)
- perror_with_name (_("connect"));
-
- cx = c;
-
- serial_write (tty_desc, &cx, 1);
- }
- }
- }