2004-10-08 Andrew Cagney <cagney@gnu.org>
[deliverable/binutils-gdb.git] / gdb / inftarg.c
CommitLineData
c906108c 1/* Target-vector operations for controlling Unix child processes, for GDB.
1bac305b
AC
2
3 Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1998, 1999,
baf92889 4 2000, 2002, 2003, 2004 Free Software Foundation, Inc.
1bac305b 5
c906108c
SS
6 Contributed by Cygnus Support.
7
c5aa993b 8 ## Contains temporary hacks..
c906108c 9
c5aa993b 10 This file is part of GDB.
c906108c 11
c5aa993b
JM
12 This program is free software; you can redistribute it and/or modify
13 it under the terms of the GNU General Public License as published by
14 the Free Software Foundation; either version 2 of the License, or
15 (at your option) any later version.
c906108c 16
c5aa993b
JM
17 This program is distributed in the hope that it will be useful,
18 but WITHOUT ANY WARRANTY; without even the implied warranty of
19 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 GNU General Public License for more details.
c906108c 21
c5aa993b
JM
22 You should have received a copy of the GNU General Public License
23 along with this program; if not, write to the Free Software
24 Foundation, Inc., 59 Temple Place - Suite 330,
25 Boston, MA 02111-1307, USA. */
c906108c
SS
26
27#include "defs.h"
c5aa993b 28#include "frame.h" /* required by inferior.h */
c906108c
SS
29#include "inferior.h"
30#include "target.h"
31#include "gdbcore.h"
32#include "command.h"
33#include "gdb_stat.h"
34#include <signal.h>
35#include <sys/types.h>
36#include <fcntl.h>
20d2ca3e 37#include "observer.h"
03f2053f 38#include "gdb_wait.h"
44270758 39#include "inflow.h"
c906108c 40
a14ed312
KB
41extern struct symtab_and_line *child_enable_exception_callback (enum
42 exception_event_kind,
43 int);
c906108c 44
a14ed312
KB
45extern struct exception_event_record
46 *child_get_current_exception_event (void);
c906108c 47
a14ed312 48extern void _initialize_inftarg (void);
c906108c 49
a14ed312 50static void child_prepare_to_store (void);
c906108c
SS
51
52#ifndef CHILD_WAIT
39f77062 53static ptid_t child_wait (ptid_t, struct target_waitstatus *);
c906108c
SS
54#endif /* CHILD_WAIT */
55
a14ed312 56static void child_open (char *, int);
c906108c 57
a14ed312 58static void child_files_info (struct target_ops *);
c906108c 59
a14ed312 60static void child_detach (char *, int);
c906108c 61
a14ed312 62static void child_attach (char *, int);
c906108c 63
c906108c 64#if !defined(CHILD_POST_ATTACH)
a14ed312 65extern void child_post_attach (int);
c906108c
SS
66#endif
67
a14ed312 68static void ptrace_me (void);
c906108c 69
a14ed312 70static void ptrace_him (int);
c906108c 71
c27cda74 72static void child_create_inferior (char *, char *, char **, int);
c906108c 73
a14ed312 74static void child_mourn_inferior (void);
c906108c 75
a14ed312 76static int child_can_run (void);
c906108c 77
a14ed312 78static void child_stop (void);
c906108c
SS
79
80#ifndef CHILD_THREAD_ALIVE
39f77062 81int child_thread_alive (ptid_t);
c906108c
SS
82#endif
83
a14ed312 84static void init_child_ops (void);
c906108c
SS
85
86extern char **environ;
87
c906108c
SS
88int child_suppress_run = 0; /* Non-zero if inftarg should pretend not to
89 be a runnable target. Used by targets
90 that can sit atop inftarg, such as HPUX
91 thread support. */
92
93#ifndef CHILD_WAIT
94
c906108c
SS
95/* Wait for child to do something. Return pid of child, or -1 in case
96 of error; store status through argument pointer OURSTATUS. */
97
39f77062
KB
98static ptid_t
99child_wait (ptid_t ptid, struct target_waitstatus *ourstatus)
c906108c
SS
100{
101 int save_errno;
102 int status;
7a292a7a 103 char *execd_pathname = NULL;
c5aa993b
JM
104 int exit_status;
105 int related_pid;
106 int syscall_id;
107 enum target_waitkind kind;
39f77062 108 int pid;
c906108c 109
c5aa993b
JM
110 do
111 {
112 set_sigint_trap (); /* Causes SIGINT to be passed on to the
113 attached process. */
114 set_sigio_trap ();
c906108c 115
ee21b650 116 pid = wait (&status);
c906108c 117
c5aa993b 118 save_errno = errno;
c906108c 119
c5aa993b 120 clear_sigio_trap ();
c906108c 121
c5aa993b 122 clear_sigint_trap ();
c906108c 123
c5aa993b
JM
124 if (pid == -1)
125 {
126 if (save_errno == EINTR)
127 continue;
c906108c 128
c5aa993b
JM
129 fprintf_unfiltered (gdb_stderr, "Child process unexpectedly missing: %s.\n",
130 safe_strerror (save_errno));
c906108c 131
c5aa993b
JM
132 /* Claim it exited with unknown signal. */
133 ourstatus->kind = TARGET_WAITKIND_SIGNALLED;
134 ourstatus->value.sig = TARGET_SIGNAL_UNKNOWN;
39f77062 135 return pid_to_ptid (-1);
c5aa993b 136 }
c906108c 137
c5aa993b 138 /* Did it exit?
c906108c 139 */
c5aa993b
JM
140 if (target_has_exited (pid, status, &exit_status))
141 {
142 /* ??rehrauer: For now, ignore this. */
143 continue;
144 }
145
39f77062 146 if (!target_thread_alive (pid_to_ptid (pid)))
c5aa993b
JM
147 {
148 ourstatus->kind = TARGET_WAITKIND_SPURIOUS;
39f77062 149 return pid_to_ptid (pid);
c5aa993b 150 }
47932f85 151 } while (pid != PIDGET (inferior_ptid)); /* Some other child died or stopped */
c906108c
SS
152
153 store_waitstatus (ourstatus, status);
39f77062 154 return pid_to_ptid (pid);
c906108c
SS
155}
156#endif /* CHILD_WAIT */
157
c906108c
SS
158#ifndef CHILD_THREAD_ALIVE
159
160/* Check to see if the given thread is alive.
161
162 FIXME: Is kill() ever the right way to do this? I doubt it, but
163 for now we're going to try and be compatable with the old thread
164 code. */
165int
39f77062 166child_thread_alive (ptid_t ptid)
c906108c 167{
39f77062
KB
168 pid_t pid = PIDGET (ptid);
169
c906108c
SS
170 return (kill (pid, 0) != -1);
171}
172
173#endif
174
4c9ba7e0
DJ
175/* Attach to process PID, then initialize for debugging it. */
176
c906108c 177static void
4c9ba7e0 178child_attach (char *args, int from_tty)
c906108c 179{
d966f0cb
AC
180 char *exec_file;
181 int pid;
182 char *dummy;
183
c906108c
SS
184 if (!args)
185 error_no_arg ("process-id to attach");
186
d966f0cb
AC
187 dummy = args;
188 pid = strtol (args, &dummy, 0);
189 /* Some targets don't set errno on errors, grrr! */
190 if ((pid == 0) && (args == dummy))
c906108c 191 error ("Illegal process-id: %s\n", args);
d966f0cb
AC
192
193 if (pid == getpid ()) /* Trying to masturbate? */
194 error ("I refuse to debug myself!");
195
196 if (from_tty)
197 {
198 exec_file = (char *) get_exec_file (0);
199
200 if (exec_file)
201 printf_unfiltered ("Attaching to program: %s, %s\n", exec_file,
202 target_pid_to_str (pid_to_ptid (pid)));
203 else
204 printf_unfiltered ("Attaching to %s\n",
205 target_pid_to_str (pid_to_ptid (pid)));
206
207 gdb_flush (gdb_stdout);
208 }
209
210 attach (pid);
211
212 inferior_ptid = pid_to_ptid (pid);
1df84f13 213 push_target (&deprecated_child_ops);
c906108c
SS
214}
215
c906108c
SS
216#if !defined(CHILD_POST_ATTACH)
217void
fba45db2 218child_post_attach (int pid)
c906108c
SS
219{
220 /* This version of Unix doesn't require a meaningful "post attach"
221 operation by a debugger. */
222}
223#endif
224
4c9ba7e0
DJ
225/* Take a program previously attached to and detaches it.
226 The program resumes execution and will no longer stop
227 on signals, etc. We'd better not have left any breakpoints
228 in the program or it'll die when it hits one. For this
229 to work, it may be necessary for the process to have been
230 previously attached. It *might* work if the program was
231 started via the normal ptrace (PTRACE_TRACEME). */
c906108c
SS
232
233static void
4c9ba7e0 234child_detach (char *args, int from_tty)
c906108c 235{
d966f0cb
AC
236 int siggnal = 0;
237 int pid = PIDGET (inferior_ptid);
238
239 if (from_tty)
240 {
241 char *exec_file = get_exec_file (0);
242 if (exec_file == 0)
243 exec_file = "";
244 printf_unfiltered ("Detaching from program: %s, %s\n", exec_file,
245 target_pid_to_str (pid_to_ptid (pid)));
246 gdb_flush (gdb_stdout);
247 }
248 if (args)
249 siggnal = atoi (args);
250
251 detach (siggnal);
252
253 inferior_ptid = null_ptid;
1df84f13 254 unpush_target (&deprecated_child_ops);
c906108c
SS
255}
256
c906108c
SS
257/* Get ready to modify the registers array. On machines which store
258 individual registers, this doesn't need to do anything. On machines
259 which store all the registers in one fell swoop, this makes sure
260 that registers contains all the registers from the program being
261 debugged. */
262
263static void
fba45db2 264child_prepare_to_store (void)
c906108c
SS
265{
266#ifdef CHILD_PREPARE_TO_STORE
267 CHILD_PREPARE_TO_STORE ();
268#endif
269}
270
271/* Print status information about what we're accessing. */
272
273static void
fba45db2 274child_files_info (struct target_ops *ignore)
c906108c
SS
275{
276 printf_unfiltered ("\tUsing the running image of %s %s.\n",
39f77062 277 attach_flag ? "attached" : "child", target_pid_to_str (inferior_ptid));
c906108c
SS
278}
279
c906108c 280static void
fba45db2 281child_open (char *arg, int from_tty)
c906108c
SS
282{
283 error ("Use the \"run\" command to start a Unix child process.");
284}
285
286/* Stub function which causes the inferior that runs it, to be ptrace-able
287 by its parent process. */
288
289static void
fba45db2 290ptrace_me (void)
c906108c
SS
291{
292 /* "Trace me, Dr. Memory!" */
655c5466 293 call_ptrace (0, 0, (PTRACE_TYPE_ARG3) 0, 0);
c906108c
SS
294}
295
296/* Stub function which causes the GDB that runs it, to start ptrace-ing
297 the child process. */
298
c5aa993b 299static void
fba45db2 300ptrace_him (int pid)
c906108c 301{
1df84f13 302 push_target (&deprecated_child_ops);
c906108c
SS
303
304 /* On some targets, there must be some explicit synchronization
305 between the parent and child processes after the debugger
306 forks, and before the child execs the debuggee program. This
307 call basically gives permission for the child to exec.
c5aa993b 308 */
c906108c
SS
309
310 target_acknowledge_created_inferior (pid);
311
312 /* START_INFERIOR_TRAPS_EXPECTED is defined in inferior.h,
313 * and will be 1 or 2 depending on whether we're starting
314 * without or with a shell.
315 */
316 startup_inferior (START_INFERIOR_TRAPS_EXPECTED);
317
318 /* On some targets, there must be some explicit actions taken after
319 the inferior has been started up.
c5aa993b 320 */
39f77062 321 target_post_startup_inferior (pid_to_ptid (pid));
c906108c
SS
322}
323
39f77062 324/* Start an inferior Unix child process and sets inferior_ptid to its pid.
c906108c
SS
325 EXEC_FILE is the file to run.
326 ALLARGS is a string containing the arguments to the program.
327 ENV is the environment vector to pass. Errors reported with error(). */
328
329static void
c27cda74
AC
330child_create_inferior (char *exec_file, char *allargs, char **env,
331 int from_tty)
c906108c 332{
c906108c 333#ifdef HPUXHPPA
c906108c
SS
334 fork_inferior (exec_file, allargs, env, ptrace_me, ptrace_him, pre_fork_inferior, NULL);
335#else
c5aa993b 336 fork_inferior (exec_file, allargs, env, ptrace_me, ptrace_him, NULL, NULL);
c906108c
SS
337#endif
338 /* We are at the first instruction we care about. */
20d2ca3e 339 observer_notify_inferior_created (&current_target, from_tty);
c906108c 340 /* Pedal to the metal... */
2acceee2 341 proceed ((CORE_ADDR) -1, TARGET_SIGNAL_0, 0);
c906108c
SS
342}
343
344#if !defined(CHILD_POST_STARTUP_INFERIOR)
345void
39f77062 346child_post_startup_inferior (ptid_t ptid)
c906108c
SS
347{
348 /* This version of Unix doesn't require a meaningful "post startup inferior"
349 operation by a debugger.
c5aa993b 350 */
c906108c
SS
351}
352#endif
353
354#if !defined(CHILD_ACKNOWLEDGE_CREATED_INFERIOR)
355void
fba45db2 356child_acknowledge_created_inferior (int pid)
c906108c
SS
357{
358 /* This version of Unix doesn't require a meaningful "acknowledge created inferior"
359 operation by a debugger.
c5aa993b 360 */
c906108c
SS
361}
362#endif
363
364
c906108c
SS
365#if !defined(CHILD_INSERT_FORK_CATCHPOINT)
366int
fba45db2 367child_insert_fork_catchpoint (int pid)
c906108c
SS
368{
369 /* This version of Unix doesn't support notification of fork events. */
370 return 0;
371}
372#endif
373
374#if !defined(CHILD_REMOVE_FORK_CATCHPOINT)
375int
fba45db2 376child_remove_fork_catchpoint (int pid)
c906108c
SS
377{
378 /* This version of Unix doesn't support notification of fork events. */
379 return 0;
380}
381#endif
382
383#if !defined(CHILD_INSERT_VFORK_CATCHPOINT)
384int
fba45db2 385child_insert_vfork_catchpoint (int pid)
c906108c
SS
386{
387 /* This version of Unix doesn't support notification of vfork events. */
388 return 0;
389}
390#endif
391
392#if !defined(CHILD_REMOVE_VFORK_CATCHPOINT)
393int
fba45db2 394child_remove_vfork_catchpoint (int pid)
c906108c
SS
395{
396 /* This version of Unix doesn't support notification of vfork events. */
397 return 0;
398}
399#endif
400
6604731b
DJ
401#if !defined(CHILD_FOLLOW_FORK)
402int
403child_follow_fork (int follow_child)
c906108c 404{
6604731b
DJ
405 /* This version of Unix doesn't support following fork or vfork events. */
406 return 0;
c906108c
SS
407}
408#endif
409
410#if !defined(CHILD_INSERT_EXEC_CATCHPOINT)
411int
fba45db2 412child_insert_exec_catchpoint (int pid)
c906108c
SS
413{
414 /* This version of Unix doesn't support notification of exec events. */
415 return 0;
416}
417#endif
418
419#if !defined(CHILD_REMOVE_EXEC_CATCHPOINT)
420int
fba45db2 421child_remove_exec_catchpoint (int pid)
c906108c
SS
422{
423 /* This version of Unix doesn't support notification of exec events. */
424 return 0;
425}
426#endif
427
c906108c
SS
428#if !defined(CHILD_REPORTED_EXEC_EVENTS_PER_EXEC_CALL)
429int
fba45db2 430child_reported_exec_events_per_exec_call (void)
c906108c
SS
431{
432 /* This version of Unix doesn't support notification of exec events.
c5aa993b 433 */
c906108c
SS
434 return 1;
435}
436#endif
437
c906108c
SS
438#if !defined(CHILD_HAS_EXITED)
439int
fba45db2 440child_has_exited (int pid, int wait_status, int *exit_status)
c906108c
SS
441{
442 if (WIFEXITED (wait_status))
443 {
444 *exit_status = WEXITSTATUS (wait_status);
445 return 1;
446 }
447
448 if (WIFSIGNALED (wait_status))
449 {
c5aa993b 450 *exit_status = 0; /* ?? Don't know what else to say here. */
c906108c
SS
451 return 1;
452 }
453
454 /* ?? Do we really need to consult the event state, too? Assume the
c5aa993b 455 wait_state alone suffices.
c906108c
SS
456 */
457 return 0;
458}
459#endif
460
461
462static void
fba45db2 463child_mourn_inferior (void)
c906108c 464{
1df84f13 465 unpush_target (&deprecated_child_ops);
c906108c
SS
466 generic_mourn_inferior ();
467}
468
469static int
fba45db2 470child_can_run (void)
c906108c
SS
471{
472 /* This variable is controlled by modules that sit atop inftarg that may layer
473 their own process structure atop that provided here. hpux-thread.c does
474 this because of the Hpux user-mode level thread model. */
475
476 return !child_suppress_run;
477}
478
479/* Send a SIGINT to the process group. This acts just like the user typed a
480 ^C on the controlling terminal.
481
482 XXX - This may not be correct for all systems. Some may want to use
483 killpg() instead of kill (-pgrp). */
484
485static void
fba45db2 486child_stop (void)
c906108c 487{
c906108c
SS
488 kill (-inferior_process_group, SIGINT);
489}
490
491#if !defined(CHILD_ENABLE_EXCEPTION_CALLBACK)
492struct symtab_and_line *
fba45db2 493child_enable_exception_callback (enum exception_event_kind kind, int enable)
c906108c
SS
494{
495 return (struct symtab_and_line *) NULL;
496}
497#endif
498
499#if !defined(CHILD_GET_CURRENT_EXCEPTION_EVENT)
500struct exception_event_record *
fba45db2 501child_get_current_exception_event (void)
c906108c
SS
502{
503 return (struct exception_event_record *) NULL;
504}
505#endif
506
507
508#if !defined(CHILD_PID_TO_EXEC_FILE)
509char *
fba45db2 510child_pid_to_exec_file (int pid)
c906108c
SS
511{
512 /* This version of Unix doesn't support translation of a process ID
513 to the filename of the executable file.
c5aa993b 514 */
c906108c
SS
515 return NULL;
516}
517#endif
518
519char *
fba45db2 520child_core_file_to_sym_file (char *core)
c906108c
SS
521{
522 /* The target stratum for a running executable need not support
523 this operation.
c5aa993b 524 */
c906108c
SS
525 return NULL;
526}
f168dd80
AC
527
528/* Perform a partial transfer to/from the specified object. For
529 memory transfers, fall back to the old memory xfer functions. */
530
531static LONGEST
8aa91c1e
AC
532child_xfer_partial (struct target_ops *ops, enum target_object object,
533 const char *annex, void *readbuf,
534 const void *writebuf, ULONGEST offset, LONGEST len)
f168dd80
AC
535{
536 switch (object)
537 {
538 case TARGET_OBJECT_MEMORY:
539 if (readbuf)
540 return child_xfer_memory (offset, readbuf, len, 0/*write*/,
541 NULL, ops);
542 if (writebuf)
f929a579 543 return child_xfer_memory (offset, (void *) writebuf, len, 1/*write*/,
f168dd80
AC
544 NULL, ops);
545 return -1;
546
f168dd80
AC
547 case TARGET_OBJECT_UNWIND_TABLE:
548#ifndef NATIVE_XFER_UNWIND_TABLE
549#define NATIVE_XFER_UNWIND_TABLE(OPS,OBJECT,ANNEX,WRITEBUF,READBUF,OFFSET,LEN) (-1)
550#endif
8aa91c1e
AC
551 return NATIVE_XFER_UNWIND_TABLE (ops, object, annex, readbuf, writebuf,
552 offset, len);
f168dd80 553
f168dd80 554 case TARGET_OBJECT_AUXV:
2146d243
RM
555#ifndef NATIVE_XFER_AUXV
556#define NATIVE_XFER_AUXV(OPS,OBJECT,ANNEX,WRITEBUF,READBUF,OFFSET,LEN) (-1)
f168dd80 557#endif
2146d243
RM
558 return NATIVE_XFER_AUXV (ops, object, annex, readbuf, writebuf,
559 offset, len);
f168dd80 560
baf92889
MK
561 case TARGET_OBJECT_WCOOKIE:
562#ifndef NATIVE_XFER_WCOOKIE
563#define NATIVE_XFER_WCOOKIE(OPS,OBJECT,ANNEX,WRITEBUF,READBUF,OFFSET,LEN) (-1)
564#endif
565 return NATIVE_XFER_WCOOKIE (ops, object, annex, readbuf, writebuf,
566 offset, len);
567
f168dd80
AC
568 default:
569 return -1;
570 }
571}
c906108c 572
ed9a39eb
JM
573#if !defined(CHILD_PID_TO_STR)
574char *
39f77062 575child_pid_to_str (ptid_t ptid)
ed9a39eb 576{
39f77062 577 return normal_pid_to_str (ptid);
ed9a39eb
JM
578}
579#endif
c906108c 580
c906108c 581static void
fba45db2 582init_child_ops (void)
c906108c 583{
1df84f13
AC
584 deprecated_child_ops.to_shortname = "child";
585 deprecated_child_ops.to_longname = "Unix child process";
586 deprecated_child_ops.to_doc = "Unix child process (started by the \"run\" command).";
587 deprecated_child_ops.to_open = child_open;
588 deprecated_child_ops.to_attach = child_attach;
589 deprecated_child_ops.to_post_attach = child_post_attach;
590 deprecated_child_ops.to_detach = child_detach;
591 deprecated_child_ops.to_resume = child_resume;
592 deprecated_child_ops.to_wait = child_wait;
593 deprecated_child_ops.to_fetch_registers = fetch_inferior_registers;
594 deprecated_child_ops.to_store_registers = store_inferior_registers;
595 deprecated_child_ops.to_prepare_to_store = child_prepare_to_store;
c8e73a31 596 deprecated_child_ops.deprecated_xfer_memory = child_xfer_memory;
1df84f13
AC
597 deprecated_child_ops.to_xfer_partial = child_xfer_partial;
598 deprecated_child_ops.to_files_info = child_files_info;
599 deprecated_child_ops.to_insert_breakpoint = memory_insert_breakpoint;
600 deprecated_child_ops.to_remove_breakpoint = memory_remove_breakpoint;
601 deprecated_child_ops.to_terminal_init = terminal_init_inferior;
602 deprecated_child_ops.to_terminal_inferior = terminal_inferior;
603 deprecated_child_ops.to_terminal_ours_for_output = terminal_ours_for_output;
604 deprecated_child_ops.to_terminal_save_ours = terminal_save_ours;
605 deprecated_child_ops.to_terminal_ours = terminal_ours;
606 deprecated_child_ops.to_terminal_info = child_terminal_info;
607 deprecated_child_ops.to_kill = kill_inferior;
608 deprecated_child_ops.to_create_inferior = child_create_inferior;
609 deprecated_child_ops.to_post_startup_inferior = child_post_startup_inferior;
610 deprecated_child_ops.to_acknowledge_created_inferior = child_acknowledge_created_inferior;
611 deprecated_child_ops.to_insert_fork_catchpoint = child_insert_fork_catchpoint;
612 deprecated_child_ops.to_remove_fork_catchpoint = child_remove_fork_catchpoint;
613 deprecated_child_ops.to_insert_vfork_catchpoint = child_insert_vfork_catchpoint;
614 deprecated_child_ops.to_remove_vfork_catchpoint = child_remove_vfork_catchpoint;
615 deprecated_child_ops.to_follow_fork = child_follow_fork;
616 deprecated_child_ops.to_insert_exec_catchpoint = child_insert_exec_catchpoint;
617 deprecated_child_ops.to_remove_exec_catchpoint = child_remove_exec_catchpoint;
618 deprecated_child_ops.to_reported_exec_events_per_exec_call = child_reported_exec_events_per_exec_call;
619 deprecated_child_ops.to_has_exited = child_has_exited;
620 deprecated_child_ops.to_mourn_inferior = child_mourn_inferior;
621 deprecated_child_ops.to_can_run = child_can_run;
622 deprecated_child_ops.to_thread_alive = child_thread_alive;
623 deprecated_child_ops.to_pid_to_str = child_pid_to_str;
624 deprecated_child_ops.to_stop = child_stop;
625 deprecated_child_ops.to_enable_exception_callback = child_enable_exception_callback;
626 deprecated_child_ops.to_get_current_exception_event = child_get_current_exception_event;
627 deprecated_child_ops.to_pid_to_exec_file = child_pid_to_exec_file;
628 deprecated_child_ops.to_stratum = process_stratum;
629 deprecated_child_ops.to_has_all_memory = 1;
630 deprecated_child_ops.to_has_memory = 1;
631 deprecated_child_ops.to_has_stack = 1;
632 deprecated_child_ops.to_has_registers = 1;
633 deprecated_child_ops.to_has_execution = 1;
634 deprecated_child_ops.to_magic = OPS_MAGIC;
c906108c
SS
635}
636
637void
fba45db2 638_initialize_inftarg (void)
c906108c
SS
639{
640#ifdef HAVE_OPTIONAL_PROC_FS
641 char procname[32];
642 int fd;
643
644 /* If we have an optional /proc filesystem (e.g. under OSF/1),
645 don't add ptrace support if we can access the running GDB via /proc. */
646#ifndef PROC_NAME_FMT
647#define PROC_NAME_FMT "/proc/%05d"
648#endif
649 sprintf (procname, PROC_NAME_FMT, getpid ());
bde58177
AC
650 fd = open (procname, O_RDONLY);
651 if (fd >= 0)
c906108c
SS
652 {
653 close (fd);
654 return;
655 }
656#endif
657
658 init_child_ops ();
1df84f13 659 add_target (&deprecated_child_ops);
c906108c 660}
This page took 0.587951 seconds and 4 git commands to generate.