#include <sys/types.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
#include "compress.h"
typedef struct {
off_t total_in;
off_t total_out;
int fd;
int gotmagic;
char mode;
} null_stream;
char null_magic[2];
void *
null_ropen(int fd, char *name, int gotmagic)
{
null_stream *s;
if (fd < 0)
return NULL;
if ((s = calloc(1, sizeof(null_stream))) == NULL)
return NULL;
s->fd = fd;
s->gotmagic = gotmagic;
s->total_in = s->total_out = 0;
s->mode = 'r';
return s;
}
void *
null_wopen(int fd, char *name, int bits, u_int32_t mtime)
{
null_stream *s;
if (fd < 0)
return NULL;
if ((s = calloc(1, sizeof(null_stream))) == NULL)
return NULL;
s->fd = fd;
s->gotmagic = 0;
s->total_in = s->total_out = 0;
s->mode = 'w';
return s;
}
int
null_close(void *cookie, struct z_info *info, const char *name, struct stat *sb)
{
null_stream *s = (null_stream*) cookie;
int err = 0;
if (s == NULL)
return -1;
if (info != NULL) {
info->mtime = 0;
info->crc = (u_int32_t)-1;
info->hlen = 0;
info->total_in = (off_t) s->total_in;
info->total_out = (off_t) s->total_out;
}
setfile(name, s->fd, sb);
err = close(s->fd);
free(s);
return err;
}
int
null_flush(void *cookie, int flush)
{
null_stream *s = (null_stream*)cookie;
if (s == NULL || s->mode != 'w') {
errno = EBADF;
return (-1);
}
return 0;
}
int
null_read(void *cookie, char *buf, int len)
{
null_stream *s = (null_stream*)cookie;
if (s == NULL) {
errno = EBADF;
return (-1);
}
if (s->gotmagic) {
if (len < 2) {
errno = EBADF;
return (-1);
}
buf[0] = null_magic[0];
buf[1] = null_magic[1];
s->gotmagic = 0;
return (2);
}
return read(s->fd, buf, len);
}
int
null_write(void *cookie, const char *buf, int len)
{
null_stream *s = (null_stream*)cookie;
if (s == NULL) {
errno = EBADF;
return (-1);
}
return write(s->fd, buf, len);
}