Juan Cespedes | 273ea6d | 1998-03-14 23:02:40 +0100 | [diff] [blame] | 1 | #include <sys/types.h> |
2 | #include <string.h> | ||||
3 | #include <stdio.h> | ||||
4 | #include <errno.h> | ||||
5 | #include <stdlib.h> | ||||
6 | |||||
Juan Cespedes | f728123 | 2009-06-25 16:11:21 +0200 | [diff] [blame] | 7 | #include "common.h" |
Juan Cespedes | 273ea6d | 1998-03-14 23:02:40 +0100 | [diff] [blame] | 8 | |
Juan Cespedes | a8909f7 | 2009-04-28 20:02:41 +0200 | [diff] [blame] | 9 | Process * |
Juan Cespedes | f135052 | 2008-12-16 18:19:58 +0100 | [diff] [blame] | 10 | open_program(char *filename, pid_t pid) { |
Juan Cespedes | a8909f7 | 2009-04-28 20:02:41 +0200 | [diff] [blame] | 11 | Process *proc; |
12 | proc = calloc(sizeof(Process), 1); | ||||
Juan Cespedes | 273ea6d | 1998-03-14 23:02:40 +0100 | [diff] [blame] | 13 | if (!proc) { |
14 | perror("malloc"); | ||||
15 | exit(1); | ||||
16 | } | ||||
Juan Cespedes | e0660df | 2009-05-21 18:14:39 +0200 | [diff] [blame] | 17 | proc->filename = strdup(filename); |
Juan Cespedes | 273ea6d | 1998-03-14 23:02:40 +0100 | [diff] [blame] | 18 | proc->breakpoints_enabled = -1; |
Ian Wienand | 2d45b1a | 2006-02-20 22:48:07 +0100 | [diff] [blame] | 19 | if (pid) { |
20 | proc->pid = pid; | ||||
21 | } | ||||
Juan Cespedes | 7186e2a | 2003-01-31 19:56:34 +0100 | [diff] [blame] | 22 | breakpoints_init(proc); |
Juan Cespedes | 273ea6d | 1998-03-14 23:02:40 +0100 | [diff] [blame] | 23 | |
24 | proc->next = list_of_processes; | ||||
25 | list_of_processes = proc; | ||||
26 | return proc; | ||||
27 | } | ||||
28 | |||||
Juan Cespedes | f135052 | 2008-12-16 18:19:58 +0100 | [diff] [blame] | 29 | void |
Juan Cespedes | 8d1b92b | 2009-07-03 10:39:34 +0200 | [diff] [blame^] | 30 | open_pid(pid_t pid) { |
Juan Cespedes | a8909f7 | 2009-04-28 20:02:41 +0200 | [diff] [blame] | 31 | Process *proc; |
Ian Wienand | 2d45b1a | 2006-02-20 22:48:07 +0100 | [diff] [blame] | 32 | char *filename; |
Juan Cespedes | 273ea6d | 1998-03-14 23:02:40 +0100 | [diff] [blame] | 33 | |
Ian Wienand | 2d45b1a | 2006-02-20 22:48:07 +0100 | [diff] [blame] | 34 | if (trace_pid(pid) < 0) { |
35 | fprintf(stderr, "Cannot attach to pid %u: %s\n", pid, | ||||
36 | strerror(errno)); | ||||
Juan Cespedes | 35d7063 | 1998-03-15 14:05:40 +0100 | [diff] [blame] | 37 | return; |
38 | } | ||||
39 | |||||
Juan Cespedes | 273ea6d | 1998-03-14 23:02:40 +0100 | [diff] [blame] | 40 | filename = pid2name(pid); |
41 | |||||
42 | if (!filename) { | ||||
Juan Cespedes | 8d1b92b | 2009-07-03 10:39:34 +0200 | [diff] [blame^] | 43 | fprintf(stderr, "Cannot trace pid %u: %s\n", pid, |
Ian Wienand | 2d45b1a | 2006-02-20 22:48:07 +0100 | [diff] [blame] | 44 | strerror(errno)); |
Juan Cespedes | 273ea6d | 1998-03-14 23:02:40 +0100 | [diff] [blame] | 45 | return; |
46 | } | ||||
Juan Cespedes | 273ea6d | 1998-03-14 23:02:40 +0100 | [diff] [blame] | 47 | |
Ian Wienand | 9a2ad35 | 2006-02-20 22:44:45 +0100 | [diff] [blame] | 48 | proc = open_program(filename, pid); |
Juan Cespedes | aee0931 | 2007-08-31 18:49:48 +0200 | [diff] [blame] | 49 | continue_process(pid); |
Ian Wienand | 9a2ad35 | 2006-02-20 22:44:45 +0100 | [diff] [blame] | 50 | proc->breakpoints_enabled = 1; |
Juan Cespedes | 273ea6d | 1998-03-14 23:02:40 +0100 | [diff] [blame] | 51 | } |
Juan Cespedes | e74c80d | 2009-02-11 11:32:31 +0100 | [diff] [blame] | 52 | |
Juan Cespedes | a8909f7 | 2009-04-28 20:02:41 +0200 | [diff] [blame] | 53 | Process * |
Juan Cespedes | e74c80d | 2009-02-11 11:32:31 +0100 | [diff] [blame] | 54 | pid2proc(pid_t pid) { |
Juan Cespedes | a8909f7 | 2009-04-28 20:02:41 +0200 | [diff] [blame] | 55 | Process *tmp; |
Juan Cespedes | e74c80d | 2009-02-11 11:32:31 +0100 | [diff] [blame] | 56 | |
57 | tmp = list_of_processes; | ||||
58 | while (tmp) { | ||||
59 | if (pid == tmp->pid) { | ||||
60 | return tmp; | ||||
61 | } | ||||
62 | tmp = tmp->next; | ||||
63 | } | ||||
64 | return NULL; | ||||
65 | } |