blob: 1ce110867e31d5f65a38004202339de87470d2d0 [file] [log] [blame]
Juan Cespedes1c2be911997-06-09 01:12:01 +02001#include <stdio.h>
Juan Cespedes23658aa1997-08-27 22:27:36 +02002#include <stdlib.h>
Juan Cespedes1c2be911997-06-09 01:12:01 +02003#include <unistd.h>
Juan Cespedes23658aa1997-08-27 22:27:36 +02004#include <string.h>
Juan Cespedes5e01f651998-03-08 22:31:44 +01005#include <errno.h>
6#include <sys/param.h>
Juan Cespedes5e0acdb1998-04-04 08:34:07 +02007#include <signal.h>
Juan Cespedes1c2be911997-06-09 01:12:01 +02008
Juan Cespedes5e01f651998-03-08 22:31:44 +01009#include "ltrace.h"
Juan Cespedes96935a91997-08-09 23:45:39 +020010#include "elf.h"
Juan Cespedes3268a161997-08-25 16:45:22 +020011#include "output.h"
Juan Cespedes5e01f651998-03-08 22:31:44 +010012#include "config_file.h"
13#include "options.h"
Juan Cespedes96935a91997-08-09 23:45:39 +020014
Juan Cespedes1fe93d51998-03-13 00:29:21 +010015char * command = NULL;
Juan Cespedes5e01f651998-03-08 22:31:44 +010016struct process * list_of_processes = NULL;
Juan Cespedes24c82531997-06-25 00:02:58 +020017
Juan Cespedes5e0acdb1998-04-04 08:34:07 +020018static void normal_exit(void);
19static void signal_exit(int);
20
Juan Cespedes1c2be911997-06-09 01:12:01 +020021int main(int argc, char **argv)
22{
Juan Cespedes5e0acdb1998-04-04 08:34:07 +020023 atexit(normal_exit);
24 signal(SIGINT,signal_exit); /* Detach processes when interrupted */
25 signal(SIGTERM,signal_exit); /* ... or killed */
26
Juan Cespedes5e01f651998-03-08 22:31:44 +010027 argv = process_options(argc, argv);
Juan Cespedes5e01f651998-03-08 22:31:44 +010028 read_config_file("/etc/ltrace.conf");
29 if (getenv("HOME")) {
30 char path[PATH_MAX];
31 sprintf(path, getenv("HOME")); /* FIXME: buffer overrun */
32 strcat(path, "/.ltrace.conf");
33 read_config_file(path);
Juan Cespedes23658aa1997-08-27 22:27:36 +020034 }
Juan Cespedes1fe93d51998-03-13 00:29:21 +010035 while (opt_p) {
Juan Cespedes273ea6d1998-03-14 23:02:40 +010036 open_pid(opt_p->pid, 1);
Juan Cespedes1fe93d51998-03-13 00:29:21 +010037 opt_p = opt_p->next;
38 }
Juan Cespedes1fe93d51998-03-13 00:29:21 +010039 if (command) {
40 execute_program(open_program(command), argv);
41 }
Juan Cespedes1c2be911997-06-09 01:12:01 +020042 while(1) {
Juan Cespedes5e01f651998-03-08 22:31:44 +010043 process_event(wait_for_something());
44 }
45}
46
Juan Cespedes5e0acdb1998-04-04 08:34:07 +020047static void signal_exit(int sig)
48{
49 exit(2);
50}
51
52static void normal_exit(void)
53{
54 struct process * tmp = list_of_processes;
55
56 while(tmp) {
57 kill(tmp->pid, SIGSTOP);
58 disable_all_breakpoints(tmp);
59 continue_process(tmp->pid);
60 untrace_pid(tmp->pid);
61 tmp = tmp->next;
62 }
63}