source: lib/libtraceio-zlib.c @ a81d2fc

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

Fixed bug where 0 byte sized io_writes would cause the newly-created traces to contain crc-errors.

  • Property mode set to 100644
File size: 1.7 KB
RevLine 
[edb18ce]1#include "libtraceio.h"
2#include <zlib.h>
3#include <stdlib.h>
[222d8f5]4#include <errno.h>
[edb18ce]5
6struct libtrace_io_t {
[85a79b0]7        gzFile file;
[edb18ce]8};
9
10ssize_t libtrace_io_read(libtrace_io_t *io, void *buf, size_t len)
11{
[4bd8a5b]12        int err=gzread(io->file,buf,(unsigned) len);
[222d8f5]13        int err2=errno;
14        if (err>=0) {
[46dd1e3]15                /* successfully read <x> bytes */
[eecda9f]16                return (ssize_t)err;
[222d8f5]17        }
18        switch(err) {
19                case Z_STREAM_END:
20                        return 0;
21                case Z_ERRNO:
22                        if (err2==0)
23                                return 0; /* EOF */
24                        return -1;
[46dd1e3]25                case Z_MEM_ERROR:
26                        errno=ENOMEM;
27                        return -1;
[222d8f5]28                default:
29                      /* Some decompression error or something */
30                      errno=EINVAL;
31                      return -1;
32        }
[edb18ce]33}
34
35libtrace_io_t *libtrace_io_fdopen(int fd, const char *mode)
36{
[85a79b0]37        libtrace_io_t *io = (libtrace_io_t*)malloc(sizeof(libtrace_io_t));
[eecda9f]38        if (io == NULL)
39                return NULL;
[edb18ce]40        io->file = gzdopen(fd,mode);
[ec1e19c]41        if (!io->file) {
42                free(io);
43                return NULL;
44        }
[edb18ce]45        return io;
46}
47
48libtrace_io_t *libtrace_io_open(const char *path, const char *mode)
49{
[85a79b0]50        libtrace_io_t *io = (libtrace_io_t*)malloc(sizeof(libtrace_io_t));
[eecda9f]51        if (io == NULL)
52                return NULL;
[edb18ce]53        io->file = gzopen(path,mode);
54        return io;
55}
56
57/* Technically close returns -1 on failure, but if the close fails, really
58 * what are you going to do about it?
59 */
60void libtrace_io_close(libtrace_io_t *io)
61{
[eecda9f]62        (void)gzclose(io->file);
[edb18ce]63        io->file=NULL;
64        free(io);
65}
66
67ssize_t libtrace_io_write(libtrace_io_t *io, const void *buf, size_t len)
68{
[509bca2]69        /* gzip doesn't like writing 0 bytes - tends to break the
70         * crc calculations */
71        if (len == 0)
72                return 0;
[4bd8a5b]73        return (ssize_t)gzwrite(io->file,buf,(unsigned)len);
[edb18ce]74}
75
76off_t libtrace_io_seek(libtrace_io_t *io, off_t offset, int whence)
77{
78        return gzseek(io->file,offset,whence);
79}
80
81ssize_t libtrace_io_tell(libtrace_io_t *io)
82{
[eecda9f]83        return (ssize_t)gztell(io->file);
[edb18ce]84}
Note: See TracBrowser for help on using the repository browser.