source: lib/wandio.c @ c66068d

4.0.1-hotfixescachetimestampsdevelopdpdk-ndagetsilivegetfragoffhelplibtrace4ndag_formatpfringrc-4.0.1rc-4.0.2rc-4.0.3rc-4.0.4ringdecrementfixringperformanceringtimestampfixes
Last change on this file since c66068d was c66068d, checked in by Perry Lorier <perry@…>, 13 years ago

Rewrite the libtrace io subsystem to use the new wandio abstraction layer.

  • Property mode set to 100644
File size: 2.6 KB
Line 
1#include "wandio.h"
2#include "config.h"
3#include <stdlib.h>
4#include <assert.h>
5#include <errno.h>
6
7struct compression_type compression_type[]  = {
8        { "GZ",         WANDIO_COMPRESS_ZLIB,   "gz" },
9        { "BZ2",        WANDIO_COMPRESS_BZ2,    "bz2" },
10        { "NONE",       WANDIO_COMPRESS_NONE,   ""}
11};
12
13#define READ_TRACE 0
14#define WRITE_TRACE 0
15
16io_t *wandio_create(const char *filename)
17{
18        io_t *io = peek_open(stdio_open(filename));
19        char buffer[1024];
20        if (!io)
21                return NULL;
22        wandio_peek(io, buffer, sizeof(buffer));
23#if HAVE_LIBZ
24        /* auto detect gzip compressed data */
25        if (buffer[0] == '\037' && buffer[1] == '\213') { 
26                io = zlib_open(io);
27        }
28        /* auto detect compress(1) compressed data (gzip can read this) */
29        if (buffer[0] == '\037' && buffer[1] == '\235') {
30                io = zlib_open(io);
31        }
32#endif
33#if HAVE_LIBBZ2
34        /* auto detect bzip compressed data */
35        else if (buffer[0] == 'B' && buffer[1] == 'Z' && buffer[2] == 'h') { 
36                io = bz_open(io);
37        }
38#endif
39        return thread_open(io);
40}
41
42off_t wandio_tell(io_t *io)
43{
44        if (!io->source->tell) {
45                errno = -ENOSYS;
46                return -1;
47        }
48        return io->source->tell(io);
49}
50
51off_t wandio_seek(io_t *io, off_t offset, int whence)
52{
53        if (!io->source->seek) {
54                errno = -ENOSYS;
55                return -1;
56        }
57        return io->source->seek(io,offset,whence);
58}
59
60off_t wandio_read(io_t *io, void *buffer, off_t len)
61{ 
62        off_t ret;
63#if READ_TRACE
64        fprintf(stderr,"read(%s): %d bytes\n",io->source->name, (int)len);
65#endif
66        ret=io->source->read(io,buffer,len); 
67        return ret;
68}
69
70off_t wandio_peek(io_t *io, void *buffer, off_t len)
71{
72        off_t ret;
73        assert(io->source->peek); /* If this fails, it means you're calling
74                                   * peek on something that doesn't support
75                                   * peeking.   Push a peek_open() on the io
76                                   * first.
77                                   */
78        ret=io->source->peek(io, buffer, len);
79        return ret;
80}
81
82void wandio_destroy(io_t *io)
83{ io->source->close(io); }
84
85iow_t *wandio_wcreate(const char *filename, int compression_level, int flags)
86{
87        iow_t *iow;
88
89        assert ( compression_level >= 0 && compression_level <= 9 );
90
91        iow=stdio_wopen(filename);
92#if HAVE_LIBZ
93        if (compression_level != 0 && 
94            (flags & WANDIO_COMPRESS_MASK) == WANDIO_COMPRESS_ZLIB) {
95                iow = zlib_wopen(iow,compression_level);
96        }
97#endif
98#if HAVE_LIBBZ2
99        else if (compression_level != 0 && 
100            (flags & WANDIO_COMPRESS_MASK) == WANDIO_COMPRESS_BZ2) {
101                iow = bz_wopen(iow,compression_level);
102        }
103#endif
104        return thread_wopen(iow);
105}
106
107off_t wandio_wwrite(iow_t *iow, const void *buffer, off_t len)
108{
109#if WRITE_TRACE
110        fprintf(stderr,"wwrite(%s): %d bytes\n",iow->source->name, (int)len);
111#endif
112        return iow->source->write(iow,buffer,len);     
113}
114
115void wandio_wdestroy(iow_t *iow)
116{
117        iow->source->close(iow);
118}
119
Note: See TracBrowser for help on using the repository browser.