blob: 88edd0a4c5824228b105c418986fb1150edb9872 [file] [log] [blame]
Juan Cespedesd44c6b81998-09-25 14:48:42 +02001#if HAVE_CONFIG_H
2#include "config.h"
3#endif
4
Juan Cespedes273ea6d1998-03-14 23:02:40 +01005#include <sys/types.h>
6#include <string.h>
7#include <stdio.h>
8#include <errno.h>
9#include <stdlib.h>
10
11#include "ltrace.h"
12#include "options.h"
13#include "elf.h"
14
Juan Cespedesf1350522008-12-16 18:19:58 +010015struct process *
16open_program(char *filename, pid_t pid) {
Ian Wienand2d45b1a2006-02-20 22:48:07 +010017 struct process *proc;
Ian Wienand9a2ad352006-02-20 22:44:45 +010018 proc = calloc(sizeof(struct process), 1);
Juan Cespedes273ea6d1998-03-14 23:02:40 +010019 if (!proc) {
20 perror("malloc");
21 exit(1);
22 }
23 proc->filename = filename;
Juan Cespedes273ea6d1998-03-14 23:02:40 +010024 proc->breakpoints_enabled = -1;
Ian Wienand2d45b1a2006-02-20 22:48:07 +010025 if (pid) {
26 proc->pid = pid;
27 }
Juan Cespedes7186e2a2003-01-31 19:56:34 +010028 breakpoints_init(proc);
Juan Cespedes273ea6d1998-03-14 23:02:40 +010029
30 proc->next = list_of_processes;
31 list_of_processes = proc;
32 return proc;
33}
34
Juan Cespedesf1350522008-12-16 18:19:58 +010035void
36open_pid(pid_t pid, int verbose) {
Ian Wienand2d45b1a2006-02-20 22:48:07 +010037 struct process *proc;
38 char *filename;
Juan Cespedes273ea6d1998-03-14 23:02:40 +010039
Ian Wienand2d45b1a2006-02-20 22:48:07 +010040 if (trace_pid(pid) < 0) {
41 fprintf(stderr, "Cannot attach to pid %u: %s\n", pid,
42 strerror(errno));
Juan Cespedes35d70631998-03-15 14:05:40 +010043 return;
44 }
45
Juan Cespedes273ea6d1998-03-14 23:02:40 +010046 filename = pid2name(pid);
47
Juan Cespedes35d70631998-03-15 14:05:40 +010048#if 0
Juan Cespedes273ea6d1998-03-14 23:02:40 +010049 if (!filename) {
50 if (verbose) {
Ian Wienand2d45b1a2006-02-20 22:48:07 +010051 fprintf(stderr, "Cannot trace pid %u: %s\n", pid,
52 strerror(errno));
Juan Cespedes273ea6d1998-03-14 23:02:40 +010053 }
54 return;
55 }
Juan Cespedes35d70631998-03-15 14:05:40 +010056#endif
Juan Cespedes273ea6d1998-03-14 23:02:40 +010057
Ian Wienand9a2ad352006-02-20 22:44:45 +010058 proc = open_program(filename, pid);
Juan Cespedesaee09312007-08-31 18:49:48 +020059 continue_process(pid);
Ian Wienand9a2ad352006-02-20 22:44:45 +010060 proc->breakpoints_enabled = 1;
Juan Cespedes273ea6d1998-03-14 23:02:40 +010061}
Juan Cespedese74c80d2009-02-11 11:32:31 +010062
63struct process *
64pid2proc(pid_t pid) {
65 struct process *tmp;
66
67 tmp = list_of_processes;
68 while (tmp) {
69 if (pid == tmp->pid) {
70 return tmp;
71 }
72 tmp = tmp->next;
73 }
74 return NULL;
75}