source: tools/tracesplit/tracesplit.c @ d56089a

4.0.1-hotfixescachetimestampsdevelopdpdk-ndagetsilivegetfragoffhelplibtrace4ndag_formatpfringrc-4.0.1rc-4.0.2rc-4.0.3rc-4.0.4ringdecrementfixringperformanceringtimestampfixes
Last change on this file since d56089a was d56089a, checked in by Shane Alcock <salcock@…>, 16 years ago

Updated examples and tools to use new function names

  • Property mode set to 100644
File size: 3.7 KB
RevLine 
[5d022cd]1#include <libtrace.h>
2#include <stdio.h>
3#include <stdlib.h>
[41b53c2]4#ifdef HAVE_INTTYPES_H
5#  include <inttypes.h>
6#endif
[e3b0188]7#include <lt_inttypes.h>
[5d022cd]8#include <stdbool.h>
9#include <getopt.h>
10#include <string.h>
11
12char *strdupcat(char *str,char *app)
13{
14        str=realloc(str,strlen(str)+strlen(app)+1);
15        strcat(str,app);
16        return str;
17}
18
19char *strdupcati(char *str,int i)
20{
21        char buffer[64];
22        snprintf(buffer,sizeof(buffer),"%i",i);
23        return strdupcat(str,buffer);
24}
25
26int usage(char *argv)
27{
28        printf("Usage: %s inputurl [ -c count ] [ -f bpffilter ] [ -b bytes ]\n\t[ -s starttime ] [ -e endtime ] [ -i interval ] outputurl\n",argv);
29        printf("\n");
30        printf("Splits up traces\n");
31        printf("-c count        split every count packets\n");
32        printf("-f bpffilter    only output packets that match filter\n");
33        printf("-b bytes        split every capture bytes\n");
34        printf("-s time         start at starttime\n");
35        printf("-e time         end at endtime\n");
36        printf("-i seconds      create a new trace every <seconds>\n");
37        printf("\n");
38        exit(1);
39}
40
41int main(int argc, char *argv[])
42{
43        struct libtrace_filter_t *filter=NULL;
44        struct libtrace_out_t *output = NULL;
45        struct libtrace_t *input;
[d56089a]46        struct libtrace_packet_t *packet = trace_create_packet();
[5d022cd]47        uint64_t count=UINT64_MAX;
48        uint64_t bytes=UINT64_MAX;
49        uint64_t starttime=0;
50        uint64_t endtime=UINT64_MAX;
51        uint64_t interval=UINT64_MAX;
52        double firsttime=0;
53        uint64_t pktcount=0;
54        uint64_t totbytes=0;
55        uint64_t totbyteslast=0;
56
57        if (argc<2) {
58                usage(argv[0]);
59                return 1;
60        }
61
62        /* Parse command line options */
63        while(1) {
64                int option_index;
65                struct option long_options[] = {
66                        { "filter",     1, 0, 'f' },
67                        { "count",      1, 0, 'c' },
68                        { "bytes",      1, 0, 'b' },
69                        { "starttime",  1, 0, 's' },
70                        { "endtime",    1, 0, 'e' },
71                        { "interval",   1, 0, 'i' },
72                        { NULL,         0, 0, 0   },
73                };
74
75                int c=getopt_long(argc, argv, "f:c:b:s:e:i:",
76                                long_options, &option_index);
77
78                if (c==-1)
79                        break;
80
81                switch (c) {
82                        case 'f': filter=trace_bpf_setfilter(optarg);
83                                break;
84                        case 'c': count=atoi(optarg);
85                                break;
86                        case 'b': bytes=atoi(optarg);
87                                break;
88                        case 's': starttime=atoi(optarg); /* FIXME: use getdate */
89                                  break;
90                        case 'e': endtime=atoi(optarg);
91                                  break;
92                        case 'i': interval=atoi(optarg);
93                                  break;
94                        default:
95                                fprintf(stderr,"Unknown option: %c\n",c);
96                                usage(argv[0]);
97                                return 1;
98                }
99        }
100        if (optind+2<argc) {
101                fprintf(stderr,"missing inputuri or outputuri\n");
102                usage(argv[0]);
103        }
104
105        output=NULL;
106        input=trace_create(argv[optind]);
107
108        while(1) {
[3840760]109                if (trace_read_packet(input,packet)<1) {
[5d022cd]110                        break;
111                }
112
113
[3840760]114                if (filter && !trace_bpf_filter(filter,packet)) {
[5d022cd]115                        continue;
116                }
117
[3840760]118                if (trace_get_seconds(packet)<starttime) {
[5d022cd]119                        continue;
120                }
121
[3840760]122                if (trace_get_seconds(packet)>endtime) {
[5d022cd]123                        break;
124                }
125
126                if (firsttime==0) {
[3840760]127                        firsttime=trace_get_seconds(packet);
[5d022cd]128                }
129
[3840760]130                if (output && trace_get_seconds(packet)>firsttime+interval) {
[d56089a]131                        trace_destroy_output(output);
[5d022cd]132                        output=NULL;
133                        firsttime+=interval;
134                }
135
136                pktcount++;
137                if (output && pktcount%count==0) {
[d56089a]138                        trace_destroy_output(output);
[5d022cd]139                        output=NULL;
140                }
141
[3840760]142                totbytes+=trace_get_capture_length(packet);
[5d022cd]143                if (output && totbytes-totbyteslast>=bytes) {
[d56089a]144                        trace_destroy_output(output);
[5d022cd]145                        output=NULL;
146                        totbyteslast=totbytes;
147                }
148
149                if (!output) {
150                        char *buffer;
151                        buffer=strdup(argv[optind+1]);
152                        if (interval!=UINT64_MAX) {
153                                buffer=strdupcat(buffer,"-");
154                                buffer=strdupcati(buffer,firsttime);
155                        }
156                        if (count!=UINT64_MAX) {
157                                buffer=strdupcat(buffer,"-");
158                                buffer=strdupcati(buffer,pktcount);
159                        }
160                        if (bytes!=UINT64_MAX) {
161                                static int filenum=0;
162                                buffer=strdupcat(buffer,"-");
163                                buffer=strdupcati(buffer,++filenum);
164                        }
[d56089a]165                        output=trace_create_output(buffer);
[5d022cd]166                        free(buffer);
167                }
168
[3840760]169                trace_write_packet(output,packet);
[5d022cd]170        }
171
172        if (!output)
[d56089a]173                trace_destroy_output(output);
[5d022cd]174
175        return 0;
176}
Note: See TracBrowser for help on using the repository browser.