125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/* 225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * File functions for CUPS. 325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Since stdio files max out at 256 files on many systems, we have to 525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * write similar functions without this limit. At the same time, using 625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * our own file functions allows us to provide transparent support of 725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * gzip'd print files, PPD files, etc. 825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Copyright 2007-2015 by Apple Inc. 1025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Copyright 1997-2007 by Easy Software Products, all rights reserved. 1125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 1225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * These coded instructions, statements, and computer programs are the 1325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * property of Apple Inc. and are protected by Federal copyright 1425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * law. Distribution and use rights are outlined in the file "LICENSE.txt" 1525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * which should have been included with this file. If this file is 162447373f182dbfeb47fb86c0f5a6ac5773c65ac2Philip P. Moltmann * missing or damaged, see the license at "http://www.cups.org/". 1725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 1825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * This file is subject to the Apple OS-Developed Software exception. 1925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 2025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 2125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/* 2225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Include necessary headers... 2325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 2425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 2525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#include "file-private.h" 2625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#include <sys/stat.h> 2725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#include <sys/types.h> 2825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 2925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 3025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/* 3125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Local functions... 3225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 3325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 3425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#ifdef HAVE_LIBZ 3525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannstatic ssize_t cups_compress(cups_file_t *fp, const char *buf, size_t bytes); 3625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#endif /* HAVE_LIBZ */ 3725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannstatic ssize_t cups_fill(cups_file_t *fp); 3825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannstatic int cups_open(const char *filename, int mode); 3925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannstatic ssize_t cups_read(cups_file_t *fp, char *buf, size_t bytes); 4025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannstatic ssize_t cups_write(cups_file_t *fp, const char *buf, size_t bytes); 4125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 4225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 4325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#ifndef WIN32 4425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/* 4525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * '_cupsFileCheck()' - Check the permissions of the given filename. 4625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 4725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 4825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann_cups_fc_result_t /* O - Check result */ 4925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann_cupsFileCheck( 5025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann const char *filename, /* I - Filename to check */ 5125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann _cups_fc_filetype_t filetype, /* I - Type of file checks? */ 5225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann int dorootchecks, /* I - Check for root permissions? */ 5325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann _cups_fc_func_t cb, /* I - Callback function */ 5425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann void *context) /* I - Context pointer for callback */ 5525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 5625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann{ 5725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann struct stat fileinfo; /* File information */ 5825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann char message[1024], /* Message string */ 5925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann temp[1024], /* Parent directory filename */ 6025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *ptr; /* Pointer into parent directory */ 6125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann _cups_fc_result_t result; /* Check result */ 6225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 6325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 6425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 6525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Does the filename contain a relative path ("../")? 6625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 6725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 6825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (strstr(filename, "../")) 6925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 7025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 7125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Yes, fail it! 7225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 7325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 7425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann result = _CUPS_FILE_CHECK_RELATIVE_PATH; 7525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann goto finishup; 7625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 7725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 7825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 7925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Does the program even exist and is it accessible? 8025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 8125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 8225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (stat(filename, &fileinfo)) 8325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 8425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 8525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Nope... 8625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 8725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 8825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann result = _CUPS_FILE_CHECK_MISSING; 8925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann goto finishup; 9025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 9125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 9225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 9325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Check the execute bit... 9425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 9525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 9625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann result = _CUPS_FILE_CHECK_OK; 9725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 9825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann switch (filetype) 9925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 10025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann case _CUPS_FILE_CHECK_DIRECTORY : 10125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (!S_ISDIR(fileinfo.st_mode)) 10225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann result = _CUPS_FILE_CHECK_WRONG_TYPE; 10325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann break; 10425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 10525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann default : 10625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (!S_ISREG(fileinfo.st_mode)) 10725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann result = _CUPS_FILE_CHECK_WRONG_TYPE; 10825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann break; 10925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 11025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 11125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (result) 11225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann goto finishup; 11325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 11425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 11525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Are we doing root checks? 11625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 11725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 11825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (!dorootchecks) 11925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 12025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 12125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Nope, so anything (else) goes... 12225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 12325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 12425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann goto finishup; 12525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 12625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 12725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 12825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Verify permission of the file itself: 12925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 13025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 1. Must be owned by root 13125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 2. Must not be writable by group 13225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 3. Must not be setuid 13325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 4. Must not be writable by others 13425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 13525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 13625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (fileinfo.st_uid || /* 1. Must be owned by root */ 13725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann (fileinfo.st_mode & S_IWGRP) || /* 2. Must not be writable by group */ 13825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann (fileinfo.st_mode & S_ISUID) || /* 3. Must not be setuid */ 13925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann (fileinfo.st_mode & S_IWOTH)) /* 4. Must not be writable by others */ 14025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 14125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann result = _CUPS_FILE_CHECK_PERMISSIONS; 14225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann goto finishup; 14325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 14425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 14525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (filetype == _CUPS_FILE_CHECK_DIRECTORY || 14625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann filetype == _CUPS_FILE_CHECK_FILE_ONLY) 14725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann goto finishup; 14825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 14925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 15025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Now check the containing directory... 15125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 15225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 15325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann strlcpy(temp, filename, sizeof(temp)); 15425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if ((ptr = strrchr(temp, '/')) != NULL) 15525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 15625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (ptr == temp) 15725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann ptr[1] = '\0'; 15825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else 15925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *ptr = '\0'; 16025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 16125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 16225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (stat(temp, &fileinfo)) 16325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 16425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 16525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Doesn't exist?!? 16625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 16725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 16825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann result = _CUPS_FILE_CHECK_MISSING; 16925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann filetype = _CUPS_FILE_CHECK_DIRECTORY; 17025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann filename = temp; 17125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 17225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann goto finishup; 17325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 17425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 17525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (fileinfo.st_uid || /* 1. Must be owned by root */ 17625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann (fileinfo.st_mode & S_IWGRP) || /* 2. Must not be writable by group */ 17725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann (fileinfo.st_mode & S_ISUID) || /* 3. Must not be setuid */ 17825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann (fileinfo.st_mode & S_IWOTH)) /* 4. Must not be writable by others */ 17925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 18025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann result = _CUPS_FILE_CHECK_PERMISSIONS; 18125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann filetype = _CUPS_FILE_CHECK_DIRECTORY; 18225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann filename = temp; 18325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 18425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 18525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 18625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Common return point... 18725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 18825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 18925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann finishup: 19025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 19125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (cb) 19225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 19325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann cups_lang_t *lang = cupsLangDefault(); 19425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* Localization information */ 19525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 19625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann switch (result) 19725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 19825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann case _CUPS_FILE_CHECK_OK : 19925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (filetype == _CUPS_FILE_CHECK_DIRECTORY) 20025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann snprintf(message, sizeof(message), 20125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann _cupsLangString(lang, _("Directory \"%s\" permissions OK " 20225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann "(0%o/uid=%d/gid=%d).")), 20325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann filename, fileinfo.st_mode, (int)fileinfo.st_uid, 20425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann (int)fileinfo.st_gid); 20525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else 20625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann snprintf(message, sizeof(message), 20725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann _cupsLangString(lang, _("File \"%s\" permissions OK " 20825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann "(0%o/uid=%d/gid=%d).")), 20925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann filename, fileinfo.st_mode, (int)fileinfo.st_uid, 21025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann (int)fileinfo.st_gid); 21125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann break; 21225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 21325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann case _CUPS_FILE_CHECK_MISSING : 21425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (filetype == _CUPS_FILE_CHECK_DIRECTORY) 21525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann snprintf(message, sizeof(message), 21625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann _cupsLangString(lang, _("Directory \"%s\" not available: " 21725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann "%s")), 21825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann filename, strerror(errno)); 21925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else 22025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann snprintf(message, sizeof(message), 22125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann _cupsLangString(lang, _("File \"%s\" not available: %s")), 22225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann filename, strerror(errno)); 22325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann break; 22425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 22525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann case _CUPS_FILE_CHECK_PERMISSIONS : 22625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (filetype == _CUPS_FILE_CHECK_DIRECTORY) 22725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann snprintf(message, sizeof(message), 22825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann _cupsLangString(lang, _("Directory \"%s\" has insecure " 22925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann "permissions " 23025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann "(0%o/uid=%d/gid=%d).")), 23125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann filename, fileinfo.st_mode, (int)fileinfo.st_uid, 23225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann (int)fileinfo.st_gid); 23325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else 23425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann snprintf(message, sizeof(message), 23525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann _cupsLangString(lang, _("File \"%s\" has insecure " 23625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann "permissions " 23725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann "(0%o/uid=%d/gid=%d).")), 23825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann filename, fileinfo.st_mode, (int)fileinfo.st_uid, 23925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann (int)fileinfo.st_gid); 24025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann break; 24125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 24225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann case _CUPS_FILE_CHECK_WRONG_TYPE : 24325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (filetype == _CUPS_FILE_CHECK_DIRECTORY) 24425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann snprintf(message, sizeof(message), 24525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann _cupsLangString(lang, _("Directory \"%s\" is a file.")), 24625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann filename); 24725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else 24825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann snprintf(message, sizeof(message), 24925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann _cupsLangString(lang, _("File \"%s\" is a directory.")), 25025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann filename); 25125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann break; 25225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 25325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann case _CUPS_FILE_CHECK_RELATIVE_PATH : 25425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (filetype == _CUPS_FILE_CHECK_DIRECTORY) 25525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann snprintf(message, sizeof(message), 25625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann _cupsLangString(lang, _("Directory \"%s\" contains a " 25725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann "relative path.")), filename); 25825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else 25925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann snprintf(message, sizeof(message), 26025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann _cupsLangString(lang, _("File \"%s\" contains a relative " 26125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann "path.")), filename); 26225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann break; 26325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 26425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 26525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann (*cb)(context, result, message); 26625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 26725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 26825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (result); 26925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann} 27025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 27125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 27225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/* 27325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * '_cupsFileCheckFilter()' - Report file check results as CUPS filter messages. 27425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 27525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 27625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannvoid 27725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann_cupsFileCheckFilter( 27825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann void *context, /* I - Context pointer (unused) */ 27925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann _cups_fc_result_t result, /* I - Result code */ 28025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann const char *message) /* I - Message text */ 28125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann{ 28225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann const char *prefix; /* Messaging prefix */ 28325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 28425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 28525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann (void)context; 28625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 28725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann switch (result) 28825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 28925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann default : 29025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann case _CUPS_FILE_CHECK_OK : 29125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann prefix = "DEBUG2"; 29225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann break; 29325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 29425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann case _CUPS_FILE_CHECK_MISSING : 29525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann case _CUPS_FILE_CHECK_WRONG_TYPE : 29625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann prefix = "ERROR"; 29725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fputs("STATE: +cups-missing-filter-warning\n", stderr); 29825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann break; 29925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 30025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann case _CUPS_FILE_CHECK_PERMISSIONS : 30125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann case _CUPS_FILE_CHECK_RELATIVE_PATH : 30225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann prefix = "ERROR"; 30325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fputs("STATE: +cups-insecure-filter-warning\n", stderr); 30425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann break; 30525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 30625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 30725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fprintf(stderr, "%s: %s\n", prefix, message); 30825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann} 30925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#endif /* !WIN32 */ 31025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 31125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 31225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/* 31325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 'cupsFileClose()' - Close a CUPS file. 31425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 31525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * @since CUPS 1.2/macOS 10.5@ 31625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 31725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 31825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannint /* O - 0 on success, -1 on error */ 31925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. MoltmanncupsFileClose(cups_file_t *fp) /* I - CUPS file */ 32025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann{ 32125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann int fd; /* File descriptor */ 32225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann char mode; /* Open mode */ 32325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann int status; /* Return status */ 32425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann int is_stdio; /* Is a stdio file? */ 32525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 32625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 32725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann DEBUG_printf(("cupsFileClose(fp=%p)", (void *)fp)); 32825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 32925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 33025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Range check... 33125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 33225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 33325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (!fp) 33425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (-1); 33525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 33625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 33725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Flush pending write data... 33825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 33925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 34025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (fp->mode == 'w') 34125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann status = cupsFileFlush(fp); 34225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else 34325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann status = 0; 34425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 34525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#ifdef HAVE_LIBZ 34625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (fp->compressed && status >= 0) 34725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 34825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (fp->mode == 'r') 34925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 35025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 35125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Free decompression data... 35225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 35325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 35425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann inflateEnd(&fp->stream); 35525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 35625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else 35725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 35825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 35925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Flush any remaining compressed data... 36025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 36125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 36225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann unsigned char trailer[8]; /* Trailer CRC and length */ 36325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann int done; /* Done writing... */ 36425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 36525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 36625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fp->stream.avail_in = 0; 36725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 36825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann for (done = 0;;) 36925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 37025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (fp->stream.next_out > fp->cbuf) 37125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 37225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (cups_write(fp, (char *)fp->cbuf, 37325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann (size_t)(fp->stream.next_out - fp->cbuf)) < 0) 37425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann status = -1; 37525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 37625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fp->stream.next_out = fp->cbuf; 37725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fp->stream.avail_out = sizeof(fp->cbuf); 37825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 37925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 38025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (done || status < 0) 38125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann break; 38225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 38325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann done = deflate(&fp->stream, Z_FINISH) == Z_STREAM_END && 38425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fp->stream.next_out == fp->cbuf; 38525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 38625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 38725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 38825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Write the CRC and length... 38925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 39025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 39125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann trailer[0] = (unsigned char)fp->crc; 39225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann trailer[1] = (unsigned char)(fp->crc >> 8); 39325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann trailer[2] = (unsigned char)(fp->crc >> 16); 39425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann trailer[3] = (unsigned char)(fp->crc >> 24); 39525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann trailer[4] = (unsigned char)fp->pos; 39625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann trailer[5] = (unsigned char)(fp->pos >> 8); 39725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann trailer[6] = (unsigned char)(fp->pos >> 16); 39825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann trailer[7] = (unsigned char)(fp->pos >> 24); 39925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 40025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (cups_write(fp, (char *)trailer, 8) < 0) 40125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann status = -1; 40225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 40325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 40425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Free all memory used by the compression stream... 40525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 40625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 40725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann deflateEnd(&(fp->stream)); 40825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 40925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 41025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#endif /* HAVE_LIBZ */ 41125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 41225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 41325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Save the file descriptor we used and free memory... 41425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 41525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 41625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fd = fp->fd; 41725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann mode = fp->mode; 41825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann is_stdio = fp->is_stdio; 41925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 42025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (fp->printf_buffer) 42125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann free(fp->printf_buffer); 42225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 42325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann free(fp); 42425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 42525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 42625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Close the file, returning the close status... 42725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 42825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 42925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (mode == 's') 43025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 43125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (httpAddrClose(NULL, fd) < 0) 43225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann status = -1; 43325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 43425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else if (!is_stdio) 43525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 43625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (close(fd) < 0) 43725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann status = -1; 43825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 43925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 44025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (status); 44125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann} 44225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 44325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 44425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/* 44525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 'cupsFileCompression()' - Return whether a file is compressed. 44625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 44725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * @since CUPS 1.2/macOS 10.5@ 44825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 44925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 45025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannint /* O - @code CUPS_FILE_NONE@ or @code CUPS_FILE_GZIP@ */ 45125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. MoltmanncupsFileCompression(cups_file_t *fp) /* I - CUPS file */ 45225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann{ 45325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (fp ? fp->compressed : CUPS_FILE_NONE); 45425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann} 45525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 45625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 45725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/* 45825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 'cupsFileEOF()' - Return the end-of-file status. 45925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 46025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * @since CUPS 1.2/macOS 10.5@ 46125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 46225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 46325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannint /* O - 1 on end of file, 0 otherwise */ 46425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. MoltmanncupsFileEOF(cups_file_t *fp) /* I - CUPS file */ 46525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann{ 46625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (fp ? fp->eof : 1); 46725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann} 46825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 46925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 47025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/* 47125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 'cupsFileFind()' - Find a file using the specified path. 47225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 47325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * This function allows the paths in the path string to be separated by 47425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * colons (UNIX standard) or semicolons (Windows standard) and stores the 47525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * result in the buffer supplied. If the file cannot be found in any of 47625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * the supplied paths, @code NULL@ is returned. A @code NULL@ path only 47725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * matches the current directory. 47825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 47925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * @since CUPS 1.2/macOS 10.5@ 48025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 48125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 48225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannconst char * /* O - Full path to file or @code NULL@ if not found */ 48325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. MoltmanncupsFileFind(const char *filename, /* I - File to find */ 48425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann const char *path, /* I - Colon/semicolon-separated path */ 48525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann int executable, /* I - 1 = executable files, 0 = any file/dir */ 48625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann char *buffer, /* I - Filename buffer */ 48725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann int bufsize) /* I - Size of filename buffer */ 48825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann{ 48925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann char *bufptr, /* Current position in buffer */ 49025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *bufend; /* End of buffer */ 49125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 49225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 49325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 49425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Range check input... 49525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 49625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 49725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann DEBUG_printf(("cupsFileFind(filename=\"%s\", path=\"%s\", executable=%d, buffer=%p, bufsize=%d)", filename, path, executable, (void *)buffer, bufsize)); 49825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 49925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (!filename || !buffer || bufsize < 2) 50025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (NULL); 50125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 50225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (!path) 50325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 50425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 50525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * No path, so check current directory... 50625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 50725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 50825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (!access(filename, 0)) 50925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 51025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann strlcpy(buffer, filename, (size_t)bufsize); 51125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (buffer); 51225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 51325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else 51425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (NULL); 51525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 51625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 51725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 51825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Now check each path and return the first match... 51925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 52025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 52125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann bufend = buffer + bufsize - 1; 52225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann bufptr = buffer; 52325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 52425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann while (*path) 52525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 52625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#ifdef WIN32 52725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (*path == ';' || (*path == ':' && ((bufptr - buffer) > 1 || !isalpha(buffer[0] & 255)))) 52825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#else 52925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (*path == ';' || *path == ':') 53025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#endif /* WIN32 */ 53125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 53225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (bufptr > buffer && bufptr[-1] != '/' && bufptr < bufend) 53325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *bufptr++ = '/'; 53425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 53525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann strlcpy(bufptr, filename, (size_t)(bufend - bufptr)); 53625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 53725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#ifdef WIN32 53825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (!access(buffer, 0)) 53925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#else 54025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (!access(buffer, executable ? X_OK : 0)) 54125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#endif /* WIN32 */ 54225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 54325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann DEBUG_printf(("1cupsFileFind: Returning \"%s\"", buffer)); 54425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (buffer); 54525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 54625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 54725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann bufptr = buffer; 54825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 54925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else if (bufptr < bufend) 55025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *bufptr++ = *path; 55125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 55225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann path ++; 55325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 55425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 55525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 55625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Check the last path... 55725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 55825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 55925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (bufptr > buffer && bufptr[-1] != '/' && bufptr < bufend) 56025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *bufptr++ = '/'; 56125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 56225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann strlcpy(bufptr, filename, (size_t)(bufend - bufptr)); 56325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 56425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (!access(buffer, 0)) 56525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 56625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann DEBUG_printf(("1cupsFileFind: Returning \"%s\"", buffer)); 56725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (buffer); 56825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 56925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else 57025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 57125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann DEBUG_puts("1cupsFileFind: Returning NULL"); 57225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (NULL); 57325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 57425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann} 57525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 57625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 57725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/* 57825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 'cupsFileFlush()' - Flush pending output. 57925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 58025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * @since CUPS 1.2/macOS 10.5@ 58125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 58225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 58325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannint /* O - 0 on success, -1 on error */ 58425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. MoltmanncupsFileFlush(cups_file_t *fp) /* I - CUPS file */ 58525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann{ 58625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann ssize_t bytes; /* Bytes to write */ 58725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 58825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 58925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann DEBUG_printf(("cupsFileFlush(fp=%p)", (void *)fp)); 59025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 59125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 59225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Range check input... 59325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 59425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 59525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (!fp || fp->mode != 'w') 59625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 59725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann DEBUG_puts("1cupsFileFlush: Attempt to flush a read-only file..."); 59825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (-1); 59925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 60025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 60125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann bytes = (ssize_t)(fp->ptr - fp->buf); 60225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 60325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann DEBUG_printf(("2cupsFileFlush: Flushing " CUPS_LLFMT " bytes...", 60425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann CUPS_LLCAST bytes)); 60525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 60625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (bytes > 0) 60725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 60825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#ifdef HAVE_LIBZ 60925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (fp->compressed) 61025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann bytes = cups_compress(fp, fp->buf, (size_t)bytes); 61125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else 61225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#endif /* HAVE_LIBZ */ 61325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann bytes = cups_write(fp, fp->buf, (size_t)bytes); 61425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 61525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (bytes < 0) 61625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (-1); 61725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 61825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fp->ptr = fp->buf; 61925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 62025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 62125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (0); 62225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann} 62325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 62425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 62525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/* 62625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 'cupsFileGetChar()' - Get a single character from a file. 62725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 62825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * @since CUPS 1.2/macOS 10.5@ 62925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 63025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 63125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannint /* O - Character or -1 on end of file */ 63225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. MoltmanncupsFileGetChar(cups_file_t *fp) /* I - CUPS file */ 63325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann{ 63425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 63525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Range check input... 63625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 63725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 63825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann DEBUG_printf(("4cupsFileGetChar(fp=%p)", (void *)fp)); 63925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 64025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (!fp || (fp->mode != 'r' && fp->mode != 's')) 64125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 64225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann DEBUG_puts("5cupsFileGetChar: Bad arguments!"); 64325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (-1); 64425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 64525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 64625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 64725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * If the input buffer is empty, try to read more data... 64825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 64925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 65025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann DEBUG_printf(("5cupsFileGetChar: fp->eof=%d, fp->ptr=%p, fp->end=%p", fp->eof, (void *)fp->ptr, (void *)fp->end)); 65125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 65225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (fp->ptr >= fp->end) 65325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (cups_fill(fp) <= 0) 65425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 65525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann DEBUG_puts("5cupsFileGetChar: Unable to fill buffer!"); 65625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (-1); 65725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 65825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 65925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 66025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Return the next character in the buffer... 66125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 66225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 66325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann DEBUG_printf(("5cupsFileGetChar: Returning %d...", *(fp->ptr) & 255)); 66425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 66525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fp->pos ++; 66625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 66725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann DEBUG_printf(("6cupsFileGetChar: pos=" CUPS_LLFMT, CUPS_LLCAST fp->pos)); 66825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 66925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (*(fp->ptr)++ & 255); 67025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann} 67125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 67225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 67325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/* 67425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 'cupsFileGetConf()' - Get a line from a configuration file. 67525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 67625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * @since CUPS 1.2/macOS 10.5@ 67725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 67825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 67925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannchar * /* O - Line read or @code NULL@ on end of file or error */ 68025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. MoltmanncupsFileGetConf(cups_file_t *fp, /* I - CUPS file */ 68125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann char *buf, /* O - String buffer */ 68225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann size_t buflen, /* I - Size of string buffer */ 68325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann char **value, /* O - Pointer to value */ 68425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann int *linenum) /* IO - Current line number */ 68525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann{ 68625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann char *ptr; /* Pointer into line */ 68725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 68825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 68925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 69025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Range check input... 69125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 69225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 69325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann DEBUG_printf(("2cupsFileGetConf(fp=%p, buf=%p, buflen=" CUPS_LLFMT 69425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann ", value=%p, linenum=%p)", (void *)fp, (void *)buf, CUPS_LLCAST buflen, (void *)value, (void *)linenum)); 69525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 69625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (!fp || (fp->mode != 'r' && fp->mode != 's') || 69725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann !buf || buflen < 2 || !value) 69825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 69925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (value) 70025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *value = NULL; 70125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 70225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (NULL); 70325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 70425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 70525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 70625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Read the next non-comment line... 70725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 70825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 70925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *value = NULL; 71025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 71125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann while (cupsFileGets(fp, buf, buflen)) 71225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 71325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann (*linenum) ++; 71425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 71525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 71625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Strip any comments... 71725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 71825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 71925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if ((ptr = strchr(buf, '#')) != NULL) 72025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 72125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (ptr > buf && ptr[-1] == '\\') 72225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 72325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann // Unquote the #... 72425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann _cups_strcpy(ptr - 1, ptr); 72525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 72625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else 72725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 72825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann // Strip the comment and any trailing whitespace... 72925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann while (ptr > buf) 73025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 73125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (!_cups_isspace(ptr[-1])) 73225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann break; 73325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 73425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann ptr --; 73525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 73625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 73725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *ptr = '\0'; 73825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 73925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 74025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 74125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 74225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Strip leading whitespace... 74325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 74425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 74525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann for (ptr = buf; _cups_isspace(*ptr); ptr ++); 74625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 74725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (ptr > buf) 74825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann _cups_strcpy(buf, ptr); 74925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 75025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 75125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * See if there is anything left... 75225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 75325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 75425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (buf[0]) 75525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 75625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 75725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Yes, grab any value and return... 75825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 75925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 76025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann for (ptr = buf; *ptr; ptr ++) 76125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (_cups_isspace(*ptr)) 76225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann break; 76325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 76425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (*ptr) 76525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 76625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 76725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Have a value, skip any other spaces... 76825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 76925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 77025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann while (_cups_isspace(*ptr)) 77125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *ptr++ = '\0'; 77225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 77325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (*ptr) 77425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *value = ptr; 77525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 77625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 77725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Strip trailing whitespace and > for lines that begin with <... 77825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 77925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 78025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann ptr += strlen(ptr) - 1; 78125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 78225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (buf[0] == '<' && *ptr == '>') 78325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *ptr-- = '\0'; 78425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else if (buf[0] == '<' && *ptr != '>') 78525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 78625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 78725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Syntax error... 78825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 78925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 79025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *value = NULL; 79125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (buf); 79225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 79325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 79425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann while (ptr > *value && _cups_isspace(*ptr)) 79525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *ptr-- = '\0'; 79625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 79725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 79825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 79925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Return the line... 80025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 80125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 80225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (buf); 80325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 80425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 80525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 80625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (NULL); 80725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann} 80825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 80925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 81025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/* 81125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 'cupsFileGetLine()' - Get a CR and/or LF-terminated line that may 81225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * contain binary data. 81325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 81425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * This function differs from @link cupsFileGets@ in that the trailing CR 81525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * and LF are preserved, as is any binary data on the line. The buffer is 81625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * nul-terminated, however you should use the returned length to determine 81725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * the number of bytes on the line. 81825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 81925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * @since CUPS 1.2/macOS 10.5@ 82025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 82125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 82225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannsize_t /* O - Number of bytes on line or 0 on end of file */ 82325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. MoltmanncupsFileGetLine(cups_file_t *fp, /* I - File to read from */ 82425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann char *buf, /* I - Buffer */ 82525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann size_t buflen) /* I - Size of buffer */ 82625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann{ 82725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann int ch; /* Character from file */ 82825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann char *ptr, /* Current position in line buffer */ 82925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *end; /* End of line buffer */ 83025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 83125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 83225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 83325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Range check input... 83425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 83525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 83625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann DEBUG_printf(("2cupsFileGetLine(fp=%p, buf=%p, buflen=" CUPS_LLFMT ")", (void *)fp, (void *)buf, CUPS_LLCAST buflen)); 83725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 83825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (!fp || (fp->mode != 'r' && fp->mode != 's') || !buf || buflen < 3) 83925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (0); 84025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 84125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 84225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Now loop until we have a valid line... 84325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 84425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 84525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann for (ptr = buf, end = buf + buflen - 2; ptr < end ;) 84625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 84725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (fp->ptr >= fp->end) 84825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (cups_fill(fp) <= 0) 84925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann break; 85025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 85125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *ptr++ = ch = *(fp->ptr)++; 85225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fp->pos ++; 85325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 85425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (ch == '\r') 85525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 85625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 85725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Check for CR LF... 85825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 85925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 86025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (fp->ptr >= fp->end) 86125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (cups_fill(fp) <= 0) 86225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann break; 86325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 86425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (*(fp->ptr) == '\n') 86525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 86625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *ptr++ = *(fp->ptr)++; 86725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fp->pos ++; 86825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 86925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 87025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann break; 87125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 87225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else if (ch == '\n') 87325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 87425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 87525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Line feed ends a line... 87625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 87725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 87825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann break; 87925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 88025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 88125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 88225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *ptr = '\0'; 88325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 88425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann DEBUG_printf(("4cupsFileGetLine: pos=" CUPS_LLFMT, CUPS_LLCAST fp->pos)); 88525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 88625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return ((size_t)(ptr - buf)); 88725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann} 88825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 88925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 89025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/* 89125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 'cupsFileGets()' - Get a CR and/or LF-terminated line. 89225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 89325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * @since CUPS 1.2/macOS 10.5@ 89425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 89525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 89625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannchar * /* O - Line read or @code NULL@ on end of file or error */ 89725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. MoltmanncupsFileGets(cups_file_t *fp, /* I - CUPS file */ 89825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann char *buf, /* O - String buffer */ 89925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann size_t buflen) /* I - Size of string buffer */ 90025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann{ 90125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann int ch; /* Character from file */ 90225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann char *ptr, /* Current position in line buffer */ 90325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *end; /* End of line buffer */ 90425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 90525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 90625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 90725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Range check input... 90825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 90925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 91025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann DEBUG_printf(("2cupsFileGets(fp=%p, buf=%p, buflen=" CUPS_LLFMT ")", (void *)fp, (void *)buf, CUPS_LLCAST buflen)); 91125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 91225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (!fp || (fp->mode != 'r' && fp->mode != 's') || !buf || buflen < 2) 91325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (NULL); 91425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 91525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 91625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Now loop until we have a valid line... 91725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 91825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 91925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann for (ptr = buf, end = buf + buflen - 1; ptr < end ;) 92025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 92125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (fp->ptr >= fp->end) 92225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (cups_fill(fp) <= 0) 92325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 92425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (ptr == buf) 92525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (NULL); 92625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else 92725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann break; 92825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 92925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 93025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann ch = *(fp->ptr)++; 93125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fp->pos ++; 93225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 93325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (ch == '\r') 93425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 93525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 93625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Check for CR LF... 93725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 93825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 93925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (fp->ptr >= fp->end) 94025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (cups_fill(fp) <= 0) 94125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann break; 94225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 94325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (*(fp->ptr) == '\n') 94425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 94525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fp->ptr ++; 94625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fp->pos ++; 94725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 94825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 94925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann break; 95025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 95125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else if (ch == '\n') 95225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 95325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 95425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Line feed ends a line... 95525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 95625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 95725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann break; 95825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 95925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else 96025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *ptr++ = (char)ch; 96125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 96225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 96325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *ptr = '\0'; 96425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 96525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann DEBUG_printf(("4cupsFileGets: pos=" CUPS_LLFMT, CUPS_LLCAST fp->pos)); 96625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 96725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (buf); 96825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann} 96925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 97025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 97125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/* 97225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 'cupsFileLock()' - Temporarily lock access to a file. 97325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 97425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * @since CUPS 1.2/macOS 10.5@ 97525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 97625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 97725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannint /* O - 0 on success, -1 on error */ 97825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. MoltmanncupsFileLock(cups_file_t *fp, /* I - CUPS file */ 97925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann int block) /* I - 1 to wait for the lock, 0 to fail right away */ 98025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann{ 98125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 98225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Range check... 98325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 98425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 98525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (!fp || fp->mode == 's') 98625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (-1); 98725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 98825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 98925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Try the lock... 99025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 99125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 99225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#ifdef WIN32 99325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (_locking(fp->fd, block ? _LK_LOCK : _LK_NBLCK, 0)); 99425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#else 99525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (lockf(fp->fd, block ? F_LOCK : F_TLOCK, 0)); 99625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#endif /* WIN32 */ 99725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann} 99825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 99925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 100025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/* 100125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 'cupsFileNumber()' - Return the file descriptor associated with a CUPS file. 100225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 100325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * @since CUPS 1.2/macOS 10.5@ 100425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 100525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 100625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannint /* O - File descriptor */ 100725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. MoltmanncupsFileNumber(cups_file_t *fp) /* I - CUPS file */ 100825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann{ 100925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (fp) 101025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (fp->fd); 101125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else 101225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (-1); 101325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann} 101425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 101525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 101625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/* 101725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 'cupsFileOpen()' - Open a CUPS file. 101825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 101925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * The "mode" parameter can be "r" to read, "w" to write, overwriting any 102025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * existing file, "a" to append to an existing file or create a new file, 102125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * or "s" to open a socket connection. 102225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 102325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * When opening for writing ("w"), an optional number from 1 to 9 can be 102425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * supplied which enables Flate compression of the file. Compression is 102525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * not supported for the "a" (append) mode. 102625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 102725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * When opening a socket connection, the filename is a string of the form 102825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * "address:port" or "hostname:port". The socket will make an IPv4 or IPv6 102925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * connection as needed, generally preferring IPv6 connections when there is 103025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * a choice. 103125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 103225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * @since CUPS 1.2/macOS 10.5@ 103325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 103425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 103525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmanncups_file_t * /* O - CUPS file or @code NULL@ if the file or socket cannot be opened */ 103625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. MoltmanncupsFileOpen(const char *filename, /* I - Name of file */ 103725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann const char *mode) /* I - Open mode */ 103825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann{ 103925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann cups_file_t *fp; /* New CUPS file */ 104025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann int fd; /* File descriptor */ 104125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann char hostname[1024], /* Hostname */ 104225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *portname; /* Port "name" (number or service) */ 104325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann http_addrlist_t *addrlist; /* Host address list */ 104425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 104525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 104625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann DEBUG_printf(("cupsFileOpen(filename=\"%s\", mode=\"%s\")", filename, 104725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann mode)); 104825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 104925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 105025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Range check input... 105125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 105225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 105325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (!filename || !mode || 105425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann (*mode != 'r' && *mode != 'w' && *mode != 'a' && *mode != 's') || 105525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann (*mode == 'a' && isdigit(mode[1] & 255))) 105625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (NULL); 105725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 105825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 105925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Open the file... 106025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 106125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 106225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann switch (*mode) 106325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 106425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann case 'a' : /* Append file */ 106525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fd = cups_open(filename, 106625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann O_RDWR | O_CREAT | O_APPEND | O_LARGEFILE | O_BINARY); 106725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann break; 106825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 106925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann case 'r' : /* Read file */ 107025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fd = open(filename, O_RDONLY | O_LARGEFILE | O_BINARY, 0); 107125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann break; 107225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 107325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann case 'w' : /* Write file */ 107425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fd = cups_open(filename, O_WRONLY | O_LARGEFILE | O_BINARY); 107525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (fd < 0 && errno == ENOENT) 107625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 107725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fd = cups_open(filename, 107825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann O_WRONLY | O_CREAT | O_EXCL | O_LARGEFILE | O_BINARY); 107925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (fd < 0 && errno == EEXIST) 108025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fd = cups_open(filename, O_WRONLY | O_LARGEFILE | O_BINARY); 108125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 108225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 108325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (fd >= 0) 108425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#ifdef WIN32 108525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann _chsize(fd, 0); 108625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#else 108725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann ftruncate(fd, 0); 108825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#endif /* WIN32 */ 108925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann break; 109025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 109125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann case 's' : /* Read/write socket */ 109225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann strlcpy(hostname, filename, sizeof(hostname)); 109325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if ((portname = strrchr(hostname, ':')) != NULL) 109425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *portname++ = '\0'; 109525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else 109625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (NULL); 109725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 109825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 109925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Lookup the hostname and service... 110025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 110125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 110225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if ((addrlist = httpAddrGetList(hostname, AF_UNSPEC, portname)) == NULL) 110325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (NULL); 110425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 110525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 110625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Connect to the server... 110725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 110825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 110925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (!httpAddrConnect(addrlist, &fd)) 111025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 111125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann httpAddrFreeList(addrlist); 111225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (NULL); 111325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 111425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 111525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann httpAddrFreeList(addrlist); 111625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann break; 111725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 111825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann default : /* Remove bogus compiler warning... */ 111925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (NULL); 112025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 112125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 112225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (fd < 0) 112325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (NULL); 112425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 112525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 112625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Create the CUPS file structure... 112725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 112825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 112925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if ((fp = cupsFileOpenFd(fd, mode)) == NULL) 113025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 113125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (*mode == 's') 113225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann httpAddrClose(NULL, fd); 113325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else 113425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann close(fd); 113525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 113625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 113725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 113825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Return it... 113925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 114025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 114125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (fp); 114225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann} 114325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 114425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/* 114525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 'cupsFileOpenFd()' - Open a CUPS file using a file descriptor. 114625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 114725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * The "mode" parameter can be "r" to read, "w" to write, "a" to append, 114825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * or "s" to treat the file descriptor as a bidirectional socket connection. 114925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 115025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * When opening for writing ("w"), an optional number from 1 to 9 can be 115125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * supplied which enables Flate compression of the file. Compression is 115225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * not supported for the "a" (append) mode. 115325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 115425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * @since CUPS 1.2/macOS 10.5@ 115525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 115625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 115725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmanncups_file_t * /* O - CUPS file or @code NULL@ if the file could not be opened */ 115825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. MoltmanncupsFileOpenFd(int fd, /* I - File descriptor */ 115925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann const char *mode) /* I - Open mode */ 116025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann{ 116125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann cups_file_t *fp; /* New CUPS file */ 116225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 116325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 116425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann DEBUG_printf(("cupsFileOpenFd(fd=%d, mode=\"%s\")", fd, mode)); 116525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 116625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 116725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Range check input... 116825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 116925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 117025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (fd < 0 || !mode || 117125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann (*mode != 'r' && *mode != 'w' && *mode != 'a' && *mode != 's') || 117225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann (*mode == 'a' && isdigit(mode[1] & 255))) 117325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (NULL); 117425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 117525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 117625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Allocate memory... 117725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 117825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 117925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if ((fp = calloc(1, sizeof(cups_file_t))) == NULL) 118025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (NULL); 118125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 118225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 118325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Open the file... 118425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 118525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 118625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fp->fd = fd; 118725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 118825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann switch (*mode) 118925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 119025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann case 'a' : 119125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fp->pos = lseek(fd, 0, SEEK_END); 119225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 119325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann case 'w' : 119425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fp->mode = 'w'; 119525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fp->ptr = fp->buf; 119625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fp->end = fp->buf + sizeof(fp->buf); 119725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 119825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#ifdef HAVE_LIBZ 119925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (mode[1] >= '1' && mode[1] <= '9') 120025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 120125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 120225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Open a compressed stream, so write the standard gzip file 120325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * header... 120425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 120525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 120625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann unsigned char header[10]; /* gzip file header */ 120725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann time_t curtime; /* Current time */ 120825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 120925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 121025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann curtime = time(NULL); 121125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann header[0] = 0x1f; 121225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann header[1] = 0x8b; 121325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann header[2] = Z_DEFLATED; 121425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann header[3] = 0; 121525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann header[4] = (unsigned char)curtime; 121625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann header[5] = (unsigned char)(curtime >> 8); 121725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann header[6] = (unsigned char)(curtime >> 16); 121825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann header[7] = (unsigned char)(curtime >> 24); 121925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann header[8] = 0; 122025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann header[9] = 0x03; 122125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 122225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann cups_write(fp, (char *)header, 10); 122325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 122425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 122525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Initialize the compressor... 122625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 122725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 122825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann deflateInit2(&(fp->stream), mode[1] - '0', Z_DEFLATED, -15, 8, 122925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann Z_DEFAULT_STRATEGY); 123025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 123125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fp->stream.next_out = fp->cbuf; 123225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fp->stream.avail_out = sizeof(fp->cbuf); 123325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fp->compressed = 1; 123425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fp->crc = crc32(0L, Z_NULL, 0); 123525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 123625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#endif /* HAVE_LIBZ */ 123725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann break; 123825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 123925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann case 'r' : 124025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fp->mode = 'r'; 124125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann break; 124225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 124325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann case 's' : 124425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fp->mode = 's'; 124525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann break; 124625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 124725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann default : /* Remove bogus compiler warning... */ 124825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (NULL); 124925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 125025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 125125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 125225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Don't pass this file to child processes... 125325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 125425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 125525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#ifndef WIN32 125625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fcntl(fp->fd, F_SETFD, fcntl(fp->fd, F_GETFD) | FD_CLOEXEC); 125725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#endif /* !WIN32 */ 125825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 125925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (fp); 126025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann} 126125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 126225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 126325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/* 126425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 'cupsFilePeekChar()' - Peek at the next character from a file. 126525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 126625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * @since CUPS 1.2/macOS 10.5@ 126725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 126825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 126925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannint /* O - Character or -1 on end of file */ 127025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. MoltmanncupsFilePeekChar(cups_file_t *fp) /* I - CUPS file */ 127125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann{ 127225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 127325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Range check input... 127425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 127525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 127625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (!fp || (fp->mode != 'r' && fp->mode != 's')) 127725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (-1); 127825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 127925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 128025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * If the input buffer is empty, try to read more data... 128125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 128225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 128325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (fp->ptr >= fp->end) 128425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (cups_fill(fp) <= 0) 128525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (-1); 128625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 128725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 128825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Return the next character in the buffer... 128925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 129025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 129125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (*(fp->ptr) & 255); 129225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann} 129325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 129425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 129525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/* 129625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 'cupsFilePrintf()' - Write a formatted string. 129725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 129825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * @since CUPS 1.2/macOS 10.5@ 129925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 130025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 130125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannint /* O - Number of bytes written or -1 on error */ 130225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. MoltmanncupsFilePrintf(cups_file_t *fp, /* I - CUPS file */ 130325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann const char *format, /* I - Printf-style format string */ 130425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann ...) /* I - Additional args as necessary */ 130525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann{ 130625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann va_list ap; /* Argument list */ 130725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann ssize_t bytes; /* Formatted size */ 130825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 130925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 131025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann DEBUG_printf(("2cupsFilePrintf(fp=%p, format=\"%s\", ...)", (void *)fp, format)); 131125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 131225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (!fp || !format || (fp->mode != 'w' && fp->mode != 's')) 131325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (-1); 131425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 131525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (!fp->printf_buffer) 131625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 131725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 131825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Start with an 1k printf buffer... 131925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 132025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 132125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if ((fp->printf_buffer = malloc(1024)) == NULL) 132225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (-1); 132325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 132425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fp->printf_size = 1024; 132525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 132625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 132725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann va_start(ap, format); 132825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann bytes = vsnprintf(fp->printf_buffer, fp->printf_size, format, ap); 132925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann va_end(ap); 133025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 133125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (bytes >= (ssize_t)fp->printf_size) 133225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 133325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 133425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Expand the printf buffer... 133525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 133625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 133725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann char *temp; /* Temporary buffer pointer */ 133825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 133925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 134025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (bytes > 65535) 134125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (-1); 134225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 134325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if ((temp = realloc(fp->printf_buffer, (size_t)(bytes + 1))) == NULL) 134425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (-1); 134525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 134625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fp->printf_buffer = temp; 134725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fp->printf_size = (size_t)(bytes + 1); 134825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 134925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann va_start(ap, format); 135025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann bytes = vsnprintf(fp->printf_buffer, fp->printf_size, format, ap); 135125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann va_end(ap); 135225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 135325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 135425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (fp->mode == 's') 135525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 135625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (cups_write(fp, fp->printf_buffer, (size_t)bytes) < 0) 135725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (-1); 135825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 135925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fp->pos += bytes; 136025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 136125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann DEBUG_printf(("4cupsFilePrintf: pos=" CUPS_LLFMT, CUPS_LLCAST fp->pos)); 136225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 136325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return ((int)bytes); 136425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 136525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 136625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if ((fp->ptr + bytes) > fp->end) 136725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (cupsFileFlush(fp)) 136825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (-1); 136925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 137025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fp->pos += bytes; 137125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 137225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann DEBUG_printf(("4cupsFilePrintf: pos=" CUPS_LLFMT, CUPS_LLCAST fp->pos)); 137325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 137425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if ((size_t)bytes > sizeof(fp->buf)) 137525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 137625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#ifdef HAVE_LIBZ 137725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (fp->compressed) 137825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return ((int)cups_compress(fp, fp->printf_buffer, (size_t)bytes)); 137925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else 138025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#endif /* HAVE_LIBZ */ 138125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return ((int)cups_write(fp, fp->printf_buffer, (size_t)bytes)); 138225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 138325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else 138425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 138525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann memcpy(fp->ptr, fp->printf_buffer, (size_t)bytes); 138625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fp->ptr += bytes; 138725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return ((int)bytes); 138825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 138925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann} 139025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 139125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 139225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/* 139325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 'cupsFilePutChar()' - Write a character. 139425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 139525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * @since CUPS 1.2/macOS 10.5@ 139625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 139725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 139825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannint /* O - 0 on success, -1 on error */ 139925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. MoltmanncupsFilePutChar(cups_file_t *fp, /* I - CUPS file */ 140025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann int c) /* I - Character to write */ 140125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann{ 140225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 140325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Range check input... 140425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 140525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 140625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (!fp || (fp->mode != 'w' && fp->mode != 's')) 140725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (-1); 140825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 140925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (fp->mode == 's') 141025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 141125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 141225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Send character immediately over socket... 141325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 141425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 141525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann char ch; /* Output character */ 141625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 141725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 141825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann ch = (char)c; 141925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 142025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (send(fp->fd, &ch, 1, 0) < 1) 142125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (-1); 142225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 142325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else 142425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 142525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 142625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Buffer it up... 142725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 142825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 142925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (fp->ptr >= fp->end) 143025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (cupsFileFlush(fp)) 143125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (-1); 143225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 143325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *(fp->ptr) ++ = (char)c; 143425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 143525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 143625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fp->pos ++; 143725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 143825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann DEBUG_printf(("4cupsFilePutChar: pos=" CUPS_LLFMT, CUPS_LLCAST fp->pos)); 143925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 144025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (0); 144125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann} 144225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 144325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 144425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/* 144525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 'cupsFilePutConf()' - Write a configuration line. 144625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 144725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * This function handles any comment escaping of the value. 144825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 144925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * @since CUPS 1.4/macOS 10.6@ 145025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 145125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 145225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannssize_t /* O - Number of bytes written or -1 on error */ 145325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. MoltmanncupsFilePutConf(cups_file_t *fp, /* I - CUPS file */ 145425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann const char *directive, /* I - Directive */ 145525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann const char *value) /* I - Value */ 145625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann{ 145725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann ssize_t bytes, /* Number of bytes written */ 145825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann temp; /* Temporary byte count */ 145925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann const char *ptr; /* Pointer into value */ 146025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 146125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 146225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (!fp || !directive || !*directive) 146325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (-1); 146425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 146525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if ((bytes = cupsFilePuts(fp, directive)) < 0) 146625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (-1); 146725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 146825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (cupsFilePutChar(fp, ' ') < 0) 146925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (-1); 147025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann bytes ++; 147125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 147225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (value && *value) 147325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 147425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if ((ptr = strchr(value, '#')) != NULL) 147525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 147625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 147725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Need to quote the first # in the info string... 147825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 147925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 148025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if ((temp = cupsFileWrite(fp, value, (size_t)(ptr - value))) < 0) 148125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (-1); 148225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann bytes += temp; 148325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 148425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (cupsFilePutChar(fp, '\\') < 0) 148525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (-1); 148625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann bytes ++; 148725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 148825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if ((temp = cupsFilePuts(fp, ptr)) < 0) 148925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (-1); 149025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann bytes += temp; 149125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 149225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else if ((temp = cupsFilePuts(fp, value)) < 0) 149325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (-1); 149425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else 149525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann bytes += temp; 149625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 149725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 149825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (cupsFilePutChar(fp, '\n') < 0) 149925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (-1); 150025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else 150125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (bytes + 1); 150225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann} 150325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 150425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 150525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/* 150625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 'cupsFilePuts()' - Write a string. 150725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 150825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Like the @code fputs@ function, no newline is appended to the string. 150925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 151025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * @since CUPS 1.2/macOS 10.5@ 151125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 151225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 151325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannint /* O - Number of bytes written or -1 on error */ 151425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. MoltmanncupsFilePuts(cups_file_t *fp, /* I - CUPS file */ 151525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann const char *s) /* I - String to write */ 151625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann{ 151725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann ssize_t bytes; /* Bytes to write */ 151825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 151925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 152025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 152125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Range check input... 152225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 152325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 152425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (!fp || !s || (fp->mode != 'w' && fp->mode != 's')) 152525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (-1); 152625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 152725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 152825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Write the string... 152925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 153025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 153125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann bytes = (ssize_t)strlen(s); 153225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 153325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (fp->mode == 's') 153425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 153525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (cups_write(fp, s, (size_t)bytes) < 0) 153625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (-1); 153725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 153825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fp->pos += bytes; 153925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 154025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann DEBUG_printf(("4cupsFilePuts: pos=" CUPS_LLFMT, CUPS_LLCAST fp->pos)); 154125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 154225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return ((int)bytes); 154325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 154425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 154525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if ((fp->ptr + bytes) > fp->end) 154625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (cupsFileFlush(fp)) 154725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (-1); 154825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 154925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fp->pos += bytes; 155025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 155125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann DEBUG_printf(("4cupsFilePuts: pos=" CUPS_LLFMT, CUPS_LLCAST fp->pos)); 155225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 155325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if ((size_t)bytes > sizeof(fp->buf)) 155425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 155525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#ifdef HAVE_LIBZ 155625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (fp->compressed) 155725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return ((int)cups_compress(fp, s, (size_t)bytes)); 155825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else 155925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#endif /* HAVE_LIBZ */ 156025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return ((int)cups_write(fp, s, (size_t)bytes)); 156125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 156225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else 156325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 156425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann memcpy(fp->ptr, s, (size_t)bytes); 156525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fp->ptr += bytes; 156625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return ((int)bytes); 156725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 156825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann} 156925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 157025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 157125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/* 157225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 'cupsFileRead()' - Read from a file. 157325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 157425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * @since CUPS 1.2/macOS 10.5@ 157525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 157625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 157725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannssize_t /* O - Number of bytes read or -1 on error */ 157825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. MoltmanncupsFileRead(cups_file_t *fp, /* I - CUPS file */ 157925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann char *buf, /* O - Buffer */ 158025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann size_t bytes) /* I - Number of bytes to read */ 158125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann{ 158225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann size_t total; /* Total bytes read */ 158325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann ssize_t count; /* Bytes read */ 158425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 158525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 158625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann DEBUG_printf(("2cupsFileRead(fp=%p, buf=%p, bytes=" CUPS_LLFMT ")", (void *)fp, (void *)buf, CUPS_LLCAST bytes)); 158725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 158825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 158925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Range check input... 159025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 159125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 159225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (!fp || !buf || (fp->mode != 'r' && fp->mode != 's')) 159325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (-1); 159425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 159525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (bytes == 0) 159625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (0); 159725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 159825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 159925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Loop until all bytes are read... 160025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 160125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 160225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann total = 0; 160325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann while (bytes > 0) 160425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 160525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (fp->ptr >= fp->end) 160625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (cups_fill(fp) <= 0) 160725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 160825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann DEBUG_printf(("4cupsFileRead: cups_fill() returned -1, total=" 160925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann CUPS_LLFMT, CUPS_LLCAST total)); 161025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 161125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (total > 0) 161225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return ((ssize_t)total); 161325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else 161425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (-1); 161525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 161625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 161725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann count = (ssize_t)(fp->end - fp->ptr); 161825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (count > (ssize_t)bytes) 161925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann count = (ssize_t)bytes; 162025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 162125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann memcpy(buf, fp->ptr,(size_t) count); 162225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fp->ptr += count; 162325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fp->pos += count; 162425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 162525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann DEBUG_printf(("4cupsFileRead: pos=" CUPS_LLFMT, CUPS_LLCAST fp->pos)); 162625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 162725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 162825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Update the counts for the last read... 162925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 163025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 163125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann bytes -= (size_t)count; 163225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann total += (size_t)count; 163325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann buf += count; 163425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 163525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 163625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 163725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Return the total number of bytes read... 163825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 163925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 164025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann DEBUG_printf(("3cupsFileRead: total=" CUPS_LLFMT, CUPS_LLCAST total)); 164125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 164225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return ((ssize_t)total); 164325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann} 164425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 164525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 164625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/* 164725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 'cupsFileRewind()' - Set the current file position to the beginning of the 164825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * file. 164925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 165025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * @since CUPS 1.2/macOS 10.5@ 165125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 165225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 165325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannoff_t /* O - New file position or -1 on error */ 165425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. MoltmanncupsFileRewind(cups_file_t *fp) /* I - CUPS file */ 165525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann{ 165625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 165725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Range check input... 165825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 165925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 166025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann DEBUG_printf(("cupsFileRewind(fp=%p)", (void *)fp)); 166125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann DEBUG_printf(("2cupsFileRewind: pos=" CUPS_LLFMT, CUPS_LLCAST fp->pos)); 166225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 166325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (!fp || fp->mode != 'r') 166425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (-1); 166525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 166625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 166725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Handle special cases... 166825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 166925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 167025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (fp->bufpos == 0) 167125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 167225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 167325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * No seeking necessary... 167425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 167525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 167625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fp->pos = 0; 167725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 167825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (fp->ptr) 167925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 168025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fp->ptr = fp->buf; 168125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fp->eof = 0; 168225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 168325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 168425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann DEBUG_printf(("2cupsFileRewind: pos=" CUPS_LLFMT, CUPS_LLCAST fp->pos)); 168525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 168625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (0); 168725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 168825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 168925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 169025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Otherwise, seek in the file and cleanup any compression buffers... 169125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 169225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 169325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#ifdef HAVE_LIBZ 169425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (fp->compressed) 169525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 169625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann inflateEnd(&fp->stream); 169725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fp->compressed = 0; 169825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 169925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#endif /* HAVE_LIBZ */ 170025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 170125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (lseek(fp->fd, 0, SEEK_SET)) 170225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 170325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann DEBUG_printf(("1cupsFileRewind: lseek failed: %s", strerror(errno))); 170425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (-1); 170525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 170625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 170725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fp->bufpos = 0; 170825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fp->pos = 0; 170925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fp->ptr = NULL; 171025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fp->end = NULL; 171125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fp->eof = 0; 171225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 171325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann DEBUG_printf(("2cupsFileRewind: pos=" CUPS_LLFMT, CUPS_LLCAST fp->pos)); 171425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 171525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (0); 171625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann} 171725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 171825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 171925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/* 172025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 'cupsFileSeek()' - Seek in a file. 172125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 172225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * @since CUPS 1.2/macOS 10.5@ 172325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 172425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 172525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannoff_t /* O - New file position or -1 on error */ 172625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. MoltmanncupsFileSeek(cups_file_t *fp, /* I - CUPS file */ 172725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann off_t pos) /* I - Position in file */ 172825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann{ 172925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann ssize_t bytes; /* Number bytes in buffer */ 173025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 173125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 173225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann DEBUG_printf(("cupsFileSeek(fp=%p, pos=" CUPS_LLFMT ")", (void *)fp, CUPS_LLCAST pos)); 173325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann DEBUG_printf(("2cupsFileSeek: fp->pos=" CUPS_LLFMT, CUPS_LLCAST fp->pos)); 173425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann DEBUG_printf(("2cupsFileSeek: fp->ptr=%p, fp->end=%p", (void *)fp->ptr, (void *)fp->end)); 173525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 173625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 173725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Range check input... 173825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 173925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 174025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (!fp || pos < 0 || fp->mode != 'r') 174125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (-1); 174225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 174325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 174425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Handle special cases... 174525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 174625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 174725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (pos == 0) 174825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (cupsFileRewind(fp)); 174925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 175025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (fp->ptr) 175125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 175225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann bytes = (ssize_t)(fp->end - fp->buf); 175325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 175425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann DEBUG_printf(("2cupsFileSeek: bytes=" CUPS_LLFMT, CUPS_LLCAST bytes)); 175525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 175625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (pos >= fp->bufpos && pos < (fp->bufpos + bytes)) 175725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 175825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 175925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * No seeking necessary... 176025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 176125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 176225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fp->pos = pos; 176325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fp->ptr = fp->buf + pos - fp->bufpos; 176425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fp->eof = 0; 176525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 176625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (pos); 176725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 176825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 176925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 177025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#ifdef HAVE_LIBZ 177125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (!fp->compressed && !fp->ptr) 177225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 177325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 177425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Preload a buffer to determine whether the file is compressed... 177525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 177625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 177725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (cups_fill(fp) <= 0) 177825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (-1); 177925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 178025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#endif /* HAVE_LIBZ */ 178125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 178225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 178325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Seek forwards or backwards... 178425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 178525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 178625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fp->eof = 0; 178725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 178825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (pos < fp->bufpos) 178925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 179025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 179125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Need to seek backwards... 179225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 179325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 179425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann DEBUG_puts("2cupsFileSeek: SEEK BACKWARDS"); 179525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 179625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#ifdef HAVE_LIBZ 179725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (fp->compressed) 179825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 179925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann inflateEnd(&fp->stream); 180025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 180125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann lseek(fp->fd, 0, SEEK_SET); 180225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fp->bufpos = 0; 180325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fp->pos = 0; 180425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fp->ptr = NULL; 180525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fp->end = NULL; 180625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 180725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann while ((bytes = cups_fill(fp)) > 0) 180825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (pos >= fp->bufpos && pos < (fp->bufpos + bytes)) 180925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann break; 181025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 181125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (bytes <= 0) 181225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (-1); 181325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 181425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fp->ptr = fp->buf + pos - fp->bufpos; 181525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fp->pos = pos; 181625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 181725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else 181825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#endif /* HAVE_LIBZ */ 181925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 182025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fp->bufpos = lseek(fp->fd, pos, SEEK_SET); 182125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fp->pos = fp->bufpos; 182225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fp->ptr = NULL; 182325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fp->end = NULL; 182425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 182525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann DEBUG_printf(("2cupsFileSeek: lseek() returned " CUPS_LLFMT, 182625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann CUPS_LLCAST fp->pos)); 182725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 182825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 182925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else 183025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 183125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 183225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Need to seek forwards... 183325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 183425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 183525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann DEBUG_puts("2cupsFileSeek: SEEK FORWARDS"); 183625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 183725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#ifdef HAVE_LIBZ 183825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (fp->compressed) 183925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 184025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann while ((bytes = cups_fill(fp)) > 0) 184125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 184225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (pos >= fp->bufpos && pos < (fp->bufpos + bytes)) 184325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann break; 184425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 184525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 184625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (bytes <= 0) 184725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (-1); 184825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 184925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fp->ptr = fp->buf + pos - fp->bufpos; 185025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fp->pos = pos; 185125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 185225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else 185325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#endif /* HAVE_LIBZ */ 185425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 185525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fp->bufpos = lseek(fp->fd, pos, SEEK_SET); 185625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fp->pos = fp->bufpos; 185725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fp->ptr = NULL; 185825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fp->end = NULL; 185925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 186025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann DEBUG_printf(("2cupsFileSeek: lseek() returned " CUPS_LLFMT, 186125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann CUPS_LLCAST fp->pos)); 186225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 186325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 186425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 186525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann DEBUG_printf(("2cupsFileSeek: pos=" CUPS_LLFMT, CUPS_LLCAST fp->pos)); 186625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 186725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (fp->pos); 186825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann} 186925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 187025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 187125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/* 187225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 'cupsFileStderr()' - Return a CUPS file associated with stderr. 187325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 187425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * @since CUPS 1.2/macOS 10.5@ 187525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 187625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 187725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmanncups_file_t * /* O - CUPS file */ 187825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. MoltmanncupsFileStderr(void) 187925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann{ 188025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann _cups_globals_t *cg = _cupsGlobals(); /* Pointer to library globals... */ 188125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 188225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 188325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 188425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Open file descriptor 2 as needed... 188525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 188625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 188725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (!cg->stdio_files[2]) 188825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 188925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 189025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Flush any pending output on the stdio file... 189125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 189225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 189325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fflush(stderr); 189425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 189525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 189625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Open file descriptor 2... 189725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 189825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 189925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if ((cg->stdio_files[2] = cupsFileOpenFd(2, "w")) != NULL) 190025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann cg->stdio_files[2]->is_stdio = 1; 190125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 190225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 190325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (cg->stdio_files[2]); 190425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann} 190525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 190625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 190725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/* 190825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 'cupsFileStdin()' - Return a CUPS file associated with stdin. 190925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 191025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * @since CUPS 1.2/macOS 10.5@ 191125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 191225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 191325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmanncups_file_t * /* O - CUPS file */ 191425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. MoltmanncupsFileStdin(void) 191525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann{ 191625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann _cups_globals_t *cg = _cupsGlobals(); /* Pointer to library globals... */ 191725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 191825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 191925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 192025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Open file descriptor 0 as needed... 192125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 192225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 192325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (!cg->stdio_files[0]) 192425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 192525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 192625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Open file descriptor 0... 192725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 192825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 192925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if ((cg->stdio_files[0] = cupsFileOpenFd(0, "r")) != NULL) 193025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann cg->stdio_files[0]->is_stdio = 1; 193125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 193225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 193325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (cg->stdio_files[0]); 193425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann} 193525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 193625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 193725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/* 193825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 'cupsFileStdout()' - Return a CUPS file associated with stdout. 193925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 194025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * @since CUPS 1.2/macOS 10.5@ 194125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 194225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 194325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmanncups_file_t * /* O - CUPS file */ 194425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. MoltmanncupsFileStdout(void) 194525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann{ 194625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann _cups_globals_t *cg = _cupsGlobals(); /* Pointer to library globals... */ 194725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 194825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 194925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 195025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Open file descriptor 1 as needed... 195125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 195225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 195325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (!cg->stdio_files[1]) 195425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 195525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 195625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Flush any pending output on the stdio file... 195725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 195825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 195925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fflush(stdout); 196025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 196125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 196225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Open file descriptor 1... 196325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 196425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 196525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if ((cg->stdio_files[1] = cupsFileOpenFd(1, "w")) != NULL) 196625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann cg->stdio_files[1]->is_stdio = 1; 196725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 196825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 196925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (cg->stdio_files[1]); 197025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann} 197125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 197225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 197325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/* 197425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 'cupsFileTell()' - Return the current file position. 197525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 197625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * @since CUPS 1.2/macOS 10.5@ 197725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 197825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 197925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannoff_t /* O - File position */ 198025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. MoltmanncupsFileTell(cups_file_t *fp) /* I - CUPS file */ 198125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann{ 198225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann DEBUG_printf(("2cupsFileTell(fp=%p)", (void *)fp)); 198325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann DEBUG_printf(("3cupsFileTell: pos=" CUPS_LLFMT, CUPS_LLCAST (fp ? fp->pos : -1))); 198425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 198525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (fp ? fp->pos : 0); 198625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann} 198725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 198825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 198925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/* 199025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 'cupsFileUnlock()' - Unlock access to a file. 199125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 199225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * @since CUPS 1.2/macOS 10.5@ 199325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 199425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 199525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannint /* O - 0 on success, -1 on error */ 199625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. MoltmanncupsFileUnlock(cups_file_t *fp) /* I - CUPS file */ 199725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann{ 199825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 199925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Range check... 200025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 200125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 200225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann DEBUG_printf(("cupsFileUnlock(fp=%p)", (void *)fp)); 200325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 200425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (!fp || fp->mode == 's') 200525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (-1); 200625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 200725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 200825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Unlock... 200925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 201025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 201125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#ifdef WIN32 201225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (_locking(fp->fd, _LK_UNLCK, 0)); 201325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#else 201425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (lockf(fp->fd, F_ULOCK, 0)); 201525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#endif /* WIN32 */ 201625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann} 201725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 201825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 201925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/* 202025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 'cupsFileWrite()' - Write to a file. 202125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 202225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * @since CUPS 1.2/macOS 10.5@ 202325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 202425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 202525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannssize_t /* O - Number of bytes written or -1 on error */ 202625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. MoltmanncupsFileWrite(cups_file_t *fp, /* I - CUPS file */ 202725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann const char *buf, /* I - Buffer */ 202825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann size_t bytes) /* I - Number of bytes to write */ 202925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann{ 203025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 203125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Range check input... 203225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 203325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 203425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann DEBUG_printf(("2cupsFileWrite(fp=%p, buf=%p, bytes=" CUPS_LLFMT ")", (void *)fp, (void *)buf, CUPS_LLCAST bytes)); 203525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 203625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (!fp || !buf || (fp->mode != 'w' && fp->mode != 's')) 203725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (-1); 203825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 203925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (bytes == 0) 204025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (0); 204125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 204225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 204325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Write the buffer... 204425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 204525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 204625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (fp->mode == 's') 204725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 204825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (cups_write(fp, buf, bytes) < 0) 204925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (-1); 205025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 205125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fp->pos += (off_t)bytes; 205225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 205325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann DEBUG_printf(("4cupsFileWrite: pos=" CUPS_LLFMT, CUPS_LLCAST fp->pos)); 205425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 205525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return ((ssize_t)bytes); 205625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 205725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 205825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if ((fp->ptr + bytes) > fp->end) 205925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (cupsFileFlush(fp)) 206025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (-1); 206125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 206225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fp->pos += (off_t)bytes; 206325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 206425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann DEBUG_printf(("4cupsFileWrite: pos=" CUPS_LLFMT, CUPS_LLCAST fp->pos)); 206525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 206625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (bytes > sizeof(fp->buf)) 206725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 206825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#ifdef HAVE_LIBZ 206925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (fp->compressed) 207025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (cups_compress(fp, buf, bytes)); 207125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else 207225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#endif /* HAVE_LIBZ */ 207325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (cups_write(fp, buf, bytes)); 207425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 207525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else 207625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 207725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann memcpy(fp->ptr, buf, bytes); 207825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fp->ptr += bytes; 207925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return ((ssize_t)bytes); 208025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 208125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann} 208225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 208325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 208425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#ifdef HAVE_LIBZ 208525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/* 208625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 'cups_compress()' - Compress a buffer of data. 208725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 208825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 208925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannstatic ssize_t /* O - Number of bytes written or -1 */ 209025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmanncups_compress(cups_file_t *fp, /* I - CUPS file */ 209125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann const char *buf, /* I - Buffer */ 209225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann size_t bytes) /* I - Number bytes */ 209325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann{ 209425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann DEBUG_printf(("7cups_compress(fp=%p, buf=%p, bytes=" CUPS_LLFMT ")", (void *)fp, (void *)buf, CUPS_LLCAST bytes)); 209525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 209625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 209725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Update the CRC... 209825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 209925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 210025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fp->crc = crc32(fp->crc, (const Bytef *)buf, (uInt)bytes); 210125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 210225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 210325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Deflate the bytes... 210425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 210525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 210625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fp->stream.next_in = (Bytef *)buf; 210725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fp->stream.avail_in = (uInt)bytes; 210825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 210925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann while (fp->stream.avail_in > 0) 211025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 211125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 211225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Flush the current buffer... 211325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 211425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 211525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann DEBUG_printf(("9cups_compress: avail_in=%d, avail_out=%d", 211625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fp->stream.avail_in, fp->stream.avail_out)); 211725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 211825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (fp->stream.avail_out < (uInt)(sizeof(fp->cbuf) / 8)) 211925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 212025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (cups_write(fp, (char *)fp->cbuf, (size_t)(fp->stream.next_out - fp->cbuf)) < 0) 212125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (-1); 212225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 212325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fp->stream.next_out = fp->cbuf; 212425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fp->stream.avail_out = sizeof(fp->cbuf); 212525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 212625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 212725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann deflate(&(fp->stream), Z_NO_FLUSH); 212825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 212925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 213025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return ((ssize_t)bytes); 213125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann} 213225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#endif /* HAVE_LIBZ */ 213325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 213425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 213525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/* 213625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 'cups_fill()' - Fill the input buffer. 213725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 213825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 213925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannstatic ssize_t /* O - Number of bytes or -1 */ 214025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmanncups_fill(cups_file_t *fp) /* I - CUPS file */ 214125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann{ 214225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann ssize_t bytes; /* Number of bytes read */ 214325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#ifdef HAVE_LIBZ 214425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann int status; /* Decompression status */ 214525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann const unsigned char *ptr, /* Pointer into buffer */ 214625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *end; /* End of buffer */ 214725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#endif /* HAVE_LIBZ */ 214825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 214925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 215025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann DEBUG_printf(("7cups_fill(fp=%p)", (void *)fp)); 215125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann DEBUG_printf(("9cups_fill: fp->ptr=%p, fp->end=%p, fp->buf=%p, fp->bufpos=" CUPS_LLFMT ", fp->eof=%d", (void *)fp->ptr, (void *)fp->end, (void *)fp->buf, CUPS_LLCAST fp->bufpos, fp->eof)); 215225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 215325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (fp->ptr && fp->end) 215425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fp->bufpos += fp->end - fp->buf; 215525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 215625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#ifdef HAVE_LIBZ 215725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann DEBUG_printf(("9cups_fill: fp->compressed=%d", fp->compressed)); 215825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 215925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann while (!fp->ptr || fp->compressed) 216025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 216125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 216225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Check to see if we have read any data yet; if not, see if we have a 216325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * compressed file... 216425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 216525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 216625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (!fp->ptr) 216725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 216825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 216925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Reset the file position in case we are seeking... 217025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 217125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 217225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fp->compressed = 0; 217325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 217425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 217525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Read the first bytes in the file to determine if we have a gzip'd 217625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * file... 217725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 217825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 217925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if ((bytes = cups_read(fp, (char *)fp->buf, sizeof(fp->buf))) < 0) 218025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 218125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 218225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Can't read from file! 218325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 218425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 218525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann DEBUG_printf(("9cups_fill: cups_read() returned " CUPS_LLFMT, 218625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann CUPS_LLCAST bytes)); 218725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 218825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fp->eof = 1; 218925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 219025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (-1); 219125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 219225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 219325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (bytes < 10 || fp->buf[0] != 0x1f || 219425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann (fp->buf[1] & 255) != 0x8b || 219525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fp->buf[2] != 8 || (fp->buf[3] & 0xe0) != 0) 219625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 219725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 219825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Not a gzip'd file! 219925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 220025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 220125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fp->ptr = fp->buf; 220225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fp->end = fp->buf + bytes; 220325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 220425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann DEBUG_printf(("9cups_fill: Returning " CUPS_LLFMT, 220525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann CUPS_LLCAST bytes)); 220625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 220725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (bytes); 220825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 220925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 221025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 221125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Parse header junk: extra data, original name, and comment... 221225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 221325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 221425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann ptr = (unsigned char *)fp->buf + 10; 221525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann end = (unsigned char *)fp->buf + bytes; 221625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 221725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (fp->buf[3] & 0x04) 221825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 221925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 222025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Skip extra data... 222125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 222225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 222325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if ((ptr + 2) > end) 222425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 222525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 222625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Can't read from file! 222725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 222825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 222925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann DEBUG_puts("9cups_fill: Extra gzip header data missing, returning -1."); 223025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 223125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fp->eof = 1; 223225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann errno = EIO; 223325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 223425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (-1); 223525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 223625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 223725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann bytes = ((unsigned char)ptr[1] << 8) | (unsigned char)ptr[0]; 223825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann ptr += 2 + bytes; 223925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 224025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (ptr > end) 224125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 224225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 224325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Can't read from file! 224425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 224525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 224625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann DEBUG_puts("9cups_fill: Extra gzip header data does not fit in initial buffer, returning -1."); 224725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 224825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fp->eof = 1; 224925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann errno = EIO; 225025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 225125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (-1); 225225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 225325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 225425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 225525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (fp->buf[3] & 0x08) 225625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 225725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 225825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Skip original name data... 225925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 226025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 226125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann while (ptr < end && *ptr) 226225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann ptr ++; 226325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 226425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (ptr < end) 226525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann ptr ++; 226625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else 226725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 226825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 226925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Can't read from file! 227025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 227125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 227225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann DEBUG_puts("9cups_fill: Original filename in gzip header data does not fit in initial buffer, returning -1."); 227325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 227425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fp->eof = 1; 227525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann errno = EIO; 227625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 227725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (-1); 227825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 227925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 228025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 228125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (fp->buf[3] & 0x10) 228225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 228325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 228425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Skip comment data... 228525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 228625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 228725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann while (ptr < end && *ptr) 228825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann ptr ++; 228925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 229025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (ptr < end) 229125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann ptr ++; 229225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else 229325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 229425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 229525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Can't read from file! 229625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 229725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 229825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann DEBUG_puts("9cups_fill: Comment in gzip header data does not fit in initial buffer, returning -1."); 229925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 230025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fp->eof = 1; 230125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann errno = EIO; 230225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 230325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (-1); 230425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 230525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 230625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 230725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (fp->buf[3] & 0x02) 230825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 230925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 231025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Skip header CRC data... 231125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 231225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 231325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann ptr += 2; 231425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 231525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (ptr > end) 231625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 231725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 231825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Can't read from file! 231925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 232025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 232125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann DEBUG_puts("9cups_fill: Header CRC in gzip header data does not fit in initial buffer, returning -1."); 232225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 232325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fp->eof = 1; 232425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann errno = EIO; 232525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 232625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (-1); 232725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 232825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 232925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 233025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 233125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Copy the flate-compressed data to the compression buffer... 233225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 233325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 233425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if ((bytes = end - ptr) > 0) 233525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann memcpy(fp->cbuf, ptr, (size_t)bytes); 233625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 233725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 233825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Setup the decompressor data... 233925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 234025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 234125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fp->stream.zalloc = (alloc_func)0; 234225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fp->stream.zfree = (free_func)0; 234325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fp->stream.opaque = (voidpf)0; 234425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fp->stream.next_in = (Bytef *)fp->cbuf; 234525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fp->stream.next_out = NULL; 234625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fp->stream.avail_in = (uInt)bytes; 234725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fp->stream.avail_out = 0; 234825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fp->crc = crc32(0L, Z_NULL, 0); 234925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 235025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if ((status = inflateInit2(&(fp->stream), -15)) != Z_OK) 235125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 235225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann DEBUG_printf(("9cups_fill: inflateInit2 returned %d, returning -1.", status)); 235325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 235425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fp->eof = 1; 235525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann errno = EIO; 235625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 235725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (-1); 235825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 235925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 236025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fp->compressed = 1; 236125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 236225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 236325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (fp->compressed) 236425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 236525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 236625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * If we have reached end-of-file, return immediately... 236725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 236825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 236925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (fp->eof) 237025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 237125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann DEBUG_puts("9cups_fill: EOF, returning 0."); 237225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 237325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (0); 237425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 237525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 237625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 237725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Fill the decompression buffer as needed... 237825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 237925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 238025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (fp->stream.avail_in == 0) 238125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 238225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if ((bytes = cups_read(fp, (char *)fp->cbuf, sizeof(fp->cbuf))) <= 0) 238325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 238425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann DEBUG_printf(("9cups_fill: cups_read error, returning %d.", (int)bytes)); 238525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 238625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fp->eof = 1; 238725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 238825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (bytes); 238925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 239025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 239125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fp->stream.next_in = fp->cbuf; 239225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fp->stream.avail_in = (uInt)bytes; 239325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 239425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 239525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 239625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Decompress data from the buffer... 239725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 239825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 239925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fp->stream.next_out = (Bytef *)fp->buf; 240025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fp->stream.avail_out = sizeof(fp->buf); 240125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 240225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann status = inflate(&(fp->stream), Z_NO_FLUSH); 240325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 240425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (fp->stream.next_out > (Bytef *)fp->buf) 240525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fp->crc = crc32(fp->crc, (Bytef *)fp->buf, 240625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann (uInt)(fp->stream.next_out - (Bytef *)fp->buf)); 240725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 240825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (status == Z_STREAM_END) 240925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 241025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 241125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Read the CRC and length... 241225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 241325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 241425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann unsigned char trailer[8]; /* Trailer bytes */ 241525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann uLong tcrc; /* Trailer CRC */ 241625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann ssize_t tbytes = 0; /* Number of bytes */ 241725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 241825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (fp->stream.avail_in > 0) 241925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 242025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (fp->stream.avail_in > sizeof(trailer)) 242125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann tbytes = (ssize_t)sizeof(trailer); 242225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else 242325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann tbytes = (ssize_t)fp->stream.avail_in; 242425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 242525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann memcpy(trailer, fp->stream.next_in, (size_t)tbytes); 242625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fp->stream.next_in += tbytes; 242725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fp->stream.avail_in -= (size_t)tbytes; 242825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 242925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 243025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (tbytes < (ssize_t)sizeof(trailer)) 243125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 243225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (read(fp->fd, trailer + tbytes, sizeof(trailer) - (size_t)tbytes) < ((ssize_t)sizeof(trailer) - tbytes)) 243325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 243425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 243525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Can't get it, so mark end-of-file... 243625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 243725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 243825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann DEBUG_puts("9cups_fill: Unable to read gzip CRC trailer, returning -1."); 243925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 244025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fp->eof = 1; 244125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann errno = EIO; 244225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 244325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (-1); 244425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 244525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 244625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 244725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann tcrc = ((((((uLong)trailer[3] << 8) | (uLong)trailer[2]) << 8) | 244825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann (uLong)trailer[1]) << 8) | (uLong)trailer[0]; 244925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 245025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (tcrc != fp->crc) 245125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 245225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 245325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Bad CRC, mark end-of-file... 245425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 245525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 245625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann DEBUG_printf(("9cups_fill: tcrc=%08x != fp->crc=%08x, returning -1.", (unsigned int)tcrc, (unsigned int)fp->crc)); 245725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 245825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fp->eof = 1; 245925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann errno = EIO; 246025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 246125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (-1); 246225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 246325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 246425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 246525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Otherwise, reset the compressed flag so that we re-read the 246625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * file header... 246725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 246825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 246925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fp->compressed = 0; 247025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 247125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else if (status < Z_OK) 247225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 247325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann DEBUG_printf(("9cups_fill: inflate returned %d, returning -1.", status)); 247425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 247525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fp->eof = 1; 247625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann errno = EIO; 247725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 247825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (-1); 247925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 248025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 248125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann bytes = (ssize_t)sizeof(fp->buf) - (ssize_t)fp->stream.avail_out; 248225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 248325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 248425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Return the decompressed data... 248525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 248625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 248725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fp->ptr = fp->buf; 248825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fp->end = fp->buf + bytes; 248925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 249025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (bytes) 249125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 249225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann DEBUG_printf(("9cups_fill: Returning %d.", (int)bytes)); 249325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (bytes); 249425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 249525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 249625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 249725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#endif /* HAVE_LIBZ */ 249825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 249925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 250025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Read a buffer's full of data... 250125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 250225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 250325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if ((bytes = cups_read(fp, fp->buf, sizeof(fp->buf))) <= 0) 250425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 250525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 250625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Can't read from file! 250725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 250825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 250925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fp->eof = 1; 251025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fp->ptr = fp->buf; 251125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fp->end = fp->buf; 251225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 251325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else 251425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 251525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 251625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Return the bytes we read... 251725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 251825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 251925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fp->eof = 0; 252025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fp->ptr = fp->buf; 252125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fp->end = fp->buf + bytes; 252225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 252325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 252425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann DEBUG_printf(("9cups_fill: Not gzip, returning %d.", (int)bytes)); 252525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 252625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (bytes); 252725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann} 252825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 252925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 253025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/* 253125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 'cups_open()' - Safely open a file for writing. 253225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 253325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * We don't allow appending to directories or files that are hard-linked or 253425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * symlinked. 253525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 253625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 253725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannstatic int /* O - File descriptor or -1 otherwise */ 253825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmanncups_open(const char *filename, /* I - Filename */ 253925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann int mode) /* I - Open mode */ 254025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann{ 254125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann int fd; /* File descriptor */ 254225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann struct stat fileinfo; /* File information */ 254325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#ifndef WIN32 254425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann struct stat linkinfo; /* Link information */ 254525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#endif /* !WIN32 */ 254625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 254725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 254825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 254925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Open the file... 255025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 255125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 255225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if ((fd = open(filename, mode, 0666)) < 0) 255325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (-1); 255425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 255525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 255625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Then verify that the file descriptor doesn't point to a directory or hard- 255725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * linked file. 255825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 255925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 256025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (fstat(fd, &fileinfo)) 256125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 256225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann close(fd); 256325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (-1); 256425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 256525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 256625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (fileinfo.st_nlink != 1) 256725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 256825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann close(fd); 256925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann errno = EPERM; 257025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (-1); 257125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 257225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 257325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#ifdef WIN32 257425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (fileinfo.st_mode & _S_IFDIR) 257525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#else 257625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (S_ISDIR(fileinfo.st_mode)) 257725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#endif /* WIN32 */ 257825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 257925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann close(fd); 258025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann errno = EISDIR; 258125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (-1); 258225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 258325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 258425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#ifndef WIN32 258525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 258625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Then use lstat to determine whether the filename is a symlink... 258725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 258825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 258925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (lstat(filename, &linkinfo)) 259025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 259125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann close(fd); 259225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (-1); 259325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 259425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 259525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (S_ISLNK(linkinfo.st_mode) || 259625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fileinfo.st_dev != linkinfo.st_dev || 259725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fileinfo.st_ino != linkinfo.st_ino || 259825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#ifdef HAVE_ST_GEN 259925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fileinfo.st_gen != linkinfo.st_gen || 260025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#endif /* HAVE_ST_GEN */ 260125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fileinfo.st_nlink != linkinfo.st_nlink || 260225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fileinfo.st_mode != linkinfo.st_mode) 260325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 260425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 260525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Yes, don't allow! 260625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 260725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 260825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann close(fd); 260925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann errno = EPERM; 261025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (-1); 261125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 261225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#endif /* !WIN32 */ 261325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 261425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (fd); 261525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann} 261625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 261725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 261825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/* 261925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 'cups_read()' - Read from a file descriptor. 262025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 262125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 262225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannstatic ssize_t /* O - Number of bytes read or -1 */ 262325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmanncups_read(cups_file_t *fp, /* I - CUPS file */ 262425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann char *buf, /* I - Buffer */ 262525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann size_t bytes) /* I - Number bytes */ 262625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann{ 262725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann ssize_t total; /* Total bytes read */ 262825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 262925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 263025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann DEBUG_printf(("7cups_read(fp=%p, buf=%p, bytes=" CUPS_LLFMT ")", (void *)fp, (void *)buf, CUPS_LLCAST bytes)); 263125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 263225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 263325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Loop until we read at least 0 bytes... 263425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 263525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 263625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann for (;;) 263725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 263825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#ifdef WIN32 263925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (fp->mode == 's') 264025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann total = (ssize_t)recv(fp->fd, buf, (unsigned)bytes, 0); 264125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else 264225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann total = (ssize_t)read(fp->fd, buf, (unsigned)bytes); 264325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#else 264425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (fp->mode == 's') 264525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann total = recv(fp->fd, buf, bytes, 0); 264625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else 264725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann total = read(fp->fd, buf, bytes); 264825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#endif /* WIN32 */ 264925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 265025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann DEBUG_printf(("9cups_read: total=" CUPS_LLFMT, CUPS_LLCAST total)); 265125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 265225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (total >= 0) 265325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann break; 265425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 265525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 265625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Reads can be interrupted by signals and unavailable resources... 265725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 265825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 265925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (errno == EAGAIN || errno == EINTR) 266025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann continue; 266125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else 266225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (-1); 266325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 266425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 266525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 266625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Return the total number of bytes read... 266725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 266825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 266925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (total); 267025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann} 267125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 267225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 267325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/* 267425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 'cups_write()' - Write to a file descriptor. 267525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 267625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 267725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannstatic ssize_t /* O - Number of bytes written or -1 */ 267825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmanncups_write(cups_file_t *fp, /* I - CUPS file */ 267925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann const char *buf, /* I - Buffer */ 268025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann size_t bytes) /* I - Number bytes */ 268125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann{ 268225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann size_t total; /* Total bytes written */ 268325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann ssize_t count; /* Count this time */ 268425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 268525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 268625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann DEBUG_printf(("7cups_write(fp=%p, buf=%p, bytes=" CUPS_LLFMT ")", (void *)fp, (void *)buf, CUPS_LLCAST bytes)); 268725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 268825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 268925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Loop until all bytes are written... 269025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 269125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 269225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann total = 0; 269325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann while (bytes > 0) 269425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 269525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#ifdef WIN32 269625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (fp->mode == 's') 269725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann count = (ssize_t)send(fp->fd, buf, (unsigned)bytes, 0); 269825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else 269925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann count = (ssize_t)write(fp->fd, buf, (unsigned)bytes); 270025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#else 270125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (fp->mode == 's') 270225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann count = send(fp->fd, buf, bytes, 0); 270325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else 270425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann count = write(fp->fd, buf, bytes); 270525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#endif /* WIN32 */ 270625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 270725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann DEBUG_printf(("9cups_write: count=" CUPS_LLFMT, CUPS_LLCAST count)); 270825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 270925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (count < 0) 271025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 271125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 271225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Writes can be interrupted by signals and unavailable resources... 271325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 271425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 271525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (errno == EAGAIN || errno == EINTR) 271625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann continue; 271725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else 271825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (-1); 271925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 272025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 272125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 272225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Update the counts for the last write call... 272325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 272425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 272525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann bytes -= (size_t)count; 272625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann total += (size_t)count; 272725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann buf += count; 272825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 272925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 273025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 273125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Return the total number of bytes written... 273225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 273325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 273425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return ((ssize_t)total); 273525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann} 2736