source: examples/erfsplit/erfsplit.c @ 4e92740

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

poink

  • Property mode set to 100644
File size: 6.3 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     buffer[SCANSIZE];
64static char     *inputuri = 0;
65static char     *outputfilename = 0;
66static char     *starttime = 0;
67static char     *finishtime = 0;
68static char     *filterstring = 0;
69static char     *prog = 0;
70static uint64_t count = 0;
71static time_t   stv = 0;
72static time_t   ftv = 0;
73static FILE     *outfile = 0;
74
75int main(int argc, char *argv[]) {
76
77        int psize = 0;
78        time_t ts = 0;
79        uint64_t number = 0; 
80        struct libtrace_packet_t packet;
81        parse_cmdline(argc,argv);
82
83        // set up times
84        if (starttime) {
85                stv = get_date(starttime,NULL);
86                fprintf(stderr,"Start time: %lu\n",stv);
87        }
88        if (finishtime) {
89                ftv = get_date(finishtime,NULL);
90                fprintf(stderr,"End time: %lu\n",ftv);
91        }
92
93        // setup output files
94        if (outputfilename == 0) {
95                outfile = stdout;
96        } else {
97                if ((outfile = fopen(outputfilename,"wb")) == 0) {
98                        perror("fopen");
99                        exit(0);
100                }
101        }
102       
103        if (inputuri == 0) {
104                usage();
105                exit(0);
106        }
107        // set up input files
108        if ((trace = trace_create(inputuri)) == 0) {
109                printf("trace_create(%s) failed. Bad/nonexistant URI?\n",inputuri);
110                exit(0);
111        }
112
113        if (filterstring) {
114                filter = trace_bpf_setfilter(filterstring);
115        }
116
117
118        for (;;) {
119                if ((psize = trace_read_packet(trace, &packet)) == -1) {
120                        // terminate
121                        break;
122                }
123
124       
125                if (filter && !trace_bpf_filter(filter,&packet)) {
126                        continue;
127                }
128               
129                ts = (time_t)trace_get_seconds(&packet); 
130
131                if (count > 0) {
132                        number ++;
133                        fwrite(packet.buffer,psize,1,outfile);
134                        if (number > count)  {
135                                fprintf(stderr,"Maximum number of packets reached\n");
136                                break;
137                        }
138                        // carry on the loop
139                        continue;
140                }
141                if (stv == 0 || ts > stv) {
142                        if (ftv == 0 || ts <= ftv) {
143                                fwrite(buffer,psize,1,outfile);
144                        }
145                }
146                if (ts > ftv && ftv != 0) {
147                        fprintf(stderr,"Packet timestamp (%lu) exceeds maximum time stamp (%lu)\n",ts,ftv);
148                        break;
149                }
150
151        }
152        trace_destroy(trace);
153        fclose(outfile);
154        return 0;
155}
156
157static void parse_cmdline(int argc, char **argv) {
158        int opt;
159        prog = strdup(argv[0]);
160        while((opt = getopt(argc, argv, "hi:o:s:e:f:c:")) != EOF) {
161                switch(opt) {
162                        case 'h':
163                                usage();
164                                /* never returns */
165                        case 'i':
166                                inputuri = optarg;
167                                break;
168                        case 'o':
169                                outputfilename = optarg;
170                                break;
171                        case 's':
172                                starttime = optarg;
173                                break;
174                        case 'e':
175                                finishtime = optarg;
176                                break;
177                        case 'f':
178                                filterstring = optarg;
179                                break;
180                        case 'c':
181                                if (starttime || finishtime) {
182                                        printf("Can't have start/end time and a packet count, ignoring count\n");
183                                } else {
184                                        count = atoi(optarg);
185                                }
186                                break;
187                        default:
188                                usage();
189                }
190        }
191
192}
193static void usage() {
194        printf("usage: %s [-h] [-i inputuri] [-o outputfilename] [[-s starttime] [-e endtime]]|[-c count] [-f filterstring]\n",prog);
195        printf("\n");
196        printf("-h\t\tshow this usage message.\n");
197        printf("-i file\tinput filename\n");
198        printf("-o file\toutput filename\n");
199        printf("-s start\ttime to start output at\n");
200        printf("-e end\ttime to stop output at\n");
201        printf("-c count\tnumber of packets to output\n");
202        printf("-f filter\tbpf filter to apply\n");
203        printf("\n");
204        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");
205        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");
206        exit(0);
207}
208
Note: See TracBrowser for help on using the repository browser.