1 /* Low level interface to ptrace, for GDB when running under Unix. 2 Copyright 1986, 1987, 1989, 1991, 1992, 1995 Free Software Foundation, Inc. 3 4 This file is part of GDB. 5 6 This program is free software; you can redistribute it and/or modify 7 it under the terms of the GNU General Public License as published by 8 the Free Software Foundation; either version 2 of the License, or 9 (at your option) any later version. 10 11 This program is distributed in the hope that it will be useful, 12 but WITHOUT ANY WARRANTY; without even the implied warranty of 13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 GNU General Public License for more details. 15 16 You should have received a copy of the GNU General Public License 17 along with this program; if not, write to the Free Software 18 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ 19 20 #include "defs.h" 21 #include "frame.h" 22 #include "inferior.h" 23 #include "command.h" 24 #include "signals.h" 25 #include "serial.h" 26 #include "terminal.h" 27 #include "target.h" 28 #include "gdbthread.h" 29 30 #include "gdb_string.h" 31 #include <signal.h> 32 #include <fcntl.h> 33 #ifdef HAVE_UNISTD_H 34 #include <unistd.h> 35 #endif 36 37 #ifdef HAVE_TERMIOS 38 #define PROCESS_GROUP_TYPE pid_t 39 #endif 40 41 #ifdef HAVE_SGTTY 42 #ifdef SHORT_PGRP 43 /* This is only used for the ultra. Does it have pid_t? */ 44 #define PROCESS_GROUP_TYPE short 45 #else 46 #define PROCESS_GROUP_TYPE int 47 #endif 48 #endif /* sgtty */ 49 50 #if defined (SIGIO) && defined (FASYNC) && defined (FD_SET) && defined (F_SETOWN) 51 static void 52 handle_sigio PARAMS ((int)); 53 #endif 54 55 static void 56 pass_signal PARAMS ((int)); 57 58 static void 59 kill_command PARAMS ((char *, int)); 60 61 static void 62 terminal_ours_1 PARAMS ((int)); 63 64 /* Record terminal status separately for debugger and inferior. */ 65 66 static serial_t stdin_serial; 67 68 /* TTY state for the inferior. We save it whenever the inferior stops, and 69 restore it when it resumes. */ 70 static serial_ttystate inferior_ttystate; 71 72 /* Our own tty state, which we restore every time we need to deal with the 73 terminal. We only set it once, when GDB first starts. The settings of 74 flags which readline saves and restores and unimportant. */ 75 static serial_ttystate our_ttystate; 76 77 /* fcntl flags for us and the inferior. Saved and restored just like 78 {our,inferior}_ttystate. */ 79 static int tflags_inferior; 80 static int tflags_ours; 81 82 #ifdef PROCESS_GROUP_TYPE 83 /* Process group for us and the inferior. Saved and restored just like 84 {our,inferior}_ttystate. */ 85 PROCESS_GROUP_TYPE our_process_group; 86 PROCESS_GROUP_TYPE inferior_process_group; 87 #endif 88 89 /* While the inferior is running, we want SIGINT and SIGQUIT to go to the 90 inferior only. If we have job control, that takes care of it. If not, 91 we save our handlers in these two variables and set SIGINT and SIGQUIT 92 to SIG_IGN. */ 93 94 static void (*sigint_ours) (); 95 static void (*sigquit_ours) (); 96 97 /* The name of the tty (from the `tty' command) that we gave to the inferior 98 when it was last started. */ 99 100 static char *inferior_thisrun_terminal; 101 102 /* Nonzero if our terminal settings are in effect. Zero if the 103 inferior's settings are in effect. Ignored if !gdb_has_a_terminal 104 (). */ 105 106 static int terminal_is_ours; 107 108 enum {yes, no, have_not_checked} gdb_has_a_terminal_flag = have_not_checked; 109 110 /* Does GDB have a terminal (on stdin)? */ 111 int 112 gdb_has_a_terminal () 113 { 114 switch (gdb_has_a_terminal_flag) 115 { 116 case yes: 117 return 1; 118 case no: 119 return 0; 120 case have_not_checked: 121 /* Get all the current tty settings (including whether we have a tty at 122 all!). Can't do this in _initialize_inflow because SERIAL_FDOPEN 123 won't work until the serial_ops_list is initialized. */ 124 125 #ifdef F_GETFL 126 tflags_ours = fcntl (0, F_GETFL, 0); 127 #endif 128 129 gdb_has_a_terminal_flag = no; 130 stdin_serial = SERIAL_FDOPEN (0); 131 if (stdin_serial != NULL) 132 { 133 our_ttystate = SERIAL_GET_TTY_STATE (stdin_serial); 134 135 if (our_ttystate != NULL) 136 { 137 gdb_has_a_terminal_flag = yes; 138 #ifdef HAVE_TERMIOS 139 our_process_group = tcgetpgrp (0); 140 #endif 141 #ifdef HAVE_SGTTY 142 ioctl (0, TIOCGPGRP, &our_process_group); 143 #endif 144 } 145 } 146 147 return gdb_has_a_terminal_flag == yes; 148 default: 149 /* "Can't happen". */ 150 return 0; 151 } 152 } 153 154 /* Macro for printing errors from ioctl operations */ 155 156 #define OOPSY(what) \ 157 if (result == -1) \ 158 fprintf_unfiltered(gdb_stderr, "[%s failed in terminal_inferior: %s]\n", \ 159 what, strerror (errno)) 160 161 static void terminal_ours_1 PARAMS ((int)); 162 163 /* Initialize the terminal settings we record for the inferior, 164 before we actually run the inferior. */ 165 166 void 167 terminal_init_inferior_with_pgrp (pgrp) 168 int pgrp; 169 { 170 if (gdb_has_a_terminal ()) 171 { 172 /* We could just as well copy our_ttystate (if we felt like adding 173 a new function SERIAL_COPY_TTY_STATE). */ 174 if (inferior_ttystate) 175 free (inferior_ttystate); 176 inferior_ttystate = SERIAL_GET_TTY_STATE (stdin_serial); 177 178 #ifdef PROCESS_GROUP_TYPE 179 inferior_process_group = pgrp; 180 #endif 181 182 /* Make sure that next time we call terminal_inferior (which will be 183 before the program runs, as it needs to be), we install the new 184 process group. */ 185 terminal_is_ours = 1; 186 } 187 } 188 189 void 190 terminal_init_inferior () 191 { 192 #ifdef PROCESS_GROUP_TYPE 193 #ifdef PIDGET 194 /* This is for Lynx, and should be cleaned up by having Lynx be a separate 195 debugging target with a version of target_terminal_init_inferior which 196 passes in the process group to a generic routine which does all the work 197 (and the non-threaded child_terminal_init_inferior can just pass in 198 inferior_pid to the same routine). */ 199 terminal_init_inferior_with_pgrp (PIDGET (inferior_pid)); 200 #else 201 /* By default, we assume INFERIOR_PID is also the child's process group. */ 202 terminal_init_inferior_with_pgrp (inferior_pid); 203 #endif 204 #endif /* PROCESS_GROUP_TYPE */ 205 } 206 207 /* Put the inferior's terminal settings into effect. 208 This is preparation for starting or resuming the inferior. */ 209 210 void 211 terminal_inferior () 212 { 213 if (gdb_has_a_terminal () && terminal_is_ours 214 && inferior_thisrun_terminal == 0) 215 { 216 int result; 217 218 #ifdef F_GETFL 219 /* Is there a reason this is being done twice? It happens both 220 places we use F_SETFL, so I'm inclined to think perhaps there 221 is some reason, however perverse. Perhaps not though... */ 222 result = fcntl (0, F_SETFL, tflags_inferior); 223 result = fcntl (0, F_SETFL, tflags_inferior); 224 OOPSY ("fcntl F_SETFL"); 225 #endif 226 227 /* Because we were careful to not change in or out of raw mode in 228 terminal_ours, we will not change in our out of raw mode with 229 this call, so we don't flush any input. */ 230 result = SERIAL_SET_TTY_STATE (stdin_serial, inferior_ttystate); 231 OOPSY ("setting tty state"); 232 233 if (!job_control) 234 { 235 sigint_ours = (void (*) ()) signal (SIGINT, SIG_IGN); 236 #ifdef SIGQUIT 237 sigquit_ours = (void (*) ()) signal (SIGQUIT, SIG_IGN); 238 #endif 239 } 240 241 /* If attach_flag is set, we don't know whether we are sharing a 242 terminal with the inferior or not. (attaching a process 243 without a terminal is one case where we do not; attaching a 244 process which we ran from the same shell as GDB via `&' is 245 one case where we do, I think (but perhaps this is not 246 `sharing' in the sense that we need to save and restore tty 247 state)). I don't know if there is any way to tell whether we 248 are sharing a terminal. So what we do is to go through all 249 the saving and restoring of the tty state, but ignore errors 250 setting the process group, which will happen if we are not 251 sharing a terminal). */ 252 253 if (job_control) 254 { 255 #ifdef HAVE_TERMIOS 256 result = tcsetpgrp (0, inferior_process_group); 257 if (!attach_flag) 258 OOPSY ("tcsetpgrp"); 259 #endif 260 261 #ifdef HAVE_SGTTY 262 result = ioctl (0, TIOCSPGRP, &inferior_process_group); 263 if (!attach_flag) 264 OOPSY ("TIOCSPGRP"); 265 #endif 266 } 267 268 } 269 terminal_is_ours = 0; 270 } 271 272 /* Put some of our terminal settings into effect, 273 enough to get proper results from our output, 274 but do not change into or out of RAW mode 275 so that no input is discarded. 276 277 After doing this, either terminal_ours or terminal_inferior 278 should be called to get back to a normal state of affairs. */ 279 280 void 281 terminal_ours_for_output () 282 { 283 terminal_ours_1 (1); 284 } 285 286 /* Put our terminal settings into effect. 287 First record the inferior's terminal settings 288 so they can be restored properly later. */ 289 290 void 291 terminal_ours () 292 { 293 terminal_ours_1 (0); 294 } 295 296 /* output_only is not used, and should not be used unless we introduce 297 separate terminal_is_ours and terminal_is_ours_for_output 298 flags. */ 299 300 static void 301 terminal_ours_1 (output_only) 302 int output_only; 303 { 304 /* Checking inferior_thisrun_terminal is necessary so that 305 if GDB is running in the background, it won't block trying 306 to do the ioctl()'s below. Checking gdb_has_a_terminal 307 avoids attempting all the ioctl's when running in batch. */ 308 if (inferior_thisrun_terminal != 0 || gdb_has_a_terminal () == 0) 309 return; 310 311 if (!terminal_is_ours) 312 { 313 /* Ignore this signal since it will happen when we try to set the 314 pgrp. */ 315 void (*osigttou) (); 316 int result; 317 318 terminal_is_ours = 1; 319 320 #ifdef SIGTTOU 321 if (job_control) 322 osigttou = (void (*) ()) signal (SIGTTOU, SIG_IGN); 323 #endif 324 325 if (inferior_ttystate) 326 free (inferior_ttystate); 327 inferior_ttystate = SERIAL_GET_TTY_STATE (stdin_serial); 328 #ifdef HAVE_TERMIOS 329 inferior_process_group = tcgetpgrp (0); 330 #endif 331 #ifdef HAVE_SGTTY 332 ioctl (0, TIOCGPGRP, &inferior_process_group); 333 #endif 334 335 /* Here we used to set ICANON in our ttystate, but I believe this 336 was an artifact from before when we used readline. Readline sets 337 the tty state when it needs to. 338 FIXME-maybe: However, query() expects non-raw mode and doesn't 339 use readline. Maybe query should use readline (on the other hand, 340 this only matters for HAVE_SGTTY, not termio or termios, I think). */ 341 342 /* Set tty state to our_ttystate. We don't change in our out of raw 343 mode, to avoid flushing input. We need to do the same thing 344 regardless of output_only, because we don't have separate 345 terminal_is_ours and terminal_is_ours_for_output flags. It's OK, 346 though, since readline will deal with raw mode when/if it needs to. 347 */ 348 349 SERIAL_NOFLUSH_SET_TTY_STATE (stdin_serial, our_ttystate, 350 inferior_ttystate); 351 352 if (job_control) 353 { 354 #ifdef HAVE_TERMIOS 355 result = tcsetpgrp (0, our_process_group); 356 #if 0 357 /* This fails on Ultrix with EINVAL if you run the testsuite 358 in the background with nohup, and then log out. GDB never 359 used to check for an error here, so perhaps there are other 360 such situations as well. */ 361 if (result == -1) 362 fprintf_unfiltered (gdb_stderr, "[tcsetpgrp failed in terminal_ours: %s]\n", 363 strerror (errno)); 364 #endif 365 #endif /* termios */ 366 367 #ifdef HAVE_SGTTY 368 result = ioctl (0, TIOCSPGRP, &our_process_group); 369 #endif 370 } 371 372 #ifdef SIGTTOU 373 if (job_control) 374 signal (SIGTTOU, osigttou); 375 #endif 376 377 if (!job_control) 378 { 379 signal (SIGINT, sigint_ours); 380 #ifdef SIGQUIT 381 signal (SIGQUIT, sigquit_ours); 382 #endif 383 } 384 385 #ifdef F_GETFL 386 tflags_inferior = fcntl (0, F_GETFL, 0); 387 388 /* Is there a reason this is being done twice? It happens both 389 places we use F_SETFL, so I'm inclined to think perhaps there 390 is some reason, however perverse. Perhaps not though... */ 391 result = fcntl (0, F_SETFL, tflags_ours); 392 result = fcntl (0, F_SETFL, tflags_ours); 393 #endif 394 395 result = result; /* lint */ 396 } 397 } 398 399 /* ARGSUSED */ 400 void 401 term_info (arg, from_tty) 402 char *arg; 403 int from_tty; 404 { 405 target_terminal_info (arg, from_tty); 406 } 407 408 /* ARGSUSED */ 409 void 410 child_terminal_info (args, from_tty) 411 char *args; 412 int from_tty; 413 { 414 if (!gdb_has_a_terminal ()) 415 { 416 printf_filtered ("This GDB does not control a terminal.\n"); 417 return; 418 } 419 420 printf_filtered ("Inferior's terminal status (currently saved by GDB):\n"); 421 422 /* First the fcntl flags. */ 423 { 424 int flags; 425 426 flags = tflags_inferior; 427 428 printf_filtered ("File descriptor flags = "); 429 430 #ifndef O_ACCMODE 431 #define O_ACCMODE (O_RDONLY | O_WRONLY | O_RDWR) 432 #endif 433 /* (O_ACCMODE) parens are to avoid Ultrix header file bug */ 434 switch (flags & (O_ACCMODE)) 435 { 436 case O_RDONLY: printf_filtered ("O_RDONLY"); break; 437 case O_WRONLY: printf_filtered ("O_WRONLY"); break; 438 case O_RDWR: printf_filtered ("O_RDWR"); break; 439 } 440 flags &= ~(O_ACCMODE); 441 442 #ifdef O_NONBLOCK 443 if (flags & O_NONBLOCK) 444 printf_filtered (" | O_NONBLOCK"); 445 flags &= ~O_NONBLOCK; 446 #endif 447 448 #if defined (O_NDELAY) 449 /* If O_NDELAY and O_NONBLOCK are defined to the same thing, we will 450 print it as O_NONBLOCK, which is good cause that is what POSIX 451 has, and the flag will already be cleared by the time we get here. */ 452 if (flags & O_NDELAY) 453 printf_filtered (" | O_NDELAY"); 454 flags &= ~O_NDELAY; 455 #endif 456 457 if (flags & O_APPEND) 458 printf_filtered (" | O_APPEND"); 459 flags &= ~O_APPEND; 460 461 #if defined (O_BINARY) 462 if (flags & O_BINARY) 463 printf_filtered (" | O_BINARY"); 464 flags &= ~O_BINARY; 465 #endif 466 467 if (flags) 468 printf_filtered (" | 0x%x", flags); 469 printf_filtered ("\n"); 470 } 471 472 #ifdef PROCESS_GROUP_TYPE 473 printf_filtered ("Process group = %d\n", inferior_process_group); 474 #endif 475 476 SERIAL_PRINT_TTY_STATE (stdin_serial, inferior_ttystate); 477 } 478 479 /* NEW_TTY_PREFORK is called before forking a new child process, 480 so we can record the state of ttys in the child to be formed. 481 TTYNAME is null if we are to share the terminal with gdb; 482 or points to a string containing the name of the desired tty. 483 484 NEW_TTY is called in new child processes under Unix, which will 485 become debugger target processes. This actually switches to 486 the terminal specified in the NEW_TTY_PREFORK call. */ 487 488 void 489 new_tty_prefork (ttyname) 490 char *ttyname; 491 { 492 /* Save the name for later, for determining whether we and the child 493 are sharing a tty. */ 494 inferior_thisrun_terminal = ttyname; 495 } 496 497 void 498 new_tty () 499 { 500 register int tty; 501 502 if (inferior_thisrun_terminal == 0) 503 return; 504 #if !defined(__GO32__) && !defined(_WIN32) 505 #ifdef TIOCNOTTY 506 /* Disconnect the child process from our controlling terminal. On some 507 systems (SVR4 for example), this may cause a SIGTTOU, so temporarily 508 ignore SIGTTOU. */ 509 tty = open("/dev/tty", O_RDWR); 510 if (tty > 0) 511 { 512 void (*osigttou) (); 513 514 osigttou = (void (*)()) signal(SIGTTOU, SIG_IGN); 515 ioctl(tty, TIOCNOTTY, 0); 516 close(tty); 517 signal(SIGTTOU, osigttou); 518 } 519 #endif 520 521 /* Now open the specified new terminal. */ 522 523 #ifdef USE_O_NOCTTY 524 tty = open(inferior_thisrun_terminal, O_RDWR | O_NOCTTY); 525 #else 526 tty = open(inferior_thisrun_terminal, O_RDWR); 527 #endif 528 if (tty == -1) 529 { 530 print_sys_errmsg (inferior_thisrun_terminal, errno); 531 _exit(1); 532 } 533 534 /* Avoid use of dup2; doesn't exist on all systems. */ 535 if (tty != 0) 536 { close (0); dup (tty); } 537 if (tty != 1) 538 { close (1); dup (tty); } 539 if (tty != 2) 540 { close (2); dup (tty); } 541 if (tty > 2) 542 close(tty); 543 #endif /* !go32 && !win32*/ 544 } 545 546 /* Kill the inferior process. Make us have no inferior. */ 547 548 /* ARGSUSED */ 549 static void 550 kill_command (arg, from_tty) 551 char *arg; 552 int from_tty; 553 { 554 /* FIXME: This should not really be inferior_pid (or target_has_execution). 555 It should be a distinct flag that indicates that a target is active, cuz 556 some targets don't have processes! */ 557 558 if (inferior_pid == 0) 559 error ("The program is not being run."); 560 if (!query ("Kill the program being debugged? ")) 561 error ("Not confirmed."); 562 target_kill (); 563 564 init_thread_list(); /* Destroy thread info */ 565 566 /* Killing off the inferior can leave us with a core file. If so, 567 print the state we are left in. */ 568 if (target_has_stack) { 569 printf_filtered ("In %s,\n", target_longname); 570 if (selected_frame == NULL) 571 fputs_filtered ("No selected stack frame.\n", gdb_stdout); 572 else 573 print_stack_frame (selected_frame, selected_frame_level, 1); 574 } 575 } 576 577 /* Call set_sigint_trap when you need to pass a signal on to an attached 578 process when handling SIGINT */ 579 580 /* ARGSUSED */ 581 static void 582 pass_signal (signo) 583 int signo; 584 { 585 #ifndef _WIN32 586 kill (inferior_pid, SIGINT); 587 #endif 588 } 589 590 static void (*osig)(); 591 592 void 593 set_sigint_trap() 594 { 595 if (attach_flag || inferior_thisrun_terminal) 596 { 597 osig = (void (*) ()) signal (SIGINT, pass_signal); 598 } 599 } 600 601 void 602 clear_sigint_trap() 603 { 604 if (attach_flag || inferior_thisrun_terminal) 605 { 606 signal (SIGINT, osig); 607 } 608 } 609 610 #if defined (SIGIO) && defined (FASYNC) && defined (FD_SET) && defined (F_SETOWN) 611 static void (*old_sigio) (); 612 613 static void 614 handle_sigio (signo) 615 int signo; 616 { 617 int numfds; 618 fd_set readfds; 619 620 signal (SIGIO, handle_sigio); 621 622 FD_ZERO (&readfds); 623 FD_SET (target_activity_fd, &readfds); 624 numfds = select (target_activity_fd + 1, &readfds, NULL, NULL, NULL); 625 if (numfds >= 0 && FD_ISSET (target_activity_fd, &readfds)) 626 { 627 #ifndef _WIN32 628 if ((*target_activity_function) ()) 629 kill (inferior_pid, SIGINT); 630 #endif 631 } 632 } 633 634 static int old_fcntl_flags; 635 636 void 637 set_sigio_trap () 638 { 639 if (target_activity_function) 640 { 641 old_sigio = (void (*) ()) signal (SIGIO, handle_sigio); 642 fcntl (target_activity_fd, F_SETOWN, getpid()); 643 old_fcntl_flags = fcntl (target_activity_fd, F_GETFL, 0); 644 fcntl (target_activity_fd, F_SETFL, old_fcntl_flags | FASYNC); 645 } 646 } 647 648 void 649 clear_sigio_trap () 650 { 651 if (target_activity_function) 652 { 653 signal (SIGIO, old_sigio); 654 fcntl (target_activity_fd, F_SETFL, old_fcntl_flags); 655 } 656 } 657 #else /* No SIGIO. */ 658 void 659 set_sigio_trap () 660 { 661 if (target_activity_function) 662 abort (); 663 } 664 665 void 666 clear_sigio_trap () 667 { 668 if (target_activity_function) 669 abort (); 670 } 671 #endif /* No SIGIO. */ 672 673 674 /* This is here because this is where we figure out whether we (probably) 675 have job control. Just using job_control only does part of it because 676 setpgid or setpgrp might not exist on a system without job control. 677 It might be considered misplaced (on the other hand, process groups and 678 job control are closely related to ttys). 679 680 For a more clean implementation, in libiberty, put a setpgid which merely 681 calls setpgrp and a setpgrp which does nothing (any system with job control 682 will have one or the other). */ 683 int 684 gdb_setpgid () 685 { 686 int retval = 0; 687 688 if (job_control) 689 { 690 #if defined (NEED_POSIX_SETPGID) || (defined (HAVE_TERMIOS) && defined (HAVE_SETPGID)) 691 /* setpgid (0, 0) is supposed to work and mean the same thing as 692 this, but on Ultrix 4.2A it fails with EPERM (and 693 setpgid (getpid (), getpid ()) succeeds). */ 694 retval = setpgid (getpid (), getpid ()); 695 #else 696 #if defined (TIOCGPGRP) 697 #if defined(USG) && !defined(SETPGRP_ARGS) 698 retval = setpgrp (); 699 #else 700 retval = setpgrp (getpid (), getpid ()); 701 #endif /* USG */ 702 #endif /* TIOCGPGRP. */ 703 #endif /* NEED_POSIX_SETPGID */ 704 } 705 return retval; 706 } 707 708 void 709 _initialize_inflow () 710 { 711 add_info ("terminal", term_info, 712 "Print inferior's saved terminal status."); 713 714 add_com ("kill", class_run, kill_command, 715 "Kill execution of program being debugged."); 716 717 inferior_pid = 0; 718 719 terminal_is_ours = 1; 720 721 /* OK, figure out whether we have job control. If neither termios nor 722 sgtty (i.e. termio or go32), leave job_control 0. */ 723 724 #if defined (HAVE_TERMIOS) 725 /* Do all systems with termios have the POSIX way of identifying job 726 control? I hope so. */ 727 #ifdef _POSIX_JOB_CONTROL 728 job_control = 1; 729 #else 730 #ifdef _SC_JOB_CONTROL 731 job_control = sysconf (_SC_JOB_CONTROL); 732 #else 733 job_control = 0; /* have to assume the worst */ 734 #endif /* _SC_JOB_CONTROL */ 735 #endif /* _POSIX_JOB_CONTROL */ 736 #endif /* HAVE_TERMIOS */ 737 738 #ifdef HAVE_SGTTY 739 #ifdef TIOCGPGRP 740 job_control = 1; 741 #else 742 job_control = 0; 743 #endif /* TIOCGPGRP */ 744 #endif /* sgtty */ 745 } 746