xref: /openbsd/gnu/usr.bin/binutils/gdb/inflow.c (revision 78b63d65)
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