| Juan Cespedes | 1c2be91 | 1997-06-09 01:12:01 +0200 | [diff] [blame] | 1 | #include <stdio.h> |
| 2 | #include <errno.h> |
| 3 | #include <unistd.h> |
| Juan Cespedes | 1c2be91 | 1997-06-09 01:12:01 +0200 | [diff] [blame] | 4 | |
| Juan Cespedes | 96935a9 | 1997-08-09 23:45:39 +0200 | [diff] [blame] | 5 | #include "elf.h" |
| Juan Cespedes | 1afec69 | 1997-08-23 21:31:46 +0200 | [diff] [blame^] | 6 | #include "i386.h" |
| Juan Cespedes | c9a48b9 | 1997-08-17 02:45:40 +0200 | [diff] [blame] | 7 | #include "symbols.h" |
| Juan Cespedes | 07461b6 | 1997-08-22 15:29:10 +0200 | [diff] [blame] | 8 | #include "functions.h" |
| Juan Cespedes | ef04ba4 | 1997-08-22 21:55:45 +0200 | [diff] [blame] | 9 | #include "process.h" |
| Juan Cespedes | 96935a9 | 1997-08-09 23:45:39 +0200 | [diff] [blame] | 10 | |
| Juan Cespedes | 96935a9 | 1997-08-09 23:45:39 +0200 | [diff] [blame] | 11 | extern void read_config_file(const char *); |
| Juan Cespedes | 24c8253 | 1997-06-25 00:02:58 +0200 | [diff] [blame] | 12 | |
| Juan Cespedes | 5b2f981 | 1997-07-17 00:05:10 +0200 | [diff] [blame] | 13 | FILE * output = stderr; |
| Juan Cespedes | 1afec69 | 1997-08-23 21:31:46 +0200 | [diff] [blame^] | 14 | int opt_d = 0; |
| 15 | int opt_i = 0; |
| Juan Cespedes | 5b2f981 | 1997-07-17 00:05:10 +0200 | [diff] [blame] | 16 | |
| 17 | unsigned long return_addr; |
| 18 | unsigned char return_value; |
| 19 | struct library_symbol * current_symbol; |
| 20 | |
| Juan Cespedes | 5b2f981 | 1997-07-17 00:05:10 +0200 | [diff] [blame] | 21 | static void usage(void) |
| 22 | { |
| Juan Cespedes | 1afec69 | 1997-08-23 21:31:46 +0200 | [diff] [blame^] | 23 | fprintf(stderr,"Usage: ltrace [-d] [-o filename] command [arg ...]\n\n"); |
| Juan Cespedes | 5b2f981 | 1997-07-17 00:05:10 +0200 | [diff] [blame] | 24 | } |
| 25 | |
| Juan Cespedes | 1c2be91 | 1997-06-09 01:12:01 +0200 | [diff] [blame] | 26 | int main(int argc, char **argv) |
| 27 | { |
| Juan Cespedes | ef04ba4 | 1997-08-22 21:55:45 +0200 | [diff] [blame] | 28 | int pid; |
| Juan Cespedes | ad78362 | 1997-06-10 17:11:33 +0200 | [diff] [blame] | 29 | |
| Juan Cespedes | 5b2f981 | 1997-07-17 00:05:10 +0200 | [diff] [blame] | 30 | while ((argc>2) && (argv[1][0] == '-') && (argv[1][2] == '\0')) { |
| Juan Cespedes | ad78362 | 1997-06-10 17:11:33 +0200 | [diff] [blame] | 31 | switch(argv[1][1]) { |
| Juan Cespedes | 1afec69 | 1997-08-23 21:31:46 +0200 | [diff] [blame^] | 32 | case 'd': opt_d++; |
| Juan Cespedes | ad78362 | 1997-06-10 17:11:33 +0200 | [diff] [blame] | 33 | break; |
| Juan Cespedes | 5b2f981 | 1997-07-17 00:05:10 +0200 | [diff] [blame] | 34 | case 'o': output = fopen(argv[2], "w"); |
| 35 | if (!output) { |
| 36 | fprintf(stderr, "Can't open %s for output: %s\n", argv[2], sys_errlist[errno]); |
| 37 | exit(1); |
| 38 | } |
| 39 | argc--; argv++; |
| 40 | break; |
| Juan Cespedes | 1afec69 | 1997-08-23 21:31:46 +0200 | [diff] [blame^] | 41 | case 'i': opt_i++; |
| 42 | break; |
| Juan Cespedes | ad78362 | 1997-06-10 17:11:33 +0200 | [diff] [blame] | 43 | default: fprintf(stderr, "Unknown option '%c'\n", argv[1][1]); |
| Juan Cespedes | 5b2f981 | 1997-07-17 00:05:10 +0200 | [diff] [blame] | 44 | usage(); |
| Juan Cespedes | ad78362 | 1997-06-10 17:11:33 +0200 | [diff] [blame] | 45 | exit(1); |
| 46 | } |
| 47 | argc--; argv++; |
| 48 | } |
| Juan Cespedes | 1c2be91 | 1997-06-09 01:12:01 +0200 | [diff] [blame] | 49 | |
| 50 | if (argc<2) { |
| Juan Cespedes | 5b2f981 | 1997-07-17 00:05:10 +0200 | [diff] [blame] | 51 | usage(); |
| Juan Cespedes | 1c2be91 | 1997-06-09 01:12:01 +0200 | [diff] [blame] | 52 | exit(1); |
| 53 | } |
| Juan Cespedes | ad78362 | 1997-06-10 17:11:33 +0200 | [diff] [blame] | 54 | if (!read_elf(argv[1])) { |
| Juan Cespedes | 5b2f981 | 1997-07-17 00:05:10 +0200 | [diff] [blame] | 55 | fprintf(stderr, "%s: Not dynamically linked\n", argv[1]); |
| Juan Cespedes | 1c2be91 | 1997-06-09 01:12:01 +0200 | [diff] [blame] | 56 | exit(1); |
| 57 | } |
| Juan Cespedes | ef04ba4 | 1997-08-22 21:55:45 +0200 | [diff] [blame] | 58 | |
| 59 | init_sighandler(); |
| 60 | |
| Juan Cespedes | 1afec69 | 1997-08-23 21:31:46 +0200 | [diff] [blame^] | 61 | if (opt_d>0) { |
| 62 | fprintf(output, "Reading config file(s)...\n"); |
| 63 | } |
| Juan Cespedes | 96935a9 | 1997-08-09 23:45:39 +0200 | [diff] [blame] | 64 | read_config_file("/etc/ltrace.cfg"); |
| 65 | read_config_file(".ltracerc"); |
| Juan Cespedes | 1afec69 | 1997-08-23 21:31:46 +0200 | [diff] [blame^] | 66 | |
| 67 | pid = execute_process(argv[1], argv+1); |
| 68 | if (opt_d>0) { |
| 69 | fprintf(output, "pid %u launched\n", pid); |
| 70 | } |
| Juan Cespedes | ad78362 | 1997-06-10 17:11:33 +0200 | [diff] [blame] | 71 | |
| Juan Cespedes | 1c2be91 | 1997-06-09 01:12:01 +0200 | [diff] [blame] | 72 | while(1) { |
| Juan Cespedes | ef04ba4 | 1997-08-22 21:55:45 +0200 | [diff] [blame] | 73 | pause(); |
| 74 | if (!list_of_processes) { |
| 75 | break; |
| Juan Cespedes | 1c2be91 | 1997-06-09 01:12:01 +0200 | [diff] [blame] | 76 | } |
| 77 | } |
| Juan Cespedes | ef04ba4 | 1997-08-22 21:55:45 +0200 | [diff] [blame] | 78 | |
| Juan Cespedes | 1c2be91 | 1997-06-09 01:12:01 +0200 | [diff] [blame] | 79 | exit(0); |
| 80 | } |