source: examples/tracedump/tracedump-libtrace.cc @ cb8c1b9

4.0.1-hotfixescachetimestampsdevelopdpdk-ndagetsilivegetfragoffhelplibtrace4ndag_formatpfringrc-4.0.1rc-4.0.2rc-4.0.3rc-4.0.4ringdecrementfixringperformanceringtimestampfixes
Last change on this file since cb8c1b9 was cb8c1b9, checked in by Daniel Lawson <dlawson@…>, 16 years ago

getopt support on commandline:
-c count number of packets to capture
-f filter (quoted) bpf filter

you can specify multiple traces at the end, and it will progress through all of them until it completes.

  • Property mode set to 100644
File size: 1.7 KB
Line 
1#include <libtrace.h>
2#include <err.h>
3#include <time.h>
4#include "tracedump.h"
5#include <stdio.h>
6#include <stdlib.h>
7#include <getopt.h>
8
9void usage(char *argv0) 
10{
11        fprintf(stderr,"Usage:\n"
12        "%s flags inputfile\n"
13        "-f --filter=expr       BPF filter specification, quoted\n"
14        "-c --count=num         terminate after num packets\n"
15        ,argv0);
16        exit(0);
17}
18
19int main(int argc,char **argv)
20{
21        struct libtrace_t *trace = NULL;
22        struct libtrace_packet_t packet;
23        struct libtrace_filter_t *filter=NULL;
24        uint64_t count=0;
25        uint64_t numpackets=0;
26       
27
28        if (argc<2)
29                usage(argv[0]);
30
31        while(1) {
32                int option_index;
33                struct option long_options[] = {
34                        { "filter",     1, 0, 'f' },
35                        { "count",      1, 0, 'c' },
36                        { NULL,         0, 0, 0 },
37                };
38
39                int c=getopt_long(argc,argv,"f:c:",
40                                long_options, &option_index);
41                if (c == -1)
42                        break;
43                switch(c) {
44                        case 'f': 
45                                if (filter!=NULL) {
46                                        fprintf(stderr,"You can only have one filter (quote it with " ")\n");
47                                        usage(argv[0]);
48                                }
49                                filter=trace_bpf_setfilter(optarg);
50                                break;
51                        case 'c': count=atol(optarg); break;
52                        default:
53                                  printf("unknown option: %c\n",c);
54                                  usage(argv[0]);
55                }
56        }
57                               
58       
59
60        while(optind <argc) {
61                trace = trace_create(argv[optind]);
62                numpackets = 0;
63                if (!trace) {
64                        errx(1,"Failed to open trace");
65                }
66
67                while(trace_read_packet(trace,&packet)> 0 ){
68                        time_t sec = (time_t)trace_get_seconds(&packet);
69                        char *link=(char *)trace_get_link(&packet);
70                        if (filter && !trace_bpf_filter(filter,&packet))
71                                continue;
72
73                        printf("%s",ctime(&sec));
74                        per_packet(trace_get_link_type(&packet),
75                                        link,
76                                        packet.size-(link-packet.buffer));
77                        if(count) {
78                                numpackets++;
79                                if (numpackets == count)
80                                        break;
81                        }
82                }
83
84                trace_destroy(trace);
85                optind ++;
86        }
87        return 0;
88}
Note: See TracBrowser for help on using the repository browser.