You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
137 lines
3.3 KiB
137 lines
3.3 KiB
/*
|
|
* Backend functions for CUPS.
|
|
*
|
|
* Copyright 2007-2015 by Apple Inc.
|
|
* Copyright 2006 by Easy Software Products.
|
|
*
|
|
* Licensed under Apache License v2.0. See the file "LICENSE" for more information.
|
|
*/
|
|
|
|
/*
|
|
* Include necessary headers...
|
|
*/
|
|
|
|
#include "cups-private.h"
|
|
#include "backend.h"
|
|
#include "ppd.h"
|
|
|
|
|
|
/*
|
|
* Local functions...
|
|
*/
|
|
|
|
static void quote_string(const char *s);
|
|
|
|
|
|
/*
|
|
* 'cupsBackendDeviceURI()' - Get the device URI for a backend.
|
|
*
|
|
* The "argv" argument is the argv argument passed to main(). This
|
|
* function returns the device URI passed in the DEVICE_URI environment
|
|
* variable or the device URI passed in argv[0], whichever is found
|
|
* first.
|
|
*
|
|
* @since CUPS 1.2/macOS 10.5@
|
|
*/
|
|
|
|
const char * /* O - Device URI or @code NULL@ */
|
|
cupsBackendDeviceURI(char **argv) /* I - Command-line arguments */
|
|
{
|
|
const char *device_uri, /* Device URI */
|
|
*auth_info_required; /* AUTH_INFO_REQUIRED env var */
|
|
_cups_globals_t *cg = _cupsGlobals(); /* Global info */
|
|
int options; /* Resolve options */
|
|
ppd_file_t *ppd; /* PPD file */
|
|
ppd_attr_t *ppdattr; /* PPD attribute */
|
|
|
|
|
|
if ((device_uri = getenv("DEVICE_URI")) == NULL)
|
|
{
|
|
if (!argv || !argv[0] || !strchr(argv[0], ':'))
|
|
return (NULL);
|
|
|
|
device_uri = argv[0];
|
|
}
|
|
|
|
options = _HTTP_RESOLVE_STDERR;
|
|
if ((auth_info_required = getenv("AUTH_INFO_REQUIRED")) != NULL &&
|
|
!strcmp(auth_info_required, "negotiate"))
|
|
options |= _HTTP_RESOLVE_FQDN;
|
|
|
|
if ((ppd = ppdOpenFile(getenv("PPD"))) != NULL)
|
|
{
|
|
if ((ppdattr = ppdFindAttr(ppd, "cupsIPPFaxOut", NULL)) != NULL &&
|
|
!_cups_strcasecmp(ppdattr->value, "true"))
|
|
options |= _HTTP_RESOLVE_FAXOUT;
|
|
|
|
ppdClose(ppd);
|
|
}
|
|
|
|
return (_httpResolveURI(device_uri, cg->resolved_uri,
|
|
sizeof(cg->resolved_uri), options, NULL, NULL));
|
|
}
|
|
|
|
|
|
/*
|
|
* 'cupsBackendReport()' - Write a device line from a backend.
|
|
*
|
|
* This function writes a single device line to stdout for a backend.
|
|
* It handles quoting of special characters in the device-make-and-model,
|
|
* device-info, device-id, and device-location strings.
|
|
*
|
|
* @since CUPS 1.4/macOS 10.6@
|
|
*/
|
|
|
|
void
|
|
cupsBackendReport(
|
|
const char *device_scheme, /* I - device-scheme string */
|
|
const char *device_uri, /* I - device-uri string */
|
|
const char *device_make_and_model, /* I - device-make-and-model string or @code NULL@ */
|
|
const char *device_info, /* I - device-info string or @code NULL@ */
|
|
const char *device_id, /* I - device-id string or @code NULL@ */
|
|
const char *device_location) /* I - device-location string or @code NULL@ */
|
|
{
|
|
if (!device_scheme || !device_uri)
|
|
return;
|
|
|
|
printf("%s %s", device_scheme, device_uri);
|
|
if (device_make_and_model && *device_make_and_model)
|
|
quote_string(device_make_and_model);
|
|
else
|
|
quote_string("unknown");
|
|
quote_string(device_info);
|
|
quote_string(device_id);
|
|
quote_string(device_location);
|
|
putchar('\n');
|
|
fflush(stdout);
|
|
}
|
|
|
|
|
|
/*
|
|
* 'quote_string()' - Write a quoted string to stdout, escaping \ and ".
|
|
*/
|
|
|
|
static void
|
|
quote_string(const char *s) /* I - String to write */
|
|
{
|
|
fputs(" \"", stdout);
|
|
|
|
if (s)
|
|
{
|
|
while (*s)
|
|
{
|
|
if (*s == '\\' || *s == '\"')
|
|
putchar('\\');
|
|
|
|
if (((*s & 255) < ' ' && *s != '\t') || *s == 0x7f)
|
|
putchar(' ');
|
|
else
|
|
putchar(*s);
|
|
|
|
s ++;
|
|
}
|
|
}
|
|
|
|
putchar('\"');
|
|
}
|