#ifdef RCSID
static char rcsid[] = "$Id: zip.c,v 0.17 1993/06/10 13:29:25 jloup Exp $";
#endif
#include <config.h>
#include <ctype.h>
#include "tailor.h"
#include "gzip.h"
#include "crypt.h"
#ifdef HAVE_UNISTD_H
# include <unistd.h>
#endif
#ifdef HAVE_FCNTL_H
# include <fcntl.h>
#endif
local ulg crc;
off_t header_bytes;
int zip(in, out)
int in, out;
{
uch flags = 0;
ush attr = 0;
ush deflate_flags = 0;
ifd = in;
ofd = out;
outcnt = 0;
method = DEFLATED;
put_byte(GZIP_MAGIC[0]);
put_byte(GZIP_MAGIC[1]);
put_byte(DEFLATED);
if (save_orig_name) {
flags |= ORIG_NAME;
}
put_byte(flags);
put_long(time_stamp == (time_stamp & 0xffffffff)
? (ulg)time_stamp : (ulg)0);
crc = updcrc(0, 0);
bi_init(out);
ct_init(&attr, &method);
lm_init(level, &deflate_flags);
put_byte((uch)deflate_flags);
put_byte(OS_CODE);
if (save_orig_name) {
char *p = base_name(ifname);
do {
put_char(*p);
} while (*p++);
}
header_bytes = (off_t)outcnt;
(void)deflate();
#if !defined(NO_SIZE_CHECK) && !defined(RECORD_IO)
if (ifile_size != -1L && bytes_in != ifile_size) {
fprintf(stderr, "%s: %s: file size changed while zipping\n",
progname, ifname);
}
#endif
put_long(crc);
put_long((ulg)bytes_in);
header_bytes += 2*sizeof(long);
flush_outbuf();
return OK;
}
int file_read(buf, size)
char *buf;
unsigned size;
{
unsigned len;
Assert(insize == 0, "inbuf not empty");
len = read(ifd, buf, size);
if (len == 0) return (int)len;
if (len == (unsigned)-1) {
read_error();
return EOF;
}
crc = updcrc((uch*)buf, len);
bytes_in += (off_t)len;
return (int)len;
}