1 /* 2 * Private file definitions for CUPS. 3 * 4 * Since stdio files max out at 256 files on many systems, we have to 5 * write similar functions without this limit. At the same time, using 6 * our own file functions allows us to provide transparent support of 7 * different line endings, gzip'd print files, PPD files, etc. 8 * 9 * Copyright 2007-2017 by Apple Inc. 10 * Copyright 1997-2007 by Easy Software Products, all rights reserved. 11 * 12 * These coded instructions, statements, and computer programs are the 13 * property of Apple Inc. and are protected by Federal copyright 14 * law. Distribution and use rights are outlined in the file "LICENSE.txt" 15 * which should have been included with this file. If this file is 16 * missing or damaged, see the license at "http://www.cups.org/". 17 * 18 * This file is subject to the Apple OS-Developed Software exception. 19 */ 20 21 #ifndef _CUPS_FILE_PRIVATE_H_ 22 # define _CUPS_FILE_PRIVATE_H_ 23 24 /* 25 * Include necessary headers... 26 */ 27 28 # include "cups-private.h" 29 # include <stdio.h> 30 # include <stdlib.h> 31 # include <stdarg.h> 32 # include <fcntl.h> 33 34 # ifdef HAVE_LIBZ 35 # include <zlib.h> 36 # endif /* HAVE_LIBZ */ 37 # ifdef WIN32 38 # include <io.h> 39 # include <sys/locking.h> 40 # endif /* WIN32 */ 41 42 43 /* 44 * Some operating systems support large files via open flag O_LARGEFILE... 45 */ 46 47 # ifndef O_LARGEFILE 48 # define O_LARGEFILE 0 49 # endif /* !O_LARGEFILE */ 50 51 52 /* 53 * Some operating systems don't define O_BINARY, which is used by Microsoft 54 * and IBM to flag binary files... 55 */ 56 57 # ifndef O_BINARY 58 # define O_BINARY 0 59 # endif /* !O_BINARY */ 60 61 62 # ifdef __cplusplus 63 extern "C" { 64 # endif /* __cplusplus */ 65 66 67 /* 68 * Types and structures... 69 */ 70 71 typedef enum /**** _cupsFileCheck return values ****/ 72 { 73 _CUPS_FILE_CHECK_OK = 0, /* Everything OK */ 74 _CUPS_FILE_CHECK_MISSING = 1, /* File is missing */ 75 _CUPS_FILE_CHECK_PERMISSIONS = 2, /* File (or parent dir) has bad perms */ 76 _CUPS_FILE_CHECK_WRONG_TYPE = 3, /* File has wrong type */ 77 _CUPS_FILE_CHECK_RELATIVE_PATH = 4 /* File contains a relative path */ 78 } _cups_fc_result_t; 79 80 typedef enum /**** _cupsFileCheck file type values ****/ 81 { 82 _CUPS_FILE_CHECK_FILE = 0, /* Check the file and parent directory */ 83 _CUPS_FILE_CHECK_PROGRAM = 1, /* Check the program and parent directory */ 84 _CUPS_FILE_CHECK_FILE_ONLY = 2, /* Check the file only */ 85 _CUPS_FILE_CHECK_DIRECTORY = 3 /* Check the directory */ 86 } _cups_fc_filetype_t; 87 88 typedef void (*_cups_fc_func_t)(void *context, _cups_fc_result_t result, 89 const char *message); 90 91 struct _cups_file_s /**** CUPS file structure... ****/ 92 93 { 94 int fd; /* File descriptor */ 95 char mode, /* Mode ('r' or 'w') */ 96 compressed, /* Compression used? */ 97 is_stdio, /* stdin/out/err? */ 98 eof, /* End of file? */ 99 buf[4096], /* Buffer */ 100 *ptr, /* Pointer into buffer */ 101 *end; /* End of buffer data */ 102 off_t pos, /* Position in file */ 103 bufpos; /* File position for start of buffer */ 104 105 #ifdef HAVE_LIBZ 106 z_stream stream; /* (De)compression stream */ 107 Bytef cbuf[4096]; /* (De)compression buffer */ 108 uLong crc; /* (De)compression CRC */ 109 #endif /* HAVE_LIBZ */ 110 111 char *printf_buffer; /* cupsFilePrintf buffer */ 112 size_t printf_size; /* Size of cupsFilePrintf buffer */ 113 }; 114 115 116 /* 117 * Prototypes... 118 */ 119 120 extern _cups_fc_result_t _cupsFileCheck(const char *filename, 121 _cups_fc_filetype_t filetype, 122 int dorootchecks, 123 _cups_fc_func_t cb, 124 void *context); 125 extern void _cupsFileCheckFilter(void *context, 126 _cups_fc_result_t result, 127 const char *message); 128 129 # ifdef __cplusplus 130 } 131 # endif /* __cplusplus */ 132 133 #endif /* !_CUPS_FILE_PRIVATE_H_ */ 134