source: lib/format_erf.c @ b69afb1

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

Removed all rtclient_output stuff, as it will now be left up to the user to write their own rtservers.
As a result, had to include stdio.h in a couple of other files that were previously getting it from rtserver.h.

  • Property mode set to 100644
File size: 20.7 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 "config.h"
32#include "libtrace.h"
33#include "libtrace_int.h"
34#include "format_helper.h"
35#include "parse_cmd.h"
36
37#ifdef HAVE_INTTYPES_H
38#  include <inttypes.h>
39#else
40#  error "Can't find inttypes.h - this needs to be fixed"
41#endif
42
43#ifdef HAVE_STDDEF_H
44#  include <stddef.h>
45#else
46# error "Can't find stddef.h - do you define ptrdiff_t elsewhere?"
47#endif
48#include <sys/types.h>
49#include <sys/socket.h>
50#include <sys/un.h>
51#include <sys/mman.h>
52#include <sys/stat.h>
53#include <unistd.h>
54#include <assert.h>
55#include <errno.h>
56#include <netdb.h>
57#include <fcntl.h>
58#include <getopt.h>
59#include <stdio.h>
60
61/* Catch undefined O_LARGEFILE on *BSD etc */
62#ifndef O_LARGEFILE
63#  define O_LARGEFILE 0
64#endif
65
66static struct libtrace_format_t *erf_ptr = 0;
67static struct libtrace_format_t *rtclient_ptr = 0;
68#if HAVE_DAG
69static struct libtrace_format_t *dag_ptr = 0;
70#endif
71
72#define CONNINFO libtrace->format_data->conn_info
73#define INPUT libtrace->format_data->input
74#define OUTPUT libtrace->format_data->output
75#if HAVE_DAG
76#define DAG libtrace->format_data->dag
77#endif
78#define OPTIONS libtrace->format_data->options
79struct libtrace_format_data_t {
80        union {
81                struct {
82                        char *hostname;
83                        short port;
84                } rt;
85                char *path;             
86        } conn_info;
87       
88        union {
89                int fd;
90#if HAVE_ZLIB
91                gzFile *file;
92#else   
93                FILE *file;
94#endif
95        } input;
96
97#if HAVE_DAG
98        struct {
99                void *buf; 
100                unsigned bottom;
101                unsigned top;
102                unsigned diff;
103                unsigned curr;
104                unsigned offset;
105        } dag;
106#endif
107};
108
109struct libtrace_format_data_out_t {
110        union {
111                struct {
112                        char *hostname;
113                        short port;
114                } rt;
115                char *path;
116        } conn_info;
117
118        union {
119                struct {
120                        int level;
121                } erf;
122               
123        } options;
124       
125        union {
126                int fd;
127                struct rtserver_t * rtserver;
128#if HAVE_ZLIB
129                gzFile *file;
130#else
131                FILE *file;
132#endif
133        } output;
134};
135
136#ifdef HAVE_DAG
137static int dag_init_input(struct libtrace_t *libtrace) {
138        struct stat buf;
139        libtrace->format_data = (struct libtrace_format_data_t *)
140                malloc(sizeof(struct libtrace_format_data_t));
141
142        CONNINFO.path = libtrace->uridata;
143        if (stat(CONNINFO.path,&buf) == -1) {
144                perror("stat");
145                return 0;
146        } 
147        if (S_ISCHR(buf.st_mode)) {
148                // DEVICE
149                libtrace->sourcetype = DEVICE;
150                if((INPUT.fd = dag_open(CONNINFO.path)) < 0) {
151                        fprintf(stderr,"Cannot open DAG %s: %m\n", 
152                                        CONNINFO.path,errno);
153                        exit(0);
154                }
155                if((DAG.buf = (void *)dag_mmap(INPUT.fd)) == MAP_FAILED) {
156                        fprintf(stderr,"Cannot mmap DAG %s: %m\n", 
157                                        CONNINFO.path,errno);
158                        exit(0);
159                }
160                if(dag_start(INPUT.fd) < 0) {
161                        fprintf(stderr,"Cannot start DAG %s: %m\n", 
162                                        CONNINFO.path,errno);
163                        exit(0);
164                }
165        } else {
166                fprintf(stderr,"%s isn't a valid char device, exiting\n",
167                                CONNINFO.path);
168                return 0;
169        }
170        return 1;
171}
172#endif
173
174static int erf_init_input(struct libtrace_t *libtrace) {
175        struct stat buf;
176        struct hostent *he;
177        struct sockaddr_in remote;
178        struct sockaddr_un unix_sock;
179        libtrace->format_data = (struct libtrace_format_data_t *)
180                malloc(sizeof(struct libtrace_format_data_t));
181
182        CONNINFO.path = libtrace->uridata;
183        if (!strncmp(CONNINFO.path,"-",1)) {
184                // STDIN
185                libtrace->sourcetype = STDIN;
186#if HAVE_ZLIB
187                INPUT.file = gzdopen(STDIN, "r");
188#else   
189                INPUT.file = stdin;
190#endif
191
192        } else {
193                if (stat(CONNINFO.path,&buf) == -1 ) {
194                        perror("stat");
195                        return 0;
196                }
197                if (S_ISSOCK(buf.st_mode)) {
198                        libtrace->sourcetype = SOCKET;
199                        if ((INPUT.fd = socket(
200                                        AF_UNIX, SOCK_STREAM, 0)) == -1) {
201                                perror("socket");
202                                return 0;
203                        }
204                        unix_sock.sun_family = AF_UNIX;
205                        bzero(unix_sock.sun_path,108);
206                        snprintf(unix_sock.sun_path,
207                                        108,"%s"
208                                        ,CONNINFO.path);
209
210                        if (connect(INPUT.fd, 
211                                        (struct sockaddr *)&unix_sock,
212                                        sizeof(struct sockaddr)) == -1) {
213                                perror("connect (unix)");
214                                return 0;
215                        }
216                } else { 
217                        libtrace->sourcetype = TRACE;
218#if HAVE_ZLIB
219                        // using gzdopen means we can set O_LARGEFILE
220                        // ourselves. However, this way is messy and
221                        // we lose any error checking on "open"
222                        INPUT.file = 
223                                gzdopen(open(
224                                        CONNINFO.path,
225                                        O_LARGEFILE), "r");
226#else
227                        INPUT.file = 
228                                fdopen(open(
229                                        CONNINFO.path,
230                                        O_LARGEFILE), "r");
231#endif
232
233                }
234        }
235        return 1;
236}
237
238static int rtclient_init_input(struct libtrace_t *libtrace) {
239        char *scan;
240        char *uridata = libtrace->uridata;
241        struct hostent *he;
242        struct sockaddr_in remote;
243        libtrace->format_data = (struct libtrace_format_data_t *)
244                malloc(sizeof(struct libtrace_format_data_t));
245
246        libtrace->sourcetype = RT;
247
248        if (strlen(uridata) == 0) {
249                CONNINFO.rt.hostname = 
250                        strdup("localhost");
251                CONNINFO.rt.port = 
252                        COLLECTOR_PORT;
253        } else {
254                if ((scan = strchr(uridata,':')) == NULL) {
255                        CONNINFO.rt.hostname = 
256                                strdup(uridata);
257                        CONNINFO.rt.port =
258                                COLLECTOR_PORT;
259                } else {
260                        CONNINFO.rt.hostname = 
261                                (char *)strndup(uridata,
262                                                (scan - uridata));
263                        CONNINFO.rt.port = 
264                                atoi(++scan);
265                }
266        }
267       
268        if ((he=gethostbyname(CONNINFO.rt.hostname)) == NULL) { 
269                perror("gethostbyname");
270                return 0;
271        } 
272        if ((INPUT.fd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
273                perror("socket");
274                return 0;
275        }
276
277        remote.sin_family = AF_INET;   
278        remote.sin_port = htons(CONNINFO.rt.port);
279        remote.sin_addr = *((struct in_addr *)he->h_addr);
280        bzero(&(remote.sin_zero), 8);
281
282        if (connect(INPUT.fd, (struct sockaddr *)&remote,
283                                sizeof(struct sockaddr)) == -1) {
284                perror("connect (inet)");
285                return 0;
286        }
287        return 1;
288}
289
290static int erf_init_output(struct libtrace_out_t *libtrace) {
291        char *filemode = 0;
292        libtrace->format_data = (struct libtrace_format_data_out_t *)
293                calloc(1,sizeof(struct libtrace_format_data_out_t));
294
295        OPTIONS.erf.level = 0;
296        asprintf(&filemode,"wb%d",OPTIONS.erf.level);
297
298        if (!strncmp(libtrace->uridata,"-",1)) {
299                // STDOUT
300#if HAVE_ZLIB
301                OUTPUT.file = gzdopen(dup(1), filemode);
302#else
303                OUTPUT.file = stdout;
304#endif
305        }
306        else {
307                // TRACE
308#if HAVE_ZLIB
309                // using gzdopen means we can set O_LARGEFILE
310                // ourselves. However, this way is messy and
311                // we lose any error checking on "open"
312                OUTPUT.file =  gzdopen(open(
313                                libtrace->uridata,
314                                O_CREAT | O_LARGEFILE | O_WRONLY, 
315                                S_IRUSR | S_IWUSR), filemode);
316#else
317                OUTPUT.file =  fdopen(open(
318                                libtrace->uridata,
319                                O_CREAT | O_LARGEFILE | O_WRONLY, 
320                                S_IRUSR | S_IWUSR), "w");
321#endif
322        }
323       
324        return 1;
325}
326
327static int erf_config_output(struct libtrace_out_t *libtrace, int argc, char *argv[]) {
328#if HAVE_ZLIB
329        int opt;
330        int level = OPTIONS.erf.level;
331        optind = 1;
332
333        while ((opt = getopt(argc, argv, "z:")) != EOF) {
334                switch (opt) {
335                        case 'z':
336                                level = atoi(optarg);
337                                break;
338                        default:
339                                printf("Bad argument to erf: %s\n", opt);
340                                // maybe spit out some help here
341                                return -1;
342                }
343        }
344        if (level != OPTIONS.erf.level) {
345                if (level > 9 || level < 0) {
346                        // retarded level choice
347                        printf("Compression level must be between 0 and 9 inclusive - you selected %i \n", level);
348                       
349                } else {
350                        OPTIONS.erf.level = level;
351                        return gzsetparams(OUTPUT.file, level, Z_DEFAULT_STRATEGY);
352                }
353        }
354#endif
355        return 0;
356
357}
358
359
360#ifdef HAVE_DAG
361static int dag_fin_input(struct libtrace_t *libtrace) {
362        dag_stop(INPUT.fd);
363}
364#endif
365
366static int erf_fin_input(struct libtrace_t *libtrace) {
367#if HAVE_ZLIB
368        gzclose(INPUT.file);
369#else   
370        fclose(INPUT.file);     
371#endif
372}
373
374static int rtclient_fin_input(struct libtrace_t *libtrace) {
375        close(INPUT.fd);
376}
377
378static int erf_fin_output(struct libtrace_out_t *libtrace) {
379#if HAVE_ZLIB
380        gzclose(OUTPUT.file);
381#else
382        fclose(OUTPUT.file);
383#endif
384}
385 
386
387
388#if HAVE_DAG
389static int dag_read(struct libtrace_t *libtrace, void *buffer, size_t len) {
390        int numbytes;
391        static short lctr = 0;
392        struct dag_record_t *erfptr = 0;
393        int rlen;
394
395        if (buffer == 0)
396                buffer = malloc(len);
397       
398        DAG.bottom = DAG.top;
399        DAG.top = dag_offset(
400                        INPUT.fd,
401                        &(DAG.bottom),
402                        0);
403        DAG.diff = DAG.top -
404                DAG.bottom;
405
406        numbytes=DAG.diff;
407        DAG.offset = 0;
408        return numbytes;
409}
410#endif
411
412#if HAVE_DAG
413static int dag_read_packet(struct libtrace_t *libtrace, struct libtrace_packet_t *packet) {
414        int numbytes;
415        int size;
416        char buf[RP_BUFSIZE];
417        dag_record_t *erfptr;
418        void *buffer = packet->buffer;
419        void *buffer2 = buffer;
420        int rlen;
421       
422        if (DAG.diff == 0) {
423                if ((numbytes = dag_read(libtrace,buf,RP_BUFSIZE)) <= 0) 
424                        return numbytes;
425        }
426
427        //DAG always gives us whole packets
428        erfptr = (dag_record_t *) ((void *)DAG.buf + 
429                        (DAG.bottom + DAG.offset));
430        size = ntohs(erfptr->rlen);
431
432        if ( size  > LIBTRACE_PACKET_BUFSIZE) {
433                printf("%d\n",size);
434                assert( size < LIBTRACE_PACKET_BUFSIZE);
435        }
436
437        // have to copy it out of the memory hole at this stage:
438        memcpy(packet->buffer, erfptr, size);
439       
440        packet->status = 0;
441        packet->size = size;
442        DAG.offset += size;
443        DAG.diff -= size;
444
445        assert(DAG.diff >= 0);
446
447        return (size);
448}
449#endif
450
451static int erf_read_packet(struct libtrace_t *libtrace, struct libtrace_packet_t *packet) {
452        int numbytes;
453        int size;
454        char buf[RP_BUFSIZE];
455        dag_record_t *erfptr;
456        void *buffer = packet->buffer;
457        void *buffer2 = buffer;
458        int rlen;
459#if HAVE_ZLIB
460        if ((numbytes=gzread(INPUT.file,
461                                        buffer,
462                                        dag_record_size)) == -1) {
463                perror("gzread");
464                return -1;
465        }
466#else
467        if ((numbytes = read(INPUT.file, buffer, dag_record_size)) == -1) {
468                perror("read");
469                return -1;
470        }
471#endif
472        if (numbytes == 0) {
473                return 0;
474        }
475        rlen = ntohs(((dag_record_t *)buffer)->rlen);
476        size = rlen - dag_record_size;
477        assert(size < LIBTRACE_PACKET_BUFSIZE);
478        buffer2 = buffer + dag_record_size;
479       
480        // read in the rest of the packet
481        if ((numbytes=gzread(INPUT.file,
482                                        buffer2,
483                                        size)) == -1) {
484                perror("gzread");
485                return -1;
486        }
487        packet->status = 0;
488        packet->size = rlen;
489        return rlen;
490}
491
492static int rtclient_read(struct libtrace_t *libtrace, void *buffer, size_t len) {
493        int numbytes;
494        static short lctr = 0;
495        struct dag_record_t *erfptr = 0;
496        int rlen;
497
498        if (buffer == 0)
499                buffer = malloc(len);
500        while(1) {
501#ifndef MSG_NOSIGNAL
502#  define MSG_NOSIGNAL 0
503#endif
504                if ((numbytes = recv(INPUT.fd,
505                                                buffer,
506                                                len,
507                                                MSG_NOSIGNAL)) == -1) {
508                        if (errno == EINTR) {
509                                //ignore EINTR in case
510                                // a caller is using signals
511                                continue;
512                        }
513                        perror("recv");
514                        return -1;
515                }
516                break;
517
518        }
519        return numbytes;
520}
521
522static int rtclient_read_packet(struct libtrace_t *libtrace, struct libtrace_packet_t *packet) {
523        int numbytes = 0;
524        int size = 0;
525        char buf[RP_BUFSIZE];
526        dag_record_t *erfptr = 0;
527        int read_required = 0;
528       
529        void *buffer = 0;
530
531        packet->trace = libtrace;
532        buffer = packet->buffer;
533
534        do {
535                if (tracefifo_out_available(libtrace->fifo) == 0 || read_required) {
536                        if ((numbytes = rtclient_read(
537                                        libtrace,buf,RP_BUFSIZE))<=0) {
538                                return numbytes;
539                        }
540                        tracefifo_write(libtrace->fifo,buf,numbytes);
541                        read_required = 0;
542                }
543                // Read status byte
544                if (tracefifo_out_read(libtrace->fifo,
545                                &packet->status, sizeof(int)) == 0) {
546                        read_required = 1;
547                        continue;
548                }
549                tracefifo_out_update(libtrace->fifo,sizeof(int));
550
551                // read in the ERF header
552                if ((numbytes = tracefifo_out_read(libtrace->fifo, buffer,
553                                                sizeof(dag_record_t))) == 0) {
554                        tracefifo_out_reset(libtrace->fifo);
555                        read_required = 1;
556                        continue;
557                }
558                size = ntohs(((dag_record_t *)buffer)->rlen);
559               
560                // read in the full packet
561                if ((numbytes = tracefifo_out_read(libtrace->fifo, 
562                                                buffer, size)) == 0) {
563                        tracefifo_out_reset(libtrace->fifo);
564                        read_required = 1;
565                        continue;
566                }
567
568                // got in our whole packet, so...
569                tracefifo_out_update(libtrace->fifo,size);
570
571                tracefifo_ack_update(libtrace->fifo,size + sizeof(int));
572
573                packet->size = numbytes;
574                return numbytes;
575        } while(1);
576}
577
578static int erf_dump_packet(struct libtrace_out_t *libtrace, dag_record_t *erfptr, void *buffer, size_t size) {
579        int numbytes = 0;
580#if HAVE_ZLIB
581        if ((numbytes = gzwrite(OUTPUT.file, erfptr, dag_record_size + 2)) == 0) {
582                perror("gzwrite");
583                return -1;
584        }
585        if ((numbytes = gzwrite(OUTPUT.file, buffer, size)) == 0) {
586                perror("gzwrite");
587                return -1;
588        }
589#else
590        if ((numbytes = write(OUTPUT.file, erfptr, dag_record_size + 2)) == 0) {
591                perror("write");
592                return -1;
593        }
594        if ((numbytes = write(OUTPUT.file, buffer, size)) == 0) {
595                perror("write");
596                return -1;
597        }
598#endif
599        return numbytes + sizeof(dag_record_t);
600
601}
602               
603static int erf_write_packet(struct libtrace_out_t *libtrace, struct libtrace_packet_t *packet) {
604        int numbytes = 0;
605        dag_record_t erfhdr;
606        void *payload = (void *)trace_get_link(packet);
607
608        if (packet->trace->format == erf_ptr || 
609#if HAVE_DAG
610                        packet->trace->format == dag_ptr ||
611#endif
612                        packet->trace->format == rtclient_ptr ) {
613                numbytes = erf_dump_packet(libtrace,
614                                (dag_record_t *)packet->buffer,
615                                payload,
616                                packet->size - 
617                                        (dag_record_size + 2)); 
618        } else {
619                // convert format - build up a new erf header
620                // Timestamp
621                erfhdr.ts = trace_get_erf_timestamp(packet);
622                // Link type
623                switch(trace_get_link_type(packet)) {
624                case TRACE_TYPE_ETH:
625                        erfhdr.type=TYPE_ETH; break;
626                case TRACE_TYPE_ATM:
627                        erfhdr.type=TYPE_ATM; break;
628                default:
629                        erfhdr.type=0; 
630                }
631                // Flags. Can't do this
632                memset(&erfhdr.flags,1,1);
633                // Packet length
634                erfhdr.rlen = trace_get_capture_length(packet);
635                // loss counter. Can't do this
636                erfhdr.lctr = 0;
637                // Wire length
638                erfhdr.wlen = trace_get_wire_length(packet);
639               
640                // Write it out
641                numbytes = erf_dump_packet(libtrace,
642                                &erfhdr,
643                                payload,
644                                erfhdr.rlen);
645        }
646        return numbytes;
647}
648
649
650static void *erf_get_link(const struct libtrace_packet_t *packet) {
651        const void *ethptr = 0;
652        dag_record_t *erfptr = 0;
653        erfptr = (dag_record_t *)packet->buffer;
654       
655        if (erfptr->flags.rxerror == 1) {
656                return NULL;
657        }
658        ethptr = ((uint8_t *)packet->buffer +
659                        dag_record_size + 2);
660        return (void *)ethptr;
661}
662
663static libtrace_linktype_t erf_get_link_type(const struct libtrace_packet_t *packet) {
664        dag_record_t *erfptr = 0;
665        erfptr = (dag_record_t *)packet->buffer;
666        switch (erfptr->type) {
667                case TYPE_ETH: return TRACE_TYPE_ETH;
668                case TYPE_ATM: return TRACE_TYPE_ATM;
669                default: assert(0);
670        }
671        return erfptr->type;
672}
673
674static int8_t erf_get_direction(const struct libtrace_packet_t *packet) {
675        dag_record_t *erfptr = 0;
676        erfptr = (dag_record_t *)packet->buffer;
677        return erfptr->flags.iface;
678}
679
680static int8_t erf_set_direction(const struct libtrace_packet_t *packet, int8_t direction) {
681        dag_record_t *erfptr = 0;
682        erfptr = (dag_record_t *)packet->buffer;
683        erfptr->flags.iface = direction;
684        return erfptr->flags.iface;
685}
686
687static uint64_t erf_get_erf_timestamp(const struct libtrace_packet_t *packet) {
688        dag_record_t *erfptr = 0;
689        erfptr = (dag_record_t *)packet->buffer;
690        return erfptr->ts;
691}
692
693static int erf_get_capture_length(const struct libtrace_packet_t *packet) {
694        dag_record_t *erfptr = 0;
695        erfptr = (dag_record_t *)packet->buffer;
696        return ntohs(erfptr->rlen);
697}
698
699static int erf_get_wire_length(const struct libtrace_packet_t *packet) {
700        dag_record_t *erfptr = 0;
701        erfptr = (dag_record_t *)packet->buffer;
702        return ntohs(erfptr->wlen);
703}
704
705static size_t erf_set_capture_length(struct libtrace_packet_t *packet, size_t size) {
706        dag_record_t *erfptr = 0;
707        assert(packet);
708        if(size > packet->size) {
709                // can't make a packet larger
710                return packet->size;
711        }
712        erfptr = (dag_record_t *)packet->buffer;
713        erfptr->rlen = ntohs(size + sizeof(dag_record_t));
714        packet->size = size + sizeof(dag_record_t);
715        return packet->size;
716}
717
718static int rtclient_get_fd(struct libtrace_packet_t *packet) {
719        return packet->trace->format_data->input.fd;
720}
721
722static int erf_get_fd(struct libtrace_packet_t *packet) {
723        return packet->trace->format_data->input.fd;
724}
725
726#if HAVE_DAG
727static void dag_help() {
728        printf("dag format module: $Revision$\n");
729        printf("Supported input URIs:\n");
730        printf("\tdag:/dev/dagn\n");
731        printf("\n");
732        printf("\te.g.: dag:/dev/dag0\n");
733        printf("\n");
734        printf("Supported output URIs:\n");
735        printf("\tnone\n");
736        printf("\n");
737}
738#endif
739
740
741static void erf_help() {
742        printf("erf format module: $Revision$\n");
743        printf("Supported input URIs:\n");
744        printf("\terf:/path/to/file\t(uncompressed)\n");
745        printf("\terf:/path/to/file.gz\t(gzip-compressed)\n");
746        printf("\terf:-\t(stdin, either compressed or not)\n");
747        printf("\terf:/path/to/socket\n");
748        printf("\n");
749        printf("\te.g.: erf:/tmp/trace\n");
750        printf("\n");
751        printf("Supported output URIs:\n");
752        printf("\terf:path/to/file\t(uncompressed)\n");
753        printf("\terf:/path/to/file.gz\t(gzip-compressed)\n");
754        printf("\terf:-\t(stdout, either compressed or not)\n");
755        printf("\n");
756        printf("\te.g.: erf:/tmp/trace\n");
757        printf("\n");
758        printf("Supported output options:\n");
759        printf("\t-z\tSpecify the gzip compression, ranging from 0 (uncompressed) to 9 - defaults to 1\n");
760        printf("\n");
761
762       
763}
764
765static void rtclient_help() {
766        printf("rtclient format module\n");
767        printf("Supported input URIs:\n");
768        printf("\trtclient:hostname:port\n");
769        printf("\trtclient:hostname (connects on default port)\n");
770        printf("\n");
771        printf("\te.g.: rtclient:localhost\n");
772        printf("\te.g.: rtclient:localhost:32500\n");
773        printf("\n");
774        printf("Supported output URIs:\n");
775        printf("\trtclient: \t(will output on default port on all available IP addresses) \n");
776        printf("\trtclient:hostname:port\n");
777        printf("\trtclient:port\n");
778        printf("\n");
779        printf("\te.g.: rtclient:32500\n");
780        printf("\te.g.: rtclient:\n");
781        printf("\n");
782
783}
784
785       
786static struct libtrace_format_t erf = {
787        "erf",
788        "$Id$",
789        "erf",
790        erf_init_input,                 /* init_input */       
791        erf_init_output,                /* init_output */
792        erf_config_output,              /* config_output */
793        erf_fin_input,                  /* fin_input */
794        erf_fin_output,                 /* fin_output */
795        erf_read_packet,                /* read_packet */
796        erf_write_packet,               /* write_packet */
797        erf_get_link,                   /* get_link */
798        erf_get_link_type,              /* get_link_type */
799        erf_get_direction,              /* get_direction */
800        erf_set_direction,              /* set_direction */
801        erf_get_erf_timestamp,          /* get_erf_timestamp */
802        NULL,                           /* get_timeval */
803        NULL,                           /* get_seconds */
804        erf_get_capture_length,         /* get_capture_length */
805        erf_get_wire_length,            /* get_wire_length */
806        erf_set_capture_length,         /* set_capture_length */
807        erf_get_fd,                     /* get_fd */
808        trace_event_trace,              /* trace_event */
809        erf_help                        /* help */
810};
811
812#ifdef HAVE_DAG
813static struct libtrace_format_t dag = {
814        "dag",
815        "$Id$",
816        "erf",
817        dag_init_input,                 /* init_input */       
818        NULL,                           /* init_output */
819        NULL,                           /* config_output */
820        dag_fin_input,                  /* fin_input */
821        NULL,                           /* fin_output */
822        dag_read_packet,                /* read_packet */
823        NULL,                           /* write_packet */
824        erf_get_link,                   /* get_link */
825        erf_get_link_type,              /* get_link_type */
826        erf_get_direction,              /* get_direction */
827        erf_set_direction,              /* set_direction */
828        erf_get_erf_timestamp,          /* get_erf_timestamp */
829        NULL,                           /* get_timeval */
830        NULL,                           /* get_seconds */
831        erf_get_capture_length,         /* get_capture_length */
832        erf_get_wire_length,            /* get_wire_length */
833        erf_set_capture_length,         /* set_capture_length */
834        NULL,                           /* get_fd */
835        trace_event_trace,              /* trace_event */
836        dag_help                        /* help */
837};
838#endif
839
840static struct libtrace_format_t rtclient = {
841        "rtclient",
842        "$Id$",
843        "erf",
844        rtclient_init_input,            /* init_input */       
845        NULL,                           /* init_output */
846        NULL,                           /* config_output */
847        rtclient_fin_input,             /* fin_input */
848        NULL,                           /* fin_output */
849        rtclient_read_packet,           /* read_packet */
850        NULL,                           /* write_packet */
851        erf_get_link,                   /* get_link */
852        erf_get_link_type,              /* get_link_type */
853        erf_get_direction,              /* get_direction */
854        erf_set_direction,              /* set_direction */
855        erf_get_erf_timestamp,          /* get_erf_timestamp */
856        NULL,                           /* get_timeval */
857        NULL,                           /* get_seconds */
858        erf_get_capture_length,         /* get_capture_length */
859        erf_get_wire_length,            /* get_wire_length */
860        erf_set_capture_length,         /* set_capture_length */
861        rtclient_get_fd,                /* get_fd */
862        trace_event_device,             /* trace_event */
863        rtclient_help                   /* help */
864};
865
866void __attribute__((constructor)) erf_constructor() {
867        erf_ptr = &erf;
868        register_format(erf_ptr);
869#ifdef HAVE_DAG
870        dag_ptr = &dag;
871        register_format(dag_ptr);
872#endif
873        rtclient_ptr = &rtclient;
874        register_format(rtclient_ptr);
875}
Note: See TracBrowser for help on using the repository browser.