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