aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBjoern Brandenburg <bbb@mpi-sws.org>2012-09-10 03:11:40 -0400
committerBjoern Brandenburg <bbb@mpi-sws.org>2012-10-19 12:50:28 -0400
commit4d44afb20de33f00b0e9ffc708e360a419b11e56 (patch)
tree86fc38fb3609ed766e0b379b5d45e1327b97bcc8
parent46a5a8976116026302e9ee9b94bc93cdb40e247f (diff)
Support terminating ftcat after a given number of samples has been read
-rw-r--r--src/ftcat.c48
1 files changed, 39 insertions, 9 deletions
diff --git a/src/ftcat.c b/src/ftcat.c
index 685f65b..b43a3a5 100644
--- a/src/ftcat.c
+++ b/src/ftcat.c
@@ -34,7 +34,7 @@ static int fd;
34static int event_count = 0; 34static int event_count = 0;
35static cmd_t ids[MAX_EVENTS]; 35static cmd_t ids[MAX_EVENTS];
36static unsigned long total_bytes = 0; 36static unsigned long total_bytes = 0;
37 37static unsigned long stop_after_bytes = 0;
38 38
39static int disable_all(int fd) 39static int disable_all(int fd)
40{ 40{
@@ -80,18 +80,23 @@ static void cat2stdout(int fd)
80 while ((rd = read(fd, buf, 4096)) > 0) { 80 while ((rd = read(fd, buf, 4096)) > 0) {
81 total_bytes += rd; 81 total_bytes += rd;
82 fwrite(buf, 1, rd, stdout); 82 fwrite(buf, 1, rd, stdout);
83 if (stop_after_bytes && total_bytes >= stop_after_bytes)
84 break;
83 } 85 }
84} 86}
85 87
86 88
87static void usage(void) 89static void _usage(void)
88{ 90{
89 fprintf(stderr, 91 fprintf(stderr,
90 "Usage: ftcat <ft device> TS1 TS2 ...." 92 "Usage: ftcat [OPTIONS] <ft device> TS1 TS2 ....\n"
91 "\n"); 93 "\nOptions:\n"
94 " -s SIZE -- stop tracing afer recording SIZE bytes\n");
92 exit(1); 95 exit(1);
93} 96}
94 97
98#define usage(fmt, args...) do { fprintf(stderr, "Error: " fmt "\n", ## args); _usage(); } while (0)
99
95static void shutdown(int sig) 100static void shutdown(int sig)
96{ 101{
97 int ok; 102 int ok;
@@ -100,20 +105,45 @@ static void shutdown(int sig)
100 fprintf(stderr, "disable_all: %m\n"); 105 fprintf(stderr, "disable_all: %m\n");
101} 106}
102 107
108#define OPTSTR "s:"
109
103int main(int argc, char** argv) 110int main(int argc, char** argv)
104{ 111{
112 int opt;
113
105 const char* trace_file; 114 const char* trace_file;
115
116 while ((opt = getopt(argc, argv, OPTSTR)) != -1) {
117 switch (opt) {
118 case 's':
119 stop_after_bytes = atol(optarg);
120 if (stop_after_bytes == 0)
121 usage("invalid size (%s)", optarg);
122 break;
123 case ':':
124 usage("Argument missing.");
125 break;
126 case '?':
127 default:
128 usage("Bad argument.");
129 break;
130 }
131 }
132
133 argc -= optind;
134 argv += optind;
135
106 if (argc < 3) 136 if (argc < 3)
107 usage(); 137 usage("Argument missing.");
108 138
109 trace_file = argv[1]; 139 trace_file = argv[0];
110 fd = open(trace_file, O_RDWR); 140 fd = open(trace_file, O_RDWR);
111 if (fd < 0) { 141 if (fd < 0) {
112 perror("could not open feathertrace"); 142 usage("could not open feathertrace device (%s): %m", trace_file);
113 return 1; 143 return 1;
114 } 144 }
115 argc -= 2; 145 argc -= 1;
116 argv += 2; 146 argv += 1;
117 signal(SIGINT, shutdown); 147 signal(SIGINT, shutdown);
118 signal(SIGUSR1, shutdown); 148 signal(SIGUSR1, shutdown);
119 signal(SIGTERM, shutdown); 149 signal(SIGTERM, shutdown);