blob: 33bb24c092574d18cd1b525d8542d56444106fae [file] [log] [blame]
Juan Cespedes1c2be911997-06-09 01:12:01 +02001#include <stdio.h>
2#include <errno.h>
3#include <unistd.h>
Juan Cespedes1c2be911997-06-09 01:12:01 +02004
Juan Cespedes96935a91997-08-09 23:45:39 +02005#include "elf.h"
Juan Cespedesef04ba41997-08-22 21:55:45 +02006#include "process.h"
Juan Cespedes96935a91997-08-09 23:45:39 +02007
Juan Cespedes96935a91997-08-09 23:45:39 +02008extern void read_config_file(const char *);
Juan Cespedes24c82531997-06-25 00:02:58 +02009
Juan Cespedes5b2f9811997-07-17 00:05:10 +020010FILE * output = stderr;
Juan Cespedes5e4455b1997-08-24 01:48:26 +020011int opt_d = 0; /* debug */
12int opt_i = 0; /* instruction pointer */
13int opt_S = 0; /* syscalls */
Juan Cespedes5b2f9811997-07-17 00:05:10 +020014
Juan Cespedes5b2f9811997-07-17 00:05:10 +020015static void usage(void)
16{
Juan Cespedes5e4455b1997-08-24 01:48:26 +020017 fprintf(stderr,"Usage: ltrace [-d] [-i] [-S] [-o filename] command [arg ...]\n\n");
Juan Cespedes5b2f9811997-07-17 00:05:10 +020018}
19
Juan Cespedes1c2be911997-06-09 01:12:01 +020020int main(int argc, char **argv)
21{
Juan Cespedesef04ba41997-08-22 21:55:45 +020022 int pid;
Juan Cespedesad783621997-06-10 17:11:33 +020023
Juan Cespedes5b2f9811997-07-17 00:05:10 +020024 while ((argc>2) && (argv[1][0] == '-') && (argv[1][2] == '\0')) {
Juan Cespedesad783621997-06-10 17:11:33 +020025 switch(argv[1][1]) {
Juan Cespedes1afec691997-08-23 21:31:46 +020026 case 'd': opt_d++;
Juan Cespedesad783621997-06-10 17:11:33 +020027 break;
Juan Cespedes5b2f9811997-07-17 00:05:10 +020028 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 Cespedes1afec691997-08-23 21:31:46 +020035 case 'i': opt_i++;
36 break;
Juan Cespedes5e4455b1997-08-24 01:48:26 +020037 case 'S': opt_S++;
38 break;
Juan Cespedesad783621997-06-10 17:11:33 +020039 default: fprintf(stderr, "Unknown option '%c'\n", argv[1][1]);
Juan Cespedes5b2f9811997-07-17 00:05:10 +020040 usage();
Juan Cespedesad783621997-06-10 17:11:33 +020041 exit(1);
42 }
43 argc--; argv++;
44 }
Juan Cespedes1c2be911997-06-09 01:12:01 +020045
46 if (argc<2) {
Juan Cespedes5b2f9811997-07-17 00:05:10 +020047 usage();
Juan Cespedes1c2be911997-06-09 01:12:01 +020048 exit(1);
49 }
Juan Cespedesad783621997-06-10 17:11:33 +020050 if (!read_elf(argv[1])) {
Juan Cespedes5b2f9811997-07-17 00:05:10 +020051 fprintf(stderr, "%s: Not dynamically linked\n", argv[1]);
Juan Cespedes1c2be911997-06-09 01:12:01 +020052 exit(1);
53 }
Juan Cespedesef04ba41997-08-22 21:55:45 +020054
55 init_sighandler();
56
Juan Cespedes1afec691997-08-23 21:31:46 +020057 if (opt_d>0) {
58 fprintf(output, "Reading config file(s)...\n");
59 }
Juan Cespedes96935a91997-08-09 23:45:39 +020060 read_config_file("/etc/ltrace.cfg");
61 read_config_file(".ltracerc");
Juan Cespedes1afec691997-08-23 21:31:46 +020062
63 pid = execute_process(argv[1], argv+1);
64 if (opt_d>0) {
65 fprintf(output, "pid %u launched\n", pid);
66 }
Juan Cespedesad783621997-06-10 17:11:33 +020067
Juan Cespedes1c2be911997-06-09 01:12:01 +020068 while(1) {
Juan Cespedesef04ba41997-08-22 21:55:45 +020069 pause();
70 if (!list_of_processes) {
71 break;
Juan Cespedes1c2be911997-06-09 01:12:01 +020072 }
73 }
Juan Cespedesef04ba41997-08-22 21:55:45 +020074
Juan Cespedes1c2be911997-06-09 01:12:01 +020075 exit(0);
76}