blob: a05f5b56b676c54f33c6ab6f5b44c8d1680b2e9f [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 Cespedes1c2be911997-06-09 01:12:01 +02007
Juan Cespedes5e01f651998-03-08 22:31:44 +01008#include "ltrace.h"
Juan Cespedes96935a91997-08-09 23:45:39 +02009#include "elf.h"
Juan Cespedes3268a161997-08-25 16:45:22 +020010#include "output.h"
Juan Cespedes5e01f651998-03-08 22:31:44 +010011#include "config_file.h"
12#include "options.h"
Juan Cespedes96935a91997-08-09 23:45:39 +020013
Juan Cespedes5e01f651998-03-08 22:31:44 +010014char * command;
15struct process * list_of_processes = NULL;
Juan Cespedes24c82531997-06-25 00:02:58 +020016
Juan Cespedes5e01f651998-03-08 22:31:44 +010017static struct process * open_program(void);
Juan Cespedes23658aa1997-08-27 22:27:36 +020018
Juan Cespedes1c2be911997-06-09 01:12:01 +020019int main(int argc, char **argv)
20{
Juan Cespedes5e01f651998-03-08 22:31:44 +010021 argv = process_options(argc, argv);
22 if (opt_p || opt_f) {
23 fprintf(stderr, "ERROR: Options -p and -f don't work yet\n");
Juan Cespedes1c2be911997-06-09 01:12:01 +020024 exit(1);
25 }
Juan Cespedes5e01f651998-03-08 22:31:44 +010026 read_config_file("/etc/ltrace.conf");
27 if (getenv("HOME")) {
28 char path[PATH_MAX];
29 sprintf(path, getenv("HOME")); /* FIXME: buffer overrun */
30 strcat(path, "/.ltrace.conf");
31 read_config_file(path);
Juan Cespedes23658aa1997-08-27 22:27:36 +020032 }
Juan Cespedes5e01f651998-03-08 22:31:44 +010033 execute_program(open_program(), argv);
Juan Cespedes1c2be911997-06-09 01:12:01 +020034 while(1) {
Juan Cespedes5e01f651998-03-08 22:31:44 +010035 process_event(wait_for_something());
36 }
37}
38
39static struct process * open_program(void)
40{
41 list_of_processes = malloc(sizeof(struct process));
42 if (!list_of_processes) {
43 perror("malloc");
44 exit(1);
45 }
46 list_of_processes->filename = command;
47 list_of_processes->pid = 0;
48 list_of_processes->breakpoints_enabled = -1;
49 list_of_processes->current_syscall = -1;
50 list_of_processes->current_symbol = NULL;
51 list_of_processes->breakpoint_being_enabled = NULL;
52 list_of_processes->next = NULL;
53 if (opt_L) {
54 list_of_processes->list_of_symbols = read_elf(command);
55 } else {
56 list_of_processes->list_of_symbols = NULL;
Juan Cespedes1c2be911997-06-09 01:12:01 +020057 }
Juan Cespedesef04ba41997-08-22 21:55:45 +020058
Juan Cespedes5e01f651998-03-08 22:31:44 +010059 return list_of_processes;
Juan Cespedes1c2be911997-06-09 01:12:01 +020060}