* our own file functions allows us to provide transparent support of
* different line endings, gzip'd print files, PPD files, etc.
*
- * Copyright 2007-2017 by Apple Inc.
- * Copyright 1997-2007 by Easy Software Products, all rights reserved.
+ * Copyright © 2007-2018 by Apple Inc.
+ * Copyright © 1997-2007 by Easy Software Products, all rights reserved.
*
- * Licensed under Apache License v2.0. See the file "LICENSE" for more information.
+ * Licensed under Apache License v2.0. See the file "LICENSE" for more
+ * information.
*/
#ifndef _CUPS_FILE_PRIVATE_H_
# include <stdarg.h>
# include <fcntl.h>
-# ifdef HAVE_LIBZ
-# include <zlib.h>
-# endif /* HAVE_LIBZ */
# ifdef _WIN32
# include <io.h>
# include <sys/locking.h>
typedef void (*_cups_fc_func_t)(void *context, _cups_fc_result_t result,
const char *message);
-struct _cups_file_s /**** CUPS file structure... ****/
-
-{
- int fd; /* File descriptor */
- char mode, /* Mode ('r' or 'w') */
- compressed, /* Compression used? */
- is_stdio, /* stdin/out/err? */
- eof, /* End of file? */
- buf[4096], /* Buffer */
- *ptr, /* Pointer into buffer */
- *end; /* End of buffer data */
- off_t pos, /* Position in file */
- bufpos; /* File position for start of buffer */
-
-#ifdef HAVE_LIBZ
- z_stream stream; /* (De)compression stream */
- Bytef cbuf[4096]; /* (De)compression buffer */
- uLong crc; /* (De)compression CRC */
-#endif /* HAVE_LIBZ */
-
- char *printf_buffer; /* cupsFilePrintf buffer */
- size_t printf_size; /* Size of cupsFilePrintf buffer */
-};
-
-
/*
* Prototypes...
*/
-extern _cups_fc_result_t _cupsFileCheck(const char *filename,
- _cups_fc_filetype_t filetype,
- int dorootchecks,
- _cups_fc_func_t cb,
- void *context) _CUPS_PRIVATE;
-extern void _cupsFileCheckFilter(void *context,
- _cups_fc_result_t result,
- const char *message) _CUPS_PRIVATE;
+extern _cups_fc_result_t _cupsFileCheck(const char *filename, _cups_fc_filetype_t filetype, int dorootchecks, _cups_fc_func_t cb, void *context) _CUPS_PRIVATE;
+extern void _cupsFileCheckFilter(void *context, _cups_fc_result_t result, const char *message) _CUPS_PRIVATE;
+extern int _cupsFilePeekAhead(cups_file_t *fp, int ch);
# ifdef __cplusplus
}
#ifdef HAVE_POLL
# include <poll.h>
#endif /* HAVE_POLL */
+# ifdef HAVE_LIBZ
+# include <zlib.h>
+# endif /* HAVE_LIBZ */
/*
#ifdef HAVE_LIBZ
if (http->used == 0 &&
(http->coding == _HTTP_CODING_IDENTITY ||
- (http->coding >= _HTTP_CODING_GUNZIP && http->stream.avail_in == 0)))
+ (http->coding >= _HTTP_CODING_GUNZIP && ((z_stream *)http->stream)->avail_in == 0)))
#else
if (http->used == 0)
#endif /* HAVE_LIBZ */
int zerr; /* Decompressor error */
z_stream stream; /* Copy of decompressor stream */
- if (http->used > 0 && http->stream.avail_in < HTTP_MAX_BUFFER)
+ if (http->used > 0 && ((z_stream *)http->stream)->avail_in < HTTP_MAX_BUFFER)
{
- size_t buflen = buflen = HTTP_MAX_BUFFER - http->stream.avail_in;
+ size_t buflen = buflen = HTTP_MAX_BUFFER - ((z_stream *)http->stream)->avail_in;
/* Number of bytes to copy */
- if (http->stream.avail_in > 0 &&
- http->stream.next_in > http->sbuffer)
- memmove(http->sbuffer, http->stream.next_in, http->stream.avail_in);
+ if (((z_stream *)http->stream)->avail_in > 0 &&
+ ((z_stream *)http->stream)->next_in > http->sbuffer)
+ memmove(http->sbuffer, ((z_stream *)http->stream)->next_in, ((z_stream *)http->stream)->avail_in);
- http->stream.next_in = http->sbuffer;
+ ((z_stream *)http->stream)->next_in = http->sbuffer;
if (buflen > (size_t)http->data_remaining)
buflen = (size_t)http->data_remaining;
DEBUG_printf(("1httpPeek: Copying %d more bytes of data into "
"decompression buffer.", (int)buflen));
- memcpy(http->sbuffer + http->stream.avail_in, http->buffer, buflen);
- http->stream.avail_in += buflen;
+ memcpy(http->sbuffer + ((z_stream *)http->stream)->avail_in, http->buffer, buflen);
+ ((z_stream *)http->stream)->avail_in += buflen;
http->used -= (int)buflen;
http->data_remaining -= (off_t)buflen;
}
DEBUG_printf(("2httpPeek: length=%d, avail_in=%d", (int)length,
- (int)http->stream.avail_in));
+ (int)((z_stream *)http->stream)->avail_in));
- if (inflateCopy(&stream, &(http->stream)) != Z_OK)
+ if (inflateCopy(&stream, (z_stream *)http->stream) != Z_OK)
{
DEBUG_puts("2httpPeek: Unable to copy decompressor stream.");
http->error = ENOMEM;
{
DEBUG_printf(("2httpPeek: zerr=%d", zerr));
#ifdef DEBUG
- http_debug_hex("2httpPeek", (char *)http->sbuffer, (int)http->stream.avail_in);
+ http_debug_hex("2httpPeek", (char *)http->sbuffer, (int)((z_stream *)http->stream)->avail_in);
#endif /* DEBUG */
http->error = EIO;
return (-1);
}
- bytes = (ssize_t)(length - http->stream.avail_out);
+ bytes = (ssize_t)(length - ((z_stream *)http->stream)->avail_out);
# else
DEBUG_puts("2httpPeek: No inflateCopy on this platform, httpPeek does not "
{
do
{
- if (http->stream.avail_in > 0)
+ if (((z_stream *)http->stream)->avail_in > 0)
{
int zerr; /* Decompressor error */
DEBUG_printf(("2httpRead2: avail_in=%d, avail_out=%d",
- (int)http->stream.avail_in, (int)length));
+ (int)((z_stream *)http->stream)->avail_in, (int)length));
- http->stream.next_out = (Bytef *)buffer;
- http->stream.avail_out = (uInt)length;
+ ((z_stream *)http->stream)->next_out = (Bytef *)buffer;
+ ((z_stream *)http->stream)->avail_out = (uInt)length;
- if ((zerr = inflate(&(http->stream), Z_SYNC_FLUSH)) < Z_OK)
+ if ((zerr = inflate((z_stream *)http->stream, Z_SYNC_FLUSH)) < Z_OK)
{
DEBUG_printf(("2httpRead2: zerr=%d", zerr));
#ifdef DEBUG
- http_debug_hex("2httpRead2", (char *)http->sbuffer, (int)http->stream.avail_in);
+ http_debug_hex("2httpRead2", (char *)http->sbuffer, (int)((z_stream *)http->stream)->avail_in);
#endif /* DEBUG */
http->error = EIO;
return (-1);
}
- bytes = (ssize_t)(length - http->stream.avail_out);
+ bytes = (ssize_t)(length - ((z_stream *)http->stream)->avail_out);
DEBUG_printf(("2httpRead2: avail_in=%d, avail_out=%d, bytes=%d",
- http->stream.avail_in, http->stream.avail_out,
+ ((z_stream *)http->stream)->avail_in, ((z_stream *)http->stream)->avail_out,
(int)bytes));
}
else
if (bytes == 0)
{
- ssize_t buflen = HTTP_MAX_BUFFER - (ssize_t)http->stream.avail_in;
+ ssize_t buflen = HTTP_MAX_BUFFER - (ssize_t)((z_stream *)http->stream)->avail_in;
/* Additional bytes for buffer */
if (buflen > 0)
{
- if (http->stream.avail_in > 0 &&
- http->stream.next_in > http->sbuffer)
- memmove(http->sbuffer, http->stream.next_in, http->stream.avail_in);
+ if (((z_stream *)http->stream)->avail_in > 0 &&
+ ((z_stream *)http->stream)->next_in > http->sbuffer)
+ memmove(http->sbuffer, ((z_stream *)http->stream)->next_in, ((z_stream *)http->stream)->avail_in);
- http->stream.next_in = http->sbuffer;
+ ((z_stream *)http->stream)->next_in = http->sbuffer;
DEBUG_printf(("1httpRead2: Reading up to %d more bytes of data into "
"decompression buffer.", (int)buflen));
if (buflen > http->data_remaining)
buflen = (ssize_t)http->data_remaining;
- bytes = http_read_buffered(http, (char *)http->sbuffer + http->stream.avail_in, (size_t)buflen);
+ bytes = http_read_buffered(http, (char *)http->sbuffer + ((z_stream *)http->stream)->avail_in, (size_t)buflen);
}
else if (http->data_encoding == HTTP_ENCODING_CHUNKED)
- bytes = http_read_chunk(http, (char *)http->sbuffer + http->stream.avail_in, (size_t)buflen);
+ bytes = http_read_chunk(http, (char *)http->sbuffer + ((z_stream *)http->stream)->avail_in, (size_t)buflen);
else
bytes = 0;
"decompression buffer.", CUPS_LLCAST bytes));
http->data_remaining -= bytes;
- http->stream.avail_in += (uInt)bytes;
+ ((z_stream *)http->stream)->avail_in += (uInt)bytes;
if (http->data_remaining <= 0 &&
http->data_encoding == HTTP_ENCODING_CHUNKED)
if (
#ifdef HAVE_LIBZ
(http->coding == _HTTP_CODING_IDENTITY ||
- (http->coding >= _HTTP_CODING_GUNZIP && http->stream.avail_in == 0)) &&
+ (http->coding >= _HTTP_CODING_GUNZIP && ((z_stream *)http->stream)->avail_in == 0)) &&
#endif /* HAVE_LIBZ */
((http->data_remaining <= 0 &&
http->data_encoding == HTTP_ENCODING_LENGTH) ||
}
#ifdef HAVE_LIBZ
- if (http->coding >= _HTTP_CODING_GUNZIP && http->stream.avail_in > 0)
+ if (http->coding >= _HTTP_CODING_GUNZIP && ((z_stream *)http->stream)->avail_in > 0)
{
DEBUG_puts("3httpWait: Returning 1 since there is buffered data ready.");
return (1);
size_t slen; /* Bytes to write */
ssize_t sret; /* Bytes written */
- http->stream.next_in = (Bytef *)buffer;
- http->stream.avail_in = (uInt)length;
+ ((z_stream *)http->stream)->next_in = (Bytef *)buffer;
+ ((z_stream *)http->stream)->avail_in = (uInt)length;
- while (deflate(&(http->stream), Z_NO_FLUSH) == Z_OK)
+ while (deflate((z_stream *)http->stream, Z_NO_FLUSH) == Z_OK)
{
- DEBUG_printf(("1httpWrite2: avail_out=%d", http->stream.avail_out));
+ DEBUG_printf(("1httpWrite2: avail_out=%d", ((z_stream *)http->stream)->avail_out));
- if (http->stream.avail_out > 0)
+ if (((z_stream *)http->stream)->avail_out > 0)
continue;
- slen = _HTTP_MAX_SBUFFER - http->stream.avail_out;
+ slen = _HTTP_MAX_SBUFFER - ((z_stream *)http->stream)->avail_out;
DEBUG_printf(("1httpWrite2: Writing intermediate chunk, len=%d", (int)slen));
return (-1);
}
- http->stream.next_out = (Bytef *)http->sbuffer;
- http->stream.avail_out = (uInt)_HTTP_MAX_SBUFFER;
+ ((z_stream *)http->stream)->next_out = (Bytef *)http->sbuffer;
+ ((z_stream *)http->stream)->avail_out = (uInt)_HTTP_MAX_SBUFFER;
}
bytes = (ssize_t)length;
{
case _HTTP_CODING_DEFLATE :
case _HTTP_CODING_GZIP :
- http->stream.next_in = dummy;
- http->stream.avail_in = 0;
+ ((z_stream *)http->stream)->next_in = dummy;
+ ((z_stream *)http->stream)->avail_in = 0;
do
{
- zerr = deflate(&(http->stream), Z_FINISH);
- bytes = _HTTP_MAX_SBUFFER - http->stream.avail_out;
+ zerr = deflate((z_stream *)http->stream, Z_FINISH);
+ bytes = _HTTP_MAX_SBUFFER - ((z_stream *)http->stream)->avail_out;
if (bytes > 0)
{
http_write(http, (char *)http->sbuffer, bytes);
}
- http->stream.next_out = (Bytef *)http->sbuffer;
- http->stream.avail_out = (uInt)_HTTP_MAX_SBUFFER;
+ ((z_stream *)http->stream)->next_out = (Bytef *)http->sbuffer;
+ ((z_stream *)http->stream)->avail_out = (uInt)_HTTP_MAX_SBUFFER;
}
while (zerr == Z_OK);
- deflateEnd(&(http->stream));
+ deflateEnd((z_stream *)http->stream);
free(http->sbuffer);
+ free(http->stream);
+
http->sbuffer = NULL;
+ http->stream = NULL;
if (http->wused)
httpFlushWrite(http);
case _HTTP_CODING_INFLATE :
case _HTTP_CODING_GUNZIP :
- inflateEnd(&(http->stream));
+ inflateEnd((z_stream *)http->stream);
+
free(http->sbuffer);
+ free(http->stream);
+
http->sbuffer = NULL;
+ http->stream = NULL;
break;
default :
return;
}
- memset(&(http->stream), 0, sizeof(http->stream));
-
switch (coding)
{
case _HTTP_CODING_DEFLATE :
* documentation.
*/
- if ((zerr = deflateInit2(&(http->stream), Z_DEFAULT_COMPRESSION,
- Z_DEFLATED,
- coding == _HTTP_CODING_DEFLATE ? -11 : 27, 7,
- Z_DEFAULT_STRATEGY)) < Z_OK)
+ if ((http->stream = calloc(1, sizeof(z_stream))) == NULL)
+ {
+ free(http->sbuffer);
+
+ http->sbuffer = NULL;
+ http->status = HTTP_STATUS_ERROR;
+ http->error = errno;
+ return;
+ }
+
+ if ((zerr = deflateInit2((z_stream *)http->stream, Z_DEFAULT_COMPRESSION, Z_DEFLATED, coding == _HTTP_CODING_DEFLATE ? -11 : 27, 7, Z_DEFAULT_STRATEGY)) < Z_OK)
{
- http->status = HTTP_STATUS_ERROR;
- http->error = zerr == Z_MEM_ERROR ? ENOMEM : EINVAL;
+ free(http->sbuffer);
+ free(http->stream);
+
+ http->sbuffer = NULL;
+ http->stream = NULL;
+ http->status = HTTP_STATUS_ERROR;
+ http->error = zerr == Z_MEM_ERROR ? ENOMEM : EINVAL;
return;
}
- http->stream.next_out = (Bytef *)http->sbuffer;
- http->stream.avail_out = (uInt)_HTTP_MAX_SBUFFER;
+ ((z_stream *)http->stream)->next_out = (Bytef *)http->sbuffer;
+ ((z_stream *)http->stream)->avail_out = (uInt)_HTTP_MAX_SBUFFER;
break;
case _HTTP_CODING_INFLATE :
* -15 is raw inflate, 31 is gunzip, per ZLIB documentation.
*/
- if ((zerr = inflateInit2(&(http->stream),
- coding == _HTTP_CODING_INFLATE ? -15 : 31))
- < Z_OK)
+ if ((http->stream = calloc(1, sizeof(z_stream))) == NULL)
+ {
+ free(http->sbuffer);
+
+ http->sbuffer = NULL;
+ http->status = HTTP_STATUS_ERROR;
+ http->error = errno;
+ return;
+ }
+
+ if ((zerr = inflateInit2((z_stream *)http->stream, coding == _HTTP_CODING_INFLATE ? -15 : 31)) < Z_OK)
{
free(http->sbuffer);
+ free(http->stream);
+
http->sbuffer = NULL;
+ http->stream = NULL;
http->status = HTTP_STATUS_ERROR;
http->error = zerr == Z_MEM_ERROR ? ENOMEM : EINVAL;
return;
}
- http->stream.avail_in = 0;
- http->stream.next_in = http->sbuffer;
+ ((z_stream *)http->stream)->avail_in = 0;
+ ((z_stream *)http->stream)->next_in = http->sbuffer;
break;
default :