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

Subversion Repositories or1k

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

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 1181 sfurman
/* 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 struct serial *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
133
         tty at all!).  Can't do this in _initialize_inflow because
134
         serial_fdopen() won't work until the serial_ops_list is
135
         initialized.  */
136
 
137
#ifdef F_GETFL
138
      tflags_ours = fcntl (0, F_GETFL, 0);
139
#endif
140
 
141
      gdb_has_a_terminal_flag = no;
142
      stdin_serial = serial_fdopen (0);
143
      if (stdin_serial != NULL)
144
        {
145
          our_ttystate = serial_get_tty_state (stdin_serial);
146
 
147
          if (our_ttystate != NULL)
148
            {
149
              gdb_has_a_terminal_flag = yes;
150
#ifdef HAVE_TERMIOS
151
              our_process_group = tcgetpgrp (0);
152
#endif
153
#ifdef HAVE_TERMIO
154
              our_process_group = getpgrp ();
155
#endif
156
#ifdef HAVE_SGTTY
157
              ioctl (0, TIOCGPGRP, &our_process_group);
158
#endif
159
            }
160
        }
161
 
162
      return gdb_has_a_terminal_flag == yes;
163
    default:
164
      /* "Can't happen".  */
165
      return 0;
166
    }
167
}
168
 
169
/* Macro for printing errors from ioctl operations */
170
 
171
#define OOPSY(what)     \
172
  if (result == -1)     \
173
    fprintf_unfiltered(gdb_stderr, "[%s failed in terminal_inferior: %s]\n", \
174
            what, safe_strerror (errno))
175
 
176
static void terminal_ours_1 (int);
177
 
178
/* Initialize the terminal settings we record for the inferior,
179
   before we actually run the inferior.  */
180
 
181
void
182
terminal_init_inferior_with_pgrp (int pgrp)
183
{
184
  if (gdb_has_a_terminal ())
185
    {
186
      /* We could just as well copy our_ttystate (if we felt like
187
         adding a new function serial_copy_tty_state()).  */
188
      if (inferior_ttystate)
189
        xfree (inferior_ttystate);
190
      inferior_ttystate = serial_get_tty_state (stdin_serial);
191
 
192
#ifdef PROCESS_GROUP_TYPE
193
      inferior_process_group = pgrp;
194
#endif
195
 
196
      /* Make sure that next time we call terminal_inferior (which will be
197
         before the program runs, as it needs to be), we install the new
198
         process group.  */
199
      terminal_is_ours = 1;
200
    }
201
}
202
 
203
/* Save the terminal settings again.  This is necessary for the TUI
204
   when it switches to TUI or non-TUI mode;  curses changes the terminal
205
   and gdb must be able to restore it correctly.  */
206
 
207
void
208
terminal_save_ours (void)
209
{
210
  if (gdb_has_a_terminal ())
211
    {
212
      /* We could just as well copy our_ttystate (if we felt like adding
213
         a new function serial_copy_tty_state).  */
214
      if (our_ttystate)
215
        xfree (our_ttystate);
216
      our_ttystate = serial_get_tty_state (stdin_serial);
217
    }
218
}
219
 
220
void
221
terminal_init_inferior (void)
222
{
223
#ifdef PROCESS_GROUP_TYPE
224
  /* This is for Lynx, and should be cleaned up by having Lynx be a separate
225
     debugging target with a version of target_terminal_init_inferior which
226
     passes in the process group to a generic routine which does all the work
227
     (and the non-threaded child_terminal_init_inferior can just pass in
228
     inferior_ptid to the same routine).  */
229
  /* We assume INFERIOR_PID is also the child's process group.  */
230
  terminal_init_inferior_with_pgrp (PIDGET (inferior_ptid));
231
#endif /* PROCESS_GROUP_TYPE */
232
}
233
 
234
/* Put the inferior's terminal settings into effect.
235
   This is preparation for starting or resuming the inferior.  */
236
 
