source: tools/tracemerge/tracemerge.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: 2.4 KB
Line 
1#include <libtrace.h>
2#include <stdio.h>
3#include <stdlib.h>
4#include <inttypes.h>
5#include <stdbool.h>
6#include <getopt.h>
7
8void usage(char *argv0)
9{
10        fprintf(stderr,"Usage: %s [ -i | --set-interface ] outputuri traceuri...\n",argv0);
11        fprintf(stderr,"\n");
12        fprintf(stderr,"Merges traces together, with -i each trace gets it's own direction/interface,\n without traces keep whatever direction/interface they have set\n");
13        exit(1);
14}
15
16int main(int argc, char *argv[])
17{
18       
19        struct libtrace_out_t *output;
20        struct libtrace_t **input;
21        struct libtrace_packet_t **packet;
22        bool *live;
23        bool set_interface=false;
24        int i=0;
25
26        while (1) {
27                int option_index;
28                struct option long_options[] = {
29                        { "set-interface",      0, 0, 'i' },
30                        { NULL,                 0, 0, 0 },
31                };
32
33                int c=getopt_long(argc, argv, "i:",
34                                long_options, &option_index);
35
36                if (c==-1)
37                        break;
38
39                switch (c) {
40                        case 'i': set_interface=true; break;
41                        default:
42                                fprintf(stderr,"unknown option: %c\n",c);
43                                usage(argv[0]);
44
45                }
46
47        }
48
49        if (optind+2<argc)
50                usage(argv[0]);
51
52        output=trace_create_output(argv[optind]);
53        if (!output) {
54                fprintf(stderr,"Unable to open output file %s\n",argv[optind]);
55                return 1;
56        }
57
58        input=calloc((argc-optind),sizeof(struct libtrace_t *));
59        packet=calloc((argc-optind),sizeof(struct libtrace_packet_t *));
60        live=calloc((argc-optind),sizeof(bool));
61        for(i=0;i<argc-optind;++i) {
62                struct libtrace_t *f;
63                struct libtrace_packet_t *p;
64                f=trace_create(argv[i+optind]);
65                p=trace_create_packet();
66                input[i]=f;
67                packet[i]=p;
68                if (!input[i]) {
69                        fprintf(stderr,"Could not read %s\n",argv[i+optind]);
70                        return 1;
71                }
72                trace_read_packet(f,p);
73        }
74
75        while(1) {
76                uint64_t oldest_ts=0;
77                int oldest=-1;
78                for(i=0;i<argc-2;++i) {
79                        if (!live[i] && input[i]) {
80                                int ret=trace_read_packet(input[i],packet[i]);
81                                if (ret<0) {
82                                        /* Error */
83                                        perror(argv[i+2]);
84                                        trace_destroy(input[i]);
85                                        input[i]=NULL;
86                                }
87                                else if (ret==0) {
88                                        /* EOF */
89                                        trace_destroy(input[i]);
90                                        input[i]=NULL;
91                                }
92                                else
93                                        live[i]=true;
94                        }
95                        if (live[i] && 
96                                (oldest==-1 || 
97                                 oldest_ts<trace_get_erf_timestamp(packet[i]))) {
98                                oldest=i;
99                                oldest_ts=trace_get_erf_timestamp(packet[i]);
100                        }
101                }
102                /* We have run out of packets! */
103                if (oldest==-1) {
104                        break;
105                }
106
107                if (set_interface)
108                        trace_set_direction(packet[oldest],oldest);
109                trace_write_packet(output,packet[oldest]);
110                live[oldest]=false;
111               
112        }
113        trace_destroy_output(output);
114
115        return 0;
116}
Note: See TracBrowser for help on using the repository browser.