OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [trunk/] [insight/] [gdb/] [inflow.c] - Blame information for rev 1765

Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.