source: examples/erfsplit/erfsplit.c @ 5dfa670

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

fixed bug where it was using old empty buffer, instead of the actual buffer with a packet in it

  • Property mode set to 100644
File size: 6.2 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 <string.h>
34#include <assert.h>
35#include <string.h>
36#include <sys/time.h>
37#include <time.h>
38
39#include <netinet/in.h>
40#include <netinet/tcp.h>
41#include <netinet/ip.h>
42#include <arpa/inet.h>
43#include <sys/socket.h>
44
45#include <getopt.h>
46
47#include "libtrace.h"
48#include "dagformat.h"
49#include "utils.h"
50#include "getdate.h"
51
52
53struct libtrace_t *trace;
54struct libtrace_filter_t *filter;
55
56#define SCANSIZE 4096
57
58
59static void     parse_cmdline(int argc, char **argv);
60static void     usage();
61
62
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,"wb")) == 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                fprintf(stderr,"trace_create(%s) failed. Bad/nonexistant URI?\n",inputuri);
109                exit(0);
110        }
111
112        if (filterstring) {
113                filter = trace_bpf_setfilter(filterstring);
114        }
115
116
117        for (;;) {
118                if ((psize = trace_read_packet(trace, &packet)) == -1) {
119                        // terminate
120                        break;
121                }
122
123       
124                if (filter && !trace_bpf_filter(filter,&packet)) {
125                        continue;
126                }
127               
128                ts = (time_t)trace_get_seconds(&packet); 
129
130                if (count > 0) {
131                        number ++;
132                        fwrite(packet.buffer,psize,1,outfile);
133                        if (number > count)  {
134                                fprintf(stderr,"Maximum number of packets reached\n");
135                                break;
136                        }
137                        // carry on the loop
138                        continue;
139                }
140                if (stv == 0 || ts > stv) {
141                        if (ftv == 0 || ts <= ftv) {
142                                fwrite(packet.buffer,psize,1,outfile);
143                        }
144                }
145                if (ts > ftv && ftv != 0) {
146                        fprintf(stderr,"Packet timestamp (%lu) exceeds maximum time stamp (%lu)\n",ts,ftv);
147                        break;
148                }
149
150        }
151        trace_destroy(trace);
152        fclose(outfile);
153        return 0;
154}
155
156static void parse_cmdline(int argc, char **argv) {
157        int opt;
158        prog = strdup(argv[0]);
159        while((opt = getopt(argc, argv, "hi:o:s:e:f:c:")) != EOF) {
160                switch(opt) {
161                        case 'h':
162                                usage();
163                                /* never returns */
164                        case 'i':
165                                inputuri = optarg;
166                                break;
167                        case 'o':
168                                outputfilename = optarg;
169                                break;
170                        case 's':
171                                starttime = optarg;
172                                break;
173                        case 'e':
174                                finishtime = optarg;
175                                break;
176                        case 'f':
177                                filterstring = optarg;
178                                break;
179                        case 'c':
180                                if (starttime || finishtime) {
181                                        printf("Can't have start/end time and a packet count, ignoring count\n");
182                                } else {
183                                        count = atoi(optarg);
184                                }
185                                break;
186                        default:
187                                usage();
188                }
189        }
190
191}
192static void usage() {
193        printf("usage: %s [-h] [-i inputuri] [-o outputfilename] [[-s starttime] [-e endtime]]|[-c count] [-f filterstring]\n",prog);
194        printf("\n");
195        printf("-h\t\tshow this usage message.\n");
196        printf("-i file\tinput filename\n");
197        printf("-o file\toutput filename\n");
198        printf("-s start\ttime to start output at\n");
199        printf("-e end\ttime to stop output at\n");
200        printf("-c count\tnumber of packets to output\n");
201        printf("-f filter\tbpf filter to apply\n");
202        printf("\n");
203        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");
204        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");
205        exit(0);
206}
207
Note: See TracBrowser for help on using the repository browser.