Consolidate all local CVS patches into the contrib sources.
[dragonfly.git] / contrib / cvs-1.12 / src / zlib.c
1 /* zlib.c --- interface to the zlib compression library
2    Ian Lance Taylor <ian@cygnus.com>
3
4    This file is part of GNU CVS.
5
6    GNU CVS is free software; you can redistribute it and/or modify it
7    under the terms of the GNU General Public License as published by the
8    Free Software Foundation; either version 2, or (at your option) any
9    later version.
10
11    This program is distributed in the hope that it will be useful,
12    but WITHOUT ANY WARRANTY; without even the implied warranty of
13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14    GNU General Public License for more details.  */
15
16 /* The routines in this file are the interface between the CVS
17    client/server support and the zlib compression library.  */
18
19 #include "cvs.h"
20 #include "buffer.h"
21 #include "pagealign_alloc.h"
22
23 #if defined (SERVER_SUPPORT) || defined (CLIENT_SUPPORT)
24
25 #if HAVE_ZLIB_H
26 # include <zlib.h>
27 #else
28 # include "zlib.h"
29 #endif
30
31 /* OS/2 doesn't have EIO.  FIXME: this whole notion of turning
32    a different error into EIO strikes me as pretty dubious.  */
33 #if !defined (EIO)
34 #define EIO EBADPOS
35 #endif
36
37 /* The compression interface is built upon the buffer data structure.
38    We provide a buffer type which compresses or decompresses the data
39    which passes through it.  An input buffer decompresses the data
40    read from an underlying buffer, and an output buffer compresses the
41    data before writing it to an underlying buffer.  */
42
43 /* This structure is the closure field of the buffer.  */
44
45 struct compress_buffer
46 {
47     /* The underlying buffer.  */
48     struct buffer *buf;
49
50     /* The compression information.  */
51     z_stream zstr;
52     int level;
53 };
54
55 static void compress_error (int, int, z_stream *, const char *);
56 static int compress_buffer_input (void *, char *, size_t, size_t, size_t *);
57 static int compress_buffer_output (void *, const char *, size_t, size_t *);
58 static int compress_buffer_flush (void *);
59 static int compress_buffer_block (void *, bool);
60 static int compress_buffer_get_fd (void *);
61 static int compress_buffer_shutdown_input (struct buffer *);
62 static int compress_buffer_shutdown_output (struct buffer *);
63
64 /* Report an error from one of the zlib functions.  */
65
66 static void
67 compress_error (int status, int zstatus, z_stream *zstr, const char *msg)
68 {
69     int hold_errno;
70     const char *zmsg;
71     char buf[100];
72
73     hold_errno = errno;
74
75     zmsg = zstr->msg;
76     if (zmsg == NULL)
77     {
78         sprintf (buf, "error %d", zstatus);
79         zmsg = buf;
80     }
81
82     error (status,
83            zstatus == Z_ERRNO ? hold_errno : 0,
84            "%s: %s", msg, zmsg);
85 }
86
87
88
89 /* Create a compression buffer.  */
90 struct buffer *
91 compress_buffer_initialize (struct buffer *buf, int input, int level,
92                             void (*memory) (struct buffer *))
93 {
94     struct compress_buffer *n;
95     int zstatus;
96
97     n = xmalloc (sizeof *n);
98     memset (n, 0, sizeof *n);
99
100     n->buf = buf;
101     n->level = level;
102
103     if (input)
104         zstatus = inflateInit (&n->zstr);
105     else
106         zstatus = deflateInit (&n->zstr, level);
107     if (zstatus != Z_OK)
108         compress_error (1, zstatus, &n->zstr, "compression initialization");
109
110     /* There may already be data buffered on BUF.  For an output
111        buffer, this is OK, because these routines will just use the
112        buffer routines to append data to the (uncompressed) data
113        already on BUF.  An input buffer expects to handle a single
114        buffer_data of buffered input to be uncompressed, so that is OK
115        provided there is only one buffer.  At present that is all
116        there ever will be; if this changes, compress_buffer_input must
117        be modified to handle multiple input buffers.  */
118     assert (! input || buf->data == NULL || buf->data->next == NULL);
119
120     return buf_initialize (input ? compress_buffer_input : NULL,
121                            input ? NULL : compress_buffer_output,
122                            input ? NULL : compress_buffer_flush,
123                            compress_buffer_block, compress_buffer_get_fd,
124                            (input
125                             ? compress_buffer_shutdown_input
126                             : compress_buffer_shutdown_output),
127                            memory,
128                            n);
129 }
130
131
132
133 /* Input data from a compression buffer.  */
134 static int
135 compress_buffer_input (void *closure, char *data, size_t need, size_t size,
136                        size_t *got)
137 {
138     struct compress_buffer *cb = closure;
139     struct buffer_data *bd;
140
141     assert (cb->buf->input);
142
143     /* We use a single buffer_data structure to buffer up data which
144        the z_stream structure won't use yet.  We can safely store this
145        on cb->buf->data, because we never call the buffer routines on
146        cb->buf; we only call the buffer input routine, since that
147        gives us the semantics we want.  As noted in
148        compress_buffer_initialize, the buffer_data structure may
149        already exist, and hold data which was already read and
150        buffered before the decompression began.  */
151     bd = cb->buf->data;
152     if (bd == NULL)
153     {
154         bd = xmalloc (sizeof (struct buffer_data));
155         if (bd == NULL)
156             return -2;
157         bd->text = pagealign_xalloc (BUFFER_DATA_SIZE);
158         if (bd->text == NULL)
159         {
160             free (bd);
161             return -2;
162         }
163         bd->bufp = bd->text;
164         bd->size = 0;
165         cb->buf->data = bd;
166     }
167
168     cb->zstr.avail_out = size;
169     cb->zstr.next_out = (Bytef *) data;
170
171     while (1)
172     {
173         int zstatus, sofar, status;
174         size_t nread;
175
176         /* First try to inflate any data we already have buffered up.
177            This is useful even if we don't have any buffered data,
178            because there may be data buffered inside the z_stream
179            structure.  */
180
181         cb->zstr.avail_in = bd->size;
182         cb->zstr.next_in = (Bytef *) bd->bufp;
183
184         do
185         {
186             zstatus = inflate (&cb->zstr, Z_NO_FLUSH);
187             if (zstatus == Z_STREAM_END)
188                 break;
189             if (zstatus != Z_OK && zstatus != Z_BUF_ERROR)
190             {
191                 compress_error (0, zstatus, &cb->zstr, "inflate");
192                 return EIO;
193             }
194         } while (cb->zstr.avail_in > 0
195                  && cb->zstr.avail_out > 0);
196
197         bd->size = cb->zstr.avail_in;
198         bd->bufp = (char *) cb->zstr.next_in;
199
200         sofar = size - cb->zstr.avail_out;
201
202         if (zstatus == Z_STREAM_END)
203         {
204             /* If we read any data, then return it, relying on the fact that
205              * we will get Z_STREAM_END on the next read too.
206              */
207             if (sofar > 0) break;
208
209             /* Otherwise, return EOF.  */
210             return -1;
211         }
212
213         /* If we have obtained NEED bytes, then return, unless NEED is
214            zero and we haven't obtained anything at all.  If NEED is
215            zero, we will attempt at least one nonblocking read and see if
216            we can inflate anything then.  */
217         if (sofar > 0 && sofar >= need)
218             break;
219
220         /* All our buffered data should have been processed at this
221            point.  */
222         assert (bd->size == 0);
223
224         /* This will work well in the server, because this call will
225            do an unblocked read and fetch all the available data.  In
226            the client, this will read a single byte from the stdio
227            stream, which will cause us to call inflate once per byte.
228            It would be more efficient if we could make a call which
229            would fetch all the available bytes, and at least one byte.  */
230
231         status = (*cb->buf->input) (cb->buf->closure, bd->text,
232                                     need > 0 ? 1 : 0, BUFFER_DATA_SIZE, &nread);
233
234         if (status == -2)
235             /* Don't try to recover from memory allcoation errors.  */
236             return status;
237
238         if (status != 0)
239         {
240             /* If we read any data, then return it, relying on the fact that
241              * we will get the same error reading the underlying buffer
242              * on the next read too.
243              */
244             if (sofar > 0) break;
245
246             /* Otherwise, return EOF.  */
247             return status;
248         }
249
250         /* If we didn't read anything, then presumably the buffer is
251            in nonblocking mode, and we should just get out now with
252            whatever we've inflated.  */
253         if (nread == 0)
254         {
255             assert (need == 0);
256             break;
257         }
258
259         bd->bufp = bd->text;
260         bd->size = nread;
261     }
262
263     *got = size - cb->zstr.avail_out;
264
265     return 0;
266 }
267
268
269
270 extern int gzip_level;
271
272 /* Output data to a compression buffer.
273  *
274  * GLOBALS
275  *   gzip_level         If GZIP_LEVEL has changed to a value different from
276  *                      CLOSURE->level, then set the compression level on the
277  *                      stream to the new value.
278  */
279 static int
280 compress_buffer_output (void *closure, const char *data, size_t have,
281                         size_t *wrote)
282 {
283     struct compress_buffer *cb = closure;
284
285     /* This is only used within the while loop below, but allocated here for
286      * efficiency.
287      */
288     static char *buffer = NULL;
289     if (!buffer)
290         buffer = pagealign_xalloc (BUFFER_DATA_SIZE);
291
292     if (cb->level != gzip_level)
293     {
294         cb->level = gzip_level;
295         deflateParams (&cb->zstr, gzip_level, Z_DEFAULT_STRATEGY);
296     }
297
298     cb->zstr.avail_in = have;
299     cb->zstr.next_in = (unsigned char *) data;
300
301     while (cb->zstr.avail_in > 0)
302     {
303         int zstatus;
304
305         cb->zstr.avail_out = BUFFER_DATA_SIZE;
306         cb->zstr.next_out = (unsigned char *) buffer;
307
308         zstatus = deflate (&cb->zstr, Z_NO_FLUSH);
309         if (zstatus != Z_OK)
310         {
311             compress_error (0, zstatus, &cb->zstr, "deflate");
312             return EIO;
313         }
314
315         if (cb->zstr.avail_out != BUFFER_DATA_SIZE)
316             buf_output (cb->buf, buffer,
317                         BUFFER_DATA_SIZE - cb->zstr.avail_out);
318     }
319
320     *wrote = have;
321
322     /* We will only be here because buf_send_output was called on the
323        compression buffer.  That means that we should now call
324        buf_send_output on the underlying buffer.  */
325     return buf_send_output (cb->buf);
326 }
327
328
329
330 /* Flush a compression buffer.  */
331 static int
332 compress_buffer_flush (void *closure)
333 {
334     struct compress_buffer *cb = closure;
335
336     /* This is only used within the while loop below, but allocated here for
337      * efficiency.
338      */
339     static char *buffer = NULL;
340     if (!buffer)
341         buffer = pagealign_xalloc (BUFFER_DATA_SIZE);
342
343     cb->zstr.avail_in = 0;
344     cb->zstr.next_in = NULL;
345
346     while (1)
347     {
348         int zstatus;
349
350         cb->zstr.avail_out = BUFFER_DATA_SIZE;
351         cb->zstr.next_out = (unsigned char *) buffer;
352
353         zstatus = deflate (&cb->zstr, Z_SYNC_FLUSH);
354
355         /* The deflate function will return Z_BUF_ERROR if it can't do
356            anything, which in this case means that all data has been
357            flushed.  */
358         if (zstatus == Z_BUF_ERROR)
359             break;
360
361         if (zstatus != Z_OK)
362         {
363             compress_error (0, zstatus, &cb->zstr, "deflate flush");
364             return EIO;
365         }
366
367         if (cb->zstr.avail_out != BUFFER_DATA_SIZE)
368             buf_output (cb->buf, buffer,
369                         BUFFER_DATA_SIZE - cb->zstr.avail_out);
370
371         /* If the deflate function did not fill the output buffer,
372            then all data has been flushed.  */
373         if (cb->zstr.avail_out > 0)
374             break;
375     }
376
377     /* Now flush the underlying buffer.  Note that if the original
378        call to buf_flush passed 1 for the BLOCK argument, then the
379        buffer will already have been set into blocking mode, so we
380        should always pass 0 here.  */
381     return buf_flush (cb->buf, 0);
382 }
383
384
385
386 /* The block routine for a compression buffer.  */
387 static int
388 compress_buffer_block (void *closure, bool block)
389 {
390     struct compress_buffer *cb = closure;
391
392     if (block)
393         return set_block (cb->buf);
394     else
395         return set_nonblock (cb->buf);
396 }
397
398
399
400 /* Return the file descriptor underlying any child buffers.  */
401 static int
402 compress_buffer_get_fd (void *closure)
403 {
404     struct compress_buffer *cb = closure;
405     return buf_get_fd (cb->buf);
406 }
407
408
409
410 /* Shut down an input buffer.  */
411 static int
412 compress_buffer_shutdown_input (struct buffer *buf)
413 {
414     struct compress_buffer *cb = buf->closure;
415     int zstatus;
416
417     /* Don't make any attempt to pick up trailing data since we are shutting
418      * down.  If the client doesn't know we are shutting down, we might not
419      * see the EOF we are expecting.
420      */
421
422     zstatus = inflateEnd (&cb->zstr);
423     if (zstatus != Z_OK)
424     {
425         compress_error (0, zstatus, &cb->zstr, "inflateEnd");
426         return EIO;
427     }
428
429     return buf_shutdown (cb->buf);
430 }
431
432
433
434 /* Shut down an output buffer.  */
435 static int
436 compress_buffer_shutdown_output (struct buffer *buf)
437 {
438     struct compress_buffer *cb = buf->closure;
439     int zstatus, status;
440
441     /* This is only used within the while loop below, but allocated here for
442      * efficiency.
443      */
444     static char *buffer = NULL;
445     if (!buffer)
446         buffer = pagealign_xalloc (BUFFER_DATA_SIZE);
447
448     do
449     {
450         cb->zstr.avail_out = BUFFER_DATA_SIZE;
451         cb->zstr.next_out = (unsigned char *) buffer;
452
453         zstatus = deflate (&cb->zstr, Z_FINISH);
454         if (zstatus != Z_OK && zstatus != Z_STREAM_END)
455         {
456             compress_error (0, zstatus, &cb->zstr, "deflate finish");
457             return EIO;
458         }
459
460         if (cb->zstr.avail_out != BUFFER_DATA_SIZE)
461             buf_output (cb->buf, buffer,
462                         BUFFER_DATA_SIZE - cb->zstr.avail_out);
463     } while (zstatus != Z_STREAM_END);
464
465     zstatus = deflateEnd (&cb->zstr);
466     if (zstatus != Z_OK)
467     {
468         compress_error (0, zstatus, &cb->zstr, "deflateEnd");
469         return EIO;
470     }
471
472     status = buf_flush (cb->buf, 1);
473     if (status != 0)
474         return status;
475
476     return buf_shutdown (cb->buf);
477 }
478
479
480
481 /* Here is our librarified gzip implementation.  It is very minimal
482    but attempts to be RFC1952 compliant.  */
483
484 /* GZIP ID byte values */
485 #define GZIP_ID1        31
486 #define GZIP_ID2        139
487
488 /* Compression methods */
489 #define GZIP_CDEFLATE   8
490
491 /* Flags */
492 #define GZIP_FTEXT      1
493 #define GZIP_FHCRC      2
494 #define GZIP_FEXTRA     4
495 #define GZIP_FNAME      8
496 #define GZIP_FCOMMENT   16
497
498 /* BUF should contain SIZE bytes of gzipped data (RFC1952/RFC1951).
499    We are to uncompress the data and write the result to the file
500    descriptor FD.  If something goes wrong, give a nonfatal error message
501    mentioning FULLNAME as the name of the file for FD.  Return 1 if
502    it is an error we can't recover from.  */
503
504 int
505 gunzip_and_write (int fd, const char *fullname, unsigned char *buf,
506                   size_t size)
507 {
508     size_t pos;
509     z_stream zstr;
510     int zstatus;
511     unsigned char outbuf[32768];
512     unsigned long crc;
513
514     if (size < 10)
515     {
516         error (0, 0, "gzipped data too small - lacks complete header");
517         return 1;
518     }
519     if (buf[0] != GZIP_ID1 || buf[1] != GZIP_ID2)
520     {
521         error (0, 0, "gzipped data does not start with gzip identification");
522         return 1;
523     }
524     if (buf[2] != GZIP_CDEFLATE)
525     {
526         error (0, 0, "only the deflate compression method is supported");
527         return 1;
528     }
529
530     /* Skip over the fixed header, and then skip any of the variable-length
531        fields.  As we skip each field, we keep pos <= size. The checks
532        on positions and lengths are really checks for malformed or 
533        incomplete gzip data.  */
534     pos = 10;
535     if (buf[3] & GZIP_FEXTRA)
536     {
537         if (pos + 2 >= size) 
538         {
539             error (0, 0, "%s lacks proper gzip XLEN field", fullname);
540             return 1;
541         }
542         pos += buf[pos] + (buf[pos + 1] << 8) + 2;
543         if (pos > size) 
544         {
545             error (0, 0, "%s lacks proper gzip \"extra field\"", fullname);
546             return 1;
547         }
548
549     }
550     if (buf[3] & GZIP_FNAME)
551     {
552         unsigned char *p = memchr(buf + pos, '\0', size - pos);
553         if (p == NULL)
554         {
555             error (0, 0, "%s has bad gzip filename field", fullname);
556             return 1;
557         }
558         pos = p - buf + 1;
559     }
560     if (buf[3] & GZIP_FCOMMENT)
561     {
562         unsigned char *p = memchr(buf + pos, '\0', size - pos);
563         if (p == NULL)
564         {
565             error (0, 0, "%s has bad gzip comment field", fullname);
566             return 1;
567         }
568         pos = p - buf + 1;
569     }
570     if (buf[3] & GZIP_FHCRC)
571     {
572         pos += 2;
573         if (pos > size) 
574         {
575             error (0, 0, "%s has bad gzip CRC16 field", fullname);
576             return 1;
577         }
578     }
579
580     /* There could be no data to decompress - check and short circuit.  */
581     if (pos >= size)
582     {
583         error (0, 0, "gzip data incomplete for %s (no data)", fullname);
584         return 1;
585     }
586
587     memset (&zstr, 0, sizeof zstr);
588     /* Passing a negative argument tells zlib not to look for a zlib
589        (RFC1950) header.  This is an undocumented feature; I suppose if
590        we wanted to be anal we could synthesize a header instead,
591        but why bother?  */
592     zstatus = inflateInit2 (&zstr, -15);
593
594     if (zstatus != Z_OK)
595         compress_error (1, zstatus, &zstr, fullname);
596
597     /* I don't see why we should have to include the 8 byte trailer in
598        avail_in.  But I see that zlib/gzio.c does, and it seemed to fix
599        a fairly rare bug in which we'd get a Z_BUF_ERROR for no obvious
600        reason.  */
601     zstr.avail_in = size - pos;
602     zstr.next_in = buf + pos;
603
604     crc = crc32 (0, NULL, 0);
605
606     do
607     {
608         zstr.avail_out = sizeof (outbuf);
609         zstr.next_out = outbuf;
610         zstatus = inflate (&zstr, Z_NO_FLUSH);
611         if (zstatus != Z_STREAM_END && zstatus != Z_OK)
612         {
613             compress_error (0, zstatus, &zstr, fullname);
614             return 1;
615         }
616         if (write (fd, outbuf, sizeof (outbuf) - zstr.avail_out) < 0)
617         {
618             error (0, errno, "writing decompressed file %s", fullname);
619             return 1;
620         }
621         crc = crc32 (crc, outbuf, sizeof (outbuf) - zstr.avail_out);
622     } while (zstatus != Z_STREAM_END);
623     zstatus = inflateEnd (&zstr);
624     if (zstatus != Z_OK)
625         compress_error (0, zstatus, &zstr, fullname);
626
627     /* Check that there is still 8 trailer bytes remaining (CRC32
628        and ISIZE).  Check total decomp. data, plus header len (pos)
629        against input buffer total size.  */
630     pos += zstr.total_in;
631     if (size - pos != 8)
632     {
633         error (0, 0, "gzip data incomplete for %s (no trailer)", fullname);
634         return 1;
635     }
636
637     if (crc != ((unsigned long)buf[pos]
638                 + ((unsigned long)buf[pos + 1] << 8)
639                 + ((unsigned long)buf[pos + 2] << 16)
640                 + ((unsigned long)buf[pos + 3] << 24)))
641     {
642         error (0, 0, "CRC error uncompressing %s", fullname);
643         return 1;
644     }
645
646     if (zstr.total_out != ((unsigned long)buf[pos + 4]
647                            + ((unsigned long)buf[pos + 5] << 8)
648                            + ((unsigned long)buf[pos + 6] << 16)
649                            + ((unsigned long)buf[pos + 7] << 24)))
650     {
651         error (0, 0, "invalid length uncompressing %s", fullname);
652         return 1;
653     }
654
655     return 0;
656 }
657
658 /* Read all of FD and put the gzipped data (RFC1952/RFC1951) into *BUF,
659    replacing previous contents of *BUF.  *BUF is xmalloc'd and *SIZE is
660    its allocated size.  Put the actual number of bytes of data in
661    *LEN.  If something goes wrong, give a nonfatal error mentioning
662    FULLNAME as the name of the file for FD, and return 1 if we can't
663    recover from it).  LEVEL is the compression level (1-9).  */
664
665 int
666 read_and_gzip (int fd, const char *fullname, unsigned char **buf, size_t *size,
667                size_t *len, int level)
668 {
669     z_stream zstr;
670     int zstatus;
671     unsigned char inbuf[8192];
672     int nread;
673     unsigned long crc;
674
675     if (*size < 1024)
676     {
677         unsigned char *newbuf;
678
679         *size = 1024;
680         newbuf = xrealloc (*buf, *size);
681         if (newbuf == NULL)
682         {
683             error (0, 0, "out of memory");
684             return 1;
685         }
686         *buf = newbuf;
687     }
688     (*buf)[0] = GZIP_ID1;
689     (*buf)[1] = GZIP_ID2;
690     (*buf)[2] = GZIP_CDEFLATE;
691     (*buf)[3] = 0;
692     (*buf)[4] = (*buf)[5] = (*buf)[6] = (*buf)[7] = 0;
693     /* Could set this based on level, but why bother?  */
694     (*buf)[8] = 0;
695     (*buf)[9] = 255;
696
697     memset (&zstr, 0, sizeof zstr);
698     zstatus = deflateInit2 (&zstr, level, Z_DEFLATED, -15, 8,
699                             Z_DEFAULT_STRATEGY);
700     crc = crc32 (0, NULL, 0);
701     if (zstatus != Z_OK)
702     {
703         compress_error (0, zstatus, &zstr, fullname);
704         return 1;
705     }
706     
707     /* Adjust for 10-byte output header (filled in above) */
708     zstr.total_out = 10;
709     zstr.avail_out = *size - 10;
710     zstr.next_out = *buf + 10;
711
712     while (1)
713     {
714         int finish = 0;
715
716         nread = read (fd, inbuf, sizeof inbuf);
717         if (nread < 0)
718         {
719             error (0, errno, "cannot read %s", fullname);
720             return 1;
721         }
722         else if (nread == 0)
723             /* End of file.  */
724             finish = 1;
725         crc = crc32 (crc, inbuf, nread);
726         zstr.next_in = inbuf;
727         zstr.avail_in = nread;
728
729         do
730         {
731             /* I don't see this documented anywhere, but deflate seems
732                to tend to dump core sometimes if we pass it Z_FINISH and
733                a small (e.g. 2147 byte) avail_out.  So we insist on at
734                least 4096 bytes (that is what zlib/gzio.c uses).  */
735
736             if (zstr.avail_out < 4096)
737             {
738                 unsigned char *newbuf;
739
740                 assert(zstr.avail_out + zstr.total_out == *size);
741                 assert(zstr.next_out == *buf + zstr.total_out);
742                 *size *= 2;
743                 newbuf = xrealloc (*buf, *size);
744                 if (newbuf == NULL)
745                 {
746                     error (0, 0, "out of memory");
747                     return 1;
748                 }
749                 *buf = newbuf;
750                 zstr.next_out = *buf + zstr.total_out;
751                 zstr.avail_out = *size - zstr.total_out;
752                 assert(zstr.avail_out + zstr.total_out == *size);
753                 assert(zstr.next_out == *buf + zstr.total_out);
754             }
755
756             zstatus = deflate (&zstr, finish ? Z_FINISH : 0);
757             if (zstatus == Z_STREAM_END)
758                 goto done;
759             else if (zstatus != Z_OK)
760                 compress_error (0, zstatus, &zstr, fullname);
761         } while (zstr.avail_out == 0);
762     }
763  done:
764     /* Need to add the CRC information (8 bytes)
765        to the end of the gzip'd output.
766        Ensure there is enough space in the output buffer
767        to do so.  */
768     if (zstr.avail_out < 8)
769     {
770         unsigned char *newbuf;
771
772         assert(zstr.avail_out + zstr.total_out == *size);
773         assert(zstr.next_out == *buf + zstr.total_out);
774         *size += 8 - zstr.avail_out;
775         newbuf = realloc (*buf, *size);
776         if (newbuf == NULL)
777         {
778             error (0, 0, "out of memory");
779             return 1;
780         }
781         *buf = newbuf;
782         zstr.next_out = *buf + zstr.total_out;
783         zstr.avail_out = *size - zstr.total_out;
784         assert(zstr.avail_out + zstr.total_out == *size);
785         assert(zstr.next_out == *buf + zstr.total_out);
786     } 
787     *zstr.next_out++ = (unsigned char)(crc & 0xff);
788     *zstr.next_out++ = (unsigned char)((crc >> 8) & 0xff);
789     *zstr.next_out++ = (unsigned char)((crc >> 16) & 0xff);
790     *zstr.next_out++ = (unsigned char)((crc >> 24) & 0xff);
791
792     *zstr.next_out++ = (unsigned char)(zstr.total_in & 0xff);
793     *zstr.next_out++ = (unsigned char)((zstr.total_in >> 8) & 0xff);
794     *zstr.next_out++ = (unsigned char)((zstr.total_in >> 16) & 0xff);
795     *zstr.next_out++ = (unsigned char)((zstr.total_in >> 24) & 0xff);
796
797     zstr.total_out += 8;
798     zstr.avail_out -= 8;
799     assert(zstr.avail_out + zstr.total_out == *size);
800     assert(zstr.next_out == *buf + zstr.total_out);
801
802     *len = zstr.total_out;
803
804     zstatus = deflateEnd (&zstr);
805     if (zstatus != Z_OK)
806         compress_error (0, zstatus, &zstr, fullname);
807
808     return 0;
809 }
810 #endif /* defined (SERVER_SUPPORT) || defined (CLIENT_SUPPORT) */