blob: bfc6e41c01afb482c0dfd58589293338afaba080 [file] [log] [blame]
Juan Cespedes273ea6d1998-03-14 23:02:40 +01001#include <sys/types.h>
2#include <string.h>
3#include <stdio.h>
4#include <errno.h>
5#include <stdlib.h>
6
Juan Cespedesf7281232009-06-25 16:11:21 +02007#include "common.h"
Juan Cespedes273ea6d1998-03-14 23:02:40 +01008
Juan Cespedesa8909f72009-04-28 20:02:41 +02009Process *
Juan Cespedesf1350522008-12-16 18:19:58 +010010open_program(char *filename, pid_t pid) {
Juan Cespedesa8909f72009-04-28 20:02:41 +020011 Process *proc;
12 proc = calloc(sizeof(Process), 1);
Juan Cespedes273ea6d1998-03-14 23:02:40 +010013 if (!proc) {
14 perror("malloc");
15 exit(1);
16 }
Juan Cespedese0660df2009-05-21 18:14:39 +020017 proc->filename = strdup(filename);
Juan Cespedes273ea6d1998-03-14 23:02:40 +010018 proc->breakpoints_enabled = -1;
Ian Wienand2d45b1a2006-02-20 22:48:07 +010019 if (pid) {
20 proc->pid = pid;
21 }
Juan Cespedes7186e2a2003-01-31 19:56:34 +010022 breakpoints_init(proc);
Juan Cespedes273ea6d1998-03-14 23:02:40 +010023
24 proc->next = list_of_processes;
25 list_of_processes = proc;
26 return proc;
27}
28
Juan Cespedesf1350522008-12-16 18:19:58 +010029void
Juan Cespedes8d1b92b2009-07-03 10:39:34 +020030open_pid(pid_t pid) {
Juan Cespedesa8909f72009-04-28 20:02:41 +020031 Process *proc;
Ian Wienand2d45b1a2006-02-20 22:48:07 +010032 char *filename;
Juan Cespedes273ea6d1998-03-14 23:02:40 +010033
Ian Wienand2d45b1a2006-02-20 22:48:07 +010034 if (trace_pid(pid) < 0) {
35 fprintf(stderr, "Cannot attach to pid %u: %s\n", pid,
36 strerror(errno));
Juan Cespedes35d70631998-03-15 14:05:40 +010037 return;
38 }
39
Juan Cespedes273ea6d1998-03-14 23:02:40 +010040 filename = pid2name(pid);
41
42 if (!filename) {
Juan Cespedes8d1b92b2009-07-03 10:39:34 +020043 fprintf(stderr, "Cannot trace pid %u: %s\n", pid,
Ian Wienand2d45b1a2006-02-20 22:48:07 +010044 strerror(errno));
Juan Cespedes273ea6d1998-03-14 23:02:40 +010045 return;
46 }
Juan Cespedes273ea6d1998-03-14 23:02:40 +010047
Ian Wienand9a2ad352006-02-20 22:44:45 +010048 proc = open_program(filename, pid);
Juan Cespedesaee09312007-08-31 18:49:48 +020049 continue_process(pid);
Ian Wienand9a2ad352006-02-20 22:44:45 +010050 proc->breakpoints_enabled = 1;
Juan Cespedes273ea6d1998-03-14 23:02:40 +010051}
Juan Cespedese74c80d2009-02-11 11:32:31 +010052
Juan Cespedesa8909f72009-04-28 20:02:41 +020053Process *
Juan Cespedese74c80d2009-02-11 11:32:31 +010054pid2proc(pid_t pid) {
Juan Cespedesa8909f72009-04-28 20:02:41 +020055 Process *tmp;
Juan Cespedese74c80d2009-02-11 11:32:31 +010056
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}