source: examples/erfsplit/erfsplit.c @ c773929

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

added erfsplit into libtrace.

erfsplit builds cleanly, supports date matching and bpf filters

  • Property mode set to 100644
File size: 6.1 KB
Line 
1/*
2 * This file is part of libtrace
3 *
4 * Copyright (c) 2004 The University of Waikato, Hamilton, New Zealand.
5 * Authors: Daniel Lawson
6 *          Perry Lorier
7 *         
8 * All rights reserved.
9 *
10 * This code has been developed by the University of Waikato WAND
11 * research group. For further information please see http://www.wand.net.nz/
12 *
13 * libtrace is free software; you can redistribute it and/or modify
14 * it under the terms of the GNU General Public License as published by
15 * the Free Software Foundation; either version 2 of the License, or
16 * (at your option) any later version.
17 *
18 * libtrace is distributed in the hope that it will be useful,
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
21 * GNU General Public License for more details.
22 *
23 * You should have received a copy of the GNU General Public License
24 * along with libtrace; if not, write to the Free Software
25 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
26 *
27 * $Id$
28 *
29 */
30
31#include <stdio.h>
32#include <stdlib.h>
33#include <assert.h>
34#include <string.h>
35#include <sys/time.h>
36#include <time.h>
37
38#include <netinet/in.h>
39#include <netinet/tcp.h>
40#include <netinet/ip.h>
41#include <arpa/inet.h>
42#include <sys/socket.h>
43
44#include <getopt.h>
45
46#include "libtrace.h"
47#include "dagformat.h"
48#include "utils.h"
49#include "getdate.h"
50
51
52struct libtrace_t *trace;
53struct libtrace_filter_t *filter;
54
55#define SCANSIZE 4096
56
57
58static void     parse_cmdline(int argc, char **argv);
59static void     usage();
60
61
62static char     buffer[SCANSIZE];
63static char     *inputuri = 0;
64static char     *outputfilename = 0;
65static char     *starttime = 0;
66static char     *finishtime = 0;
67static char     *filterstring = 0;
68static char     *prog = 0;
69static uint64_t count = 0;
70static time_t   stv = 0;
71static time_t   ftv = 0;
72static FILE     *outfile = 0;
73
74int main(int argc, char *argv[]) {
75
76        int psize = 0;
77        time_t ts = 0;
78        uint64_t number = 0; 
79        struct libtrace_packet_t packet;
80        parse_cmdline(argc,argv);
81
82        // set up times
83        if (starttime) {
84                stv = get_date(starttime,NULL);
85                fprintf(stderr,"Start time: %lu\n",stv);
86        }
87        if (finishtime) {
88                ftv = get_date(finishtime,NULL);
89                fprintf(stderr,"End time: %lu\n",ftv);
90        }
91
92        // setup output files
93        if (outputfilename == 0) {
94                outfile = stdout;
95        } else {
96                if ((outfile = fopen(outputfilename,"ab")) == 0) {
97                        perror("fopen");
98                        exit(0);
99                }
100        }
101       
102        if (inputuri == 0) {
103                usage();
104                exit(0);
105        }
106        // set up input files
107        if ((trace = trace_create(inputuri)) == 0) {
108                exit(0);
109        }
110
111        if (filterstring) {
112                filter = trace_bpf_setfilter(filterstring);
113        }
114
115
116        for (;;) {
117                if ((psize = trace_read_packet(trace, &packet)) == -1) {
118                        // terminate
119                        break;
120                }
121
122       
123                if (filter && !trace_bpf_filter(filter,&packet)) {
124                        continue;
125                }
126               
127                ts = (time_t)trace_get_seconds(&packet); 
128
129                if (count > 0) {
130                        number ++;
131                        fwrite(buffer,psize,1,outfile);
132                        if (number > count)  {
133                                fprintf(stderr,"Maximum number of packets reached\n");
134                                break;
135                        }
136                        // carry on the loop
137                        continue;
138                }
139                if (stv == 0 || ts > stv) {
140                        if (ftv == 0 || ts <= ftv) {
141                                fwrite(buffer,psize,1,outfile);
142                        }
143                }
144                if (ts > ftv && ftv != 0) {
145                        fprintf(stderr,"Packet timestamp (%lu) exceeds maximum time stamp (%lu)\n",ts,ftv);
146                        break;
147                }
148
149        }
150        trace_destroy(trace);
151        return 0;
152}
153
154static void parse_cmdline(int argc, char **argv) {
155        int opt;
156        prog = strdup(argv[0]);
157        while((opt = getopt(argc, argv, "hi:o:s:e:f:c:")) != EOF) {
158                switch(opt) {
159                        case 'h':
160                                usage();
161                                /* never returns */
162                        case 'i':
163                                inputuri = optarg;
164                                break;
165                        case 'o':
166                                outputfilename = optarg;
167                                break;
168                        case 's':
169                                starttime = optarg;
170                                break;
171                        case 'e':
172                                finishtime = optarg;
173                                break;
174                        case 'f':
175                                filterstring = optarg;
176                                break;
177                        case 'c':
178                                if (starttime || finishtime) {
179                                        printf("Can't have start/end time and a packet count, ignoring count\n");
180                                } else {
181                                        count = atoi(optarg);
182                                }
183                                break;
184                        default:
185                                usage();
186                }
187        }
188
189}
190static void usage() {
191        printf("usage: %s [-h] [-i inputuri] [-o outputfilename] [[-s starttime] [-e endtime]]|[-c count] [-f filterstring]\n",prog);
192        printf("\n");
193        printf("-h\t\tshow this usage message.\n");
194        printf("-i file\tinput filename\n");
195        printf("-o file\toutput filename\n");
196        printf("-s start\ttime to start output at\n");
197        printf("-e end\ttime to stop output at\n");
198        printf("-c count\tnumber of packets to output\n");
199        printf("-f filter\tbpf filter to apply\n");
200        printf("\n");
201        printf(" This will read over a DAG trace file <inputfile>, and will output all records between <start> and <finish> times to a new DAG-format file, <outputfile>. The inputfile can be gzip-compressed, however the output wont be.\n If the input or output files are not specified, they will default to stdin and standard out, respectively. If the start and finish times are not specified, they will default to the start of the trace and the end of the trace, respectively.\n");
202        printf(" The start and finish times are in the following format: \"YYYY/MM/DD HH:MM:SS\", and should be given in your local timezome (they are internally converted to UTC)\n");
203        exit(0);
204}
205
Note: See TracBrowser for help on using the repository browser.