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