237
void
238
terminal_inferior (void)
239
{
240
  if (gdb_has_a_terminal () && terminal_is_ours
241
      && inferior_thisrun_terminal == 0)
242
    {
243
      int result;
244
 
245
#ifdef F_GETFL
246
      /* Is there a reason this is being done twice?  It happens both
247
         places we use F_SETFL, so I'm inclined to think perhaps there
248
         is some reason, however perverse.  Perhaps not though...  */
249
      result = fcntl (0, F_SETFL, tflags_inferior);
250
      result = fcntl (0, F_SETFL, tflags_inferior);
251
      OOPSY ("fcntl F_SETFL");
252
#endif
253
 
254
      /* Because we were careful to not change in or out of raw mode in
255
         terminal_ours, we will not change in our out of raw mode with
256
         this call, so we don't flush any input.  */
257
      result = serial_set_tty_state (stdin_serial, inferior_ttystate);
258
      OOPSY ("setting tty state");
259
 
260
      if (!job_control)
261
        {
262
          sigint_ours = (void (*)()) signal (SIGINT, SIG_IGN);
263
#ifdef SIGQUIT
264
          sigquit_ours = (void (*)()) signal (SIGQUIT, SIG_IGN);
265
#endif
266
        }
267
 
268
      /* If attach_flag is set, we don't know whether we are sharing a
269
         terminal with the inferior or not.  (attaching a process
270
         without a terminal is one case where we do not; attaching a
271
         process which we ran from the same shell as GDB via `&' is
272
         one case where we do, I think (but perhaps this is not
273
         `sharing' in the sense that we need to save and restore tty
274
         state)).  I don't know if there is any way to tell whether we
275
         are sharing a terminal.  So what we do is to go through all
276
         the saving and restoring of the tty state, but ignore errors
277
         setting the process group, which will happen if we are not
278
         sharing a terminal).  */
279
 
280
      if (job_control)
281
        {
282
#ifdef HAVE_TERMIOS
283
          result = tcsetpgrp (0, inferior_process_group);
284
          if (!attach_flag)
285
            OOPSY ("tcsetpgrp");
286
#endif
287
 
288
#ifdef HAVE_SGTTY
289
          result = ioctl (0, TIOCSPGRP, &inferior_process_group);
290
          if (!attach_flag)
291
            OOPSY ("TIOCSPGRP");
292
#endif
293
        }
294
 
295
    }
296
  terminal_is_ours = 0;
297
}
298
 
299
/* Put some of our terminal settings into effect,
300
   enough to get proper results from our output,
301
   but do not change into or out of RAW mode
302
   so that no input is discarded.
303
 
304
   After doing this, either terminal_ours or terminal_inferior
305
   should be called to get back to a normal state of affairs.  */
306
 
307
void
308
terminal_ours_for_output (void)
309
{
310
  terminal_ours_1 (1);
311
}
312
 
313
/* Put our terminal settings into effect.
314
   First record the inferior's terminal settings
315
   so they can be restored properly later.  */
316
 
317
void
318
terminal_ours (void)
319
{
320
  terminal_ours_1 (0);
321
}
322
 
323
/* output_only is not used, and should not be used unless we introduce
324
   separate terminal_is_ours and terminal_is_ours_for_output
325
   flags.  */
326
 
327
static void
328
terminal_ours_1 (int output_only)
329
{
330
  /* Checking inferior_thisrun_terminal is necessary so that
331
     if GDB is running in the background, it won't block trying
332
     to do the ioctl()'s below.  Checking gdb_has_a_terminal
333
     avoids attempting all the ioctl's when running in batch.  */
334
  if (inferior_thisrun_terminal != 0 || gdb_has_a_terminal () == 0)
335
    return;
336
 
337
  if (!terminal_is_ours)
338
    {
339
#ifdef SIGTTOU
340
      /* Ignore this signal since it will happen when we try to set the
341
         pgrp.  */
342
      void (*osigttou) () = NULL;
343
#endif
344
      int result;
345
 
346
      terminal_is_ours = 1;
347
 
348
#ifdef SIGTTOU
349
      if (job_control)
350
        osigttou = (void (*)()) signal (SIGTTOU, SIG_IGN);
351
#endif
352
 
353
      if (inferior_ttystate)
354
        xfree (inferior_ttystate);
355
      inferior_ttystate = serial_get_tty_state (stdin_serial);
356
#ifdef HAVE_TERMIOS
357
      inferior_process_group = tcgetpgrp (0);
358
#endif
359
#ifdef HAVE_TERMIO
360
      inferior_process_group = getpgrp ();
361
#endif
362
#ifdef HAVE_SGTTY
363
      ioctl (0, TIOCGPGRP, &inferior_process_group);
364
#endif
365
 
366
      /* Here we used to set ICANON in our ttystate, but I believe this
367
         was an artifact from before when we used readline.  Readline sets
368
         the tty state when it needs to.
369
         FIXME-maybe: However, query() expects non-raw mode and doesn't
370
         use readline.  Maybe query should use readline (on the other hand,
371
         this only matters for HAVE_SGTTY, not termio or termios, I think).  */
372
 
373
      /* Set tty state to our_ttystate.  We don't change in our out of raw
374
         mode, to avoid flushing input.  We need to do the same thing
375
         regardless of output_only, because we don't have separate
376
         terminal_is_ours and terminal_is_ours_for_output flags.  It's OK,
377
         though, since readline will deal with raw mode when/if it needs to.
378
       */
379
 
380
      serial_noflush_set_tty_state (stdin_serial, our_ttystate,
381
                                    inferior_ttystate);
382
 
383
      if (job_control)
384
        {
385
#ifdef HAVE_TERMIOS
386
          result = tcsetpgrp (0, our_process_group);
387
#if 0
388
          /* This fails on Ultrix with EINVAL if you run the testsuite
389
             in the background with nohup, and then log out.  GDB never
390
             used to check for an error here, so perhaps there are other
391
             such situations as well.  */
392
          if (result == -1)
393
            fprintf_unfiltered (gdb_stderr, "[tcsetpgrp failed in terminal_ours: %s]\n",
394
                                safe_strerror (errno));
395
#endif
396
#endif /* termios */
397
 
398
#ifdef HAVE_SGTTY
399
          result = ioctl (0, TIOCSPGRP, &our_process_group);
400
#endif
401
        }
402
 
403
#ifdef SIGTTOU
404
      if (job_control)
405
        signal (SIGTTOU, osigttou);
406
#endif
407
 
408
      if (!job_control)
409
        {
410
          signal (SIGINT, sigint_ours);
411
#ifdef SIGQUIT
412
          signal (SIGQUIT, sigquit_ours);
413
#endif
414
        }
415
 
416
#ifdef F_GETFL
417
      tflags_inferior = fcntl (0, F_GETFL, 0);
418
 
419
      /* Is there a reason this is being done twice?  It happens both
420
         places we use F_SETFL, so I'm inclined to think perhaps there
421
         is some reason, however perverse.  Perhaps not though...  */
422
      result = fcntl (0, F_SETFL, tflags_ours);
423
      result = fcntl (0, F_SETFL, tflags_ours);
424
#endif
425
 
426
      result = result;          /* lint */
427
    }
428
}
429
 
430
/* ARGSUSED */
431
void
432
term_info (char *arg, int from_tty)
433
{
434
  target_terminal_info (arg, from_tty);
435
}
436
 
437
/* ARGSUSED */
438
void
439
child_terminal_info (char *args, int from_tty)
440
{
441
  if (!gdb_has_a_terminal ())
442
    {
443
      printf_filtered ("This GDB does not control a terminal.\n");
444
      return;
445
    }
446
 
447
  printf_filtered ("Inferior's terminal status (currently saved by GDB):\n");
448
 
449
  /* First the fcntl flags.  */
450
  {
451
    int flags;
452
 
453
    flags = tflags_inferior;
454
 
455
    printf_filtered ("File descriptor flags = ");
456
 
457
#ifndef O_ACCMODE
458
#define O_ACCMODE (O_RDONLY | O_WRONLY | O_RDWR)
459
#endif
460
    /* (O_ACCMODE) parens are to avoid Ultrix header file bug */
461
    switch (flags & (O_ACCMODE))
462
      {
463
      case O_RDONLY:
464
        printf_filtered ("O_RDONLY");
465
        break;
466
      case O_WRONLY:
467
        printf_filtered ("O_WRONLY");
468
        break;
469
      case O_RDWR:
470
        printf_filtered ("O_RDWR");
471
        break;
472
      }
473
    flags &= ~(O_ACCMODE);
474
 
475
#ifdef O_NONBLOCK
476
    if (flags & O_NONBLOCK)
477
      printf_filtered (" | O_NONBLOCK");
478
    flags &= ~O_NONBLOCK;
479
#endif
480
 
481
#if defined (O_NDELAY)
482
    /* If O_NDELAY and O_NONBLOCK are defined to the same thing, we will
483
       print it as O_NONBLOCK, which is good cause that is what POSIX
484
       has, and the flag will already be cleared by the time we get here.  */
485
    if (flags & O_NDELAY)
486
      printf_filtered (" | O_NDELAY");
487
    flags &= ~O_NDELAY;
488
#endif
489
 
490
    if (flags & O_APPEND)
491
      printf_filtered (" | O_APPEND");
492
    flags &= ~O_APPEND;
493
 
494
#if defined (O_BINARY)
495
    if (flags & O_BINARY)
496
      printf_filtered (" | O_BINARY");
497
    flags &= ~O_BINARY;
498
#endif
499
 
500
    if (flags)
501
      printf_filtered (" | 0x%x", flags);
502
    printf_filtered ("\n");
503
  }
504
 
505
#ifdef PROCESS_GROUP_TYPE
506
  printf_filtered ("Process group = %d\n",
507
                   (int) inferior_process_group);
508
#endif
509
 
510
  serial_print_tty_state (stdin_serial, inferior_ttystate, gdb_stdout);
511
}
512
 
513
/* NEW_TTY_PREFORK is called before forking a new child process,
514
   so we can record the state of ttys in the child to be formed.
515
   TTYNAME is null if we are to share the terminal with gdb;
516
   or points to a string containing the name of the desired tty.
517
 
518
   NEW_TTY is called in new child processes under Unix, which will
519
   become debugger target processes.  This actually switches to
520
   the terminal specified in the NEW_TTY_PREFORK call.  */
521
 
522
void
523
new_tty_prefork (char *ttyname)
524
{
525
  /* Save the name for later, for determining whether we and the child
526
     are sharing a tty.  */
527
  inferior_thisrun_terminal = ttyname;
528
}
529
 
530
void
531
new_tty (void)
532
{
533
  register int tty;
534
 
535
  if (inferior_thisrun_terminal == 0)
536
    return;
537
#if !defined(__GO32__) && !defined(_WIN32)
538
#ifdef TIOCNOTTY
539
  /* Disconnect the child process from our controlling terminal.  On some
540
     systems (SVR4 for example), this may cause a SIGTTOU, so temporarily
541
     ignore SIGTTOU. */
542
  tty = open ("/dev/tty", O_RDWR);
543
  if (tty > 0)
544
    {
545
      void (*osigttou) ();
546
 
547
      osigttou = (void (*)()) signal (SIGTTOU, SIG_IGN);
548
      ioctl (tty, TIOCNOTTY, 0);
549
      close (tty);
550
      signal (SIGTTOU, osigttou);
551
    }
552
#endif
553
 
554
  /* Now open the specified new terminal.  */
555
 
556
#ifdef USE_O_NOCTTY
557
  tty = open (inferior_thisrun_terminal, O_RDWR | O_NOCTTY);
558
#else
559
  tty = open (inferior_thisrun_terminal, O_RDWR);
560
#endif
561
  if (tty == -1)
562
    {
563
      print_sys_errmsg (inferior_thisrun_terminal, errno);
564
      _exit (1);
565
    }
566
 
567
  /* Avoid use of dup2; doesn't exist on all systems.  */
568
  if (tty != 0)
569
    {
570
      close (0);
571
      dup (tty);
572
    }
573
  if (tty != 1)
574
    {
575
      close (1);
576
      dup (tty);
577
    }
578
  if (tty != 2)
579
    {
580
      close (2);
581
      dup (tty);
582
    }
583
  if (tty > 2)
584
    close (tty);
585
#endif /* !go32 && !win32 */
586
}
587
 
588
/* Kill the inferior process.  Make us have no inferior.  */
589
 
590
/* ARGSUSED */
591
static void
592
kill_command (char *arg, int from_tty)
593
{
594
  /* FIXME:  This should not really be inferior_ptid (or target_has_execution).
595
     It should be a distinct flag that indicates that a target is active, cuz
596
     some targets don't have processes! */
597
 
598
  if (ptid_equal (inferior_ptid, null_ptid))
599
    error ("The program is not being run.");
600
  if (!query ("Kill the program being debugged? "))
601
    error ("Not confirmed.");
602
  target_kill ();
603
 
604
  init_thread_list ();          /* Destroy thread info */
605
 
606
  /* Killing off the inferior can leave us with a core file.  If so,
607
     print the state we are left in.  */
608
  if (target_has_stack)
609
    {
610
      printf_filtered ("In %s,\n", target_longname);
611
      if (selected_frame == NULL)
612
        fputs_filtered ("No selected stack frame.\n", gdb_stdout);
613
      else
614
        print_stack_frame (selected_frame,
615
                           frame_relative_level (selected_frame), 1);
616
    }
617
}
618
 
619
/* Call set_sigint_trap when you need to pass a signal on to an attached
620
   process when handling SIGINT */
621
 
622
/* ARGSUSED */
623
static void
624
pass_signal (int signo)
625
{
626
#ifndef _WIN32
627
  kill (PIDGET (inferior_ptid), SIGINT);
628
#endif
629
}
630
 
631
static void (*osig) ();
632
 
633
void
634
set_sigint_trap (void)
635
{
636
  if (attach_flag || inferior_thisrun_terminal)
637
    {
638
      osig = (void (*)()) signal (SIGINT, pass_signal);
639
    }
640
}
641
 
642
void
643
clear_sigint_trap (void)
644
{
645
  if (attach_flag || inferior_thisrun_terminal)
646
    {
647
      signal (SIGINT, osig);
648
    }
649
}
650
 
651
#if defined (SIGIO) && defined (FASYNC) && defined (FD_SET) && defined (F_SETOWN)
652
static void (*old_sigio) ();
653
 
654
static void
655
handle_sigio (int signo)
656
{
657
  int numfds;
658
  fd_set readfds;
659
 
660
  signal (SIGIO, handle_sigio);
661
 
662
  FD_ZERO (&readfds);
663
  FD_SET (target_activity_fd, &readfds);
664
  numfds = select (target_activity_fd + 1, &readfds, NULL, NULL, NULL);
665
  if (numfds >= 0 && FD_ISSET (target_activity_fd, &readfds))
666
    {
667
#ifndef _WIN32
668
      if ((*target_activity_function) ())
669
        kill (PIDGET (inferior_ptid), SIGINT);
670
#endif
671
    }
672
}
673
 
674
static int old_fcntl_flags;
675
 
676
void
677
set_sigio_trap (void)
678
{
679
  if (target_activity_function)
680
    {
681
      old_sigio = (void (*)()) signal (SIGIO, handle_sigio);
682
      fcntl (target_activity_fd, F_SETOWN, getpid ());
683
      old_fcntl_flags = fcntl (target_activity_fd, F_GETFL, 0);
684
      fcntl (target_activity_fd, F_SETFL, old_fcntl_flags | FASYNC);
685
    }
686
}
687
 
688
void
689
clear_sigio_trap (void)
690
{
691
  if (target_activity_function)
692
    {
693
      signal (SIGIO, old_sigio);
694
      fcntl (target_activity_fd, F_SETFL, old_fcntl_flags);
695
    }
696
}
697
#else /* No SIGIO.  */
698
void
699
set_sigio_trap (void)
700
{
701
  if (target_activity_function)
702
    internal_error (__FILE__, __LINE__, "failed internal consistency check");
703
}
704
 
705
void
706
clear_sigio_trap (void)
707
{
708
  if (target_activity_function)
709
    internal_error (__FILE__, __LINE__, "failed internal consistency check");
710
}
711
#endif /* No SIGIO.  */
712
 
713
 
714
/* This is here because this is where we figure out whether we (probably)
715
   have job control.  Just using job_control only does part of it because
716
   setpgid or setpgrp might not exist on a system without job control.
717
   It might be considered misplaced (on the other hand, process groups and
718
   job control are closely related to ttys).
719
 
720
   For a more clean implementation, in libiberty, put a setpgid which merely
721
   calls setpgrp and a setpgrp which does nothing (any system with job control
722
   will have one or the other).  */
723
int
724
gdb_setpgid (void)
725
{
726
  int retval = 0;
727
 
728
  if (job_control)
729
    {
730
#if defined (HAVE_TERMIOS) || defined (TIOCGPGRP)
731
#ifdef HAVE_SETPGID
732
      /* The call setpgid (0, 0) is supposed to work and mean the same
733
         thing as this, but on Ultrix 4.2A it fails with EPERM (and
734
         setpgid (getpid (), getpid ()) succeeds).  */
735
      retval = setpgid (getpid (), getpid ());
736
#else
737
#ifdef HAVE_SETPGRP
738
#ifdef SETPGRP_VOID 
739
      retval = setpgrp ();
740
#else
741
      retval = setpgrp (getpid (), getpid ());
742
#endif
743
#endif /* HAVE_SETPGRP */
744
#endif /* HAVE_SETPGID */
745
#endif /* defined (HAVE_TERMIOS) || defined (TIOCGPGRP) */
746
    }
747
 
748
  return retval;
749
}
750
 
751
void
752
_initialize_inflow (void)
753
{
754
  add_info ("terminal", term_info,
755
            "Print inferior's saved terminal status.");
756
 
757
  add_com ("kill", class_run, kill_command,
758
           "Kill execution of program being debugged.");
759
 
760
  inferior_ptid = null_ptid;
761
 
762
  terminal_is_ours = 1;
763
 
764
  /* OK, figure out whether we have job control.  If neither termios nor
765
     sgtty (i.e. termio or go32), leave job_control 0.  */
766
 
767
#if defined (HAVE_TERMIOS)
768
  /* Do all systems with termios have the POSIX way of identifying job
769
     control?  I hope so.  */
770
#ifdef _POSIX_JOB_CONTROL
771
  job_control = 1;
772
#else
773
#ifdef _SC_JOB_CONTROL
774
  job_control = sysconf (_SC_JOB_CONTROL);
775
#else
776
  job_control = 0;               /* have to assume the worst */
777
#endif /* _SC_JOB_CONTROL */
778
#endif /* _POSIX_JOB_CONTROL */
779
#endif /* HAVE_TERMIOS */
780
 
781
#ifdef HAVE_SGTTY
782
#ifdef TIOCGPGRP
783
  job_control = 1;
784
#else
785
  job_control = 0;
786
#endif /* TIOCGPGRP */
787
#endif /* sgtty */
788
}

powered by: WebSVN 2.1.0

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