1/*
2 * "$Id: backend.c 11093 2013-07-03 20:48:42Z msweet $"
3 *
4 *   Backend functions for CUPS.
5 *
6 *   Copyright 2007-2012 by Apple Inc.
7 *   Copyright 2006 by Easy Software Products.
8 *
9 *   These coded instructions, statements, and computer programs are the
10 *   property of Apple Inc. and are protected by Federal copyright
11 *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
12 *   which should have been included with this file.  If this file is
13 *   file is missing or damaged, see the license at "http://www.cups.org/".
14 *
15 *   This file is subject to the Apple OS-Developed Software exception.
16 *
17 * Contents:
18 *
19 *   cupsBackendDeviceURI() - Get the device URI for a backend.
20 *   cupsBackendReport()    - Write a device line from a backend.
21 *   quote_string()         - Write a quoted string to stdout, escaping \ and ".
22 */
23
24/*
25 * Include necessary headers...
26 */
27
28#include "cups-private.h"
29#include "backend.h"
30
31
32/*
33 * Local functions...
34 */
35
36static void	quote_string(const char *s);
37
38
39/*
40 * 'cupsBackendDeviceURI()' - Get the device URI for a backend.
41 *
42 * The "argv" argument is the argv argument passed to main(). This
43 * function returns the device URI passed in the DEVICE_URI environment
44 * variable or the device URI passed in argv[0], whichever is found
45 * first.
46 *
47 * @since CUPS 1.2/OS X 10.5@
48 */
49
50const char *				/* O - Device URI or @code NULL@ */
51cupsBackendDeviceURI(char **argv)	/* I - Command-line arguments */
52{
53  const char	*device_uri,		/* Device URI */
54		*auth_info_required;	/* AUTH_INFO_REQUIRED env var */
55  _cups_globals_t *cg = _cupsGlobals();	/* Global info */
56  int		options;		/* Resolve options */
57  ppd_file_t	*ppd;			/* PPD file */
58  ppd_attr_t	*ppdattr;		/* PPD attribute */
59
60
61  if ((device_uri = getenv("DEVICE_URI")) == NULL)
62  {
63    if (!argv || !argv[0] || !strchr(argv[0], ':'))
64      return (NULL);
65
66    device_uri = argv[0];
67  }
68
69  options = _HTTP_RESOLVE_STDERR;
70  if ((auth_info_required = getenv("AUTH_INFO_REQUIRED")) != NULL &&
71      !strcmp(auth_info_required, "negotiate"))
72    options |= _HTTP_RESOLVE_FQDN;
73
74  if ((ppd = ppdOpenFile(getenv("PPD"))) != NULL)
75  {
76    if ((ppdattr = ppdFindAttr(ppd, "cupsIPPFaxOut", NULL)) != NULL &&
77        !_cups_strcasecmp(ppdattr->value, "true"))
78      options |= _HTTP_RESOLVE_FAXOUT;
79
80    ppdClose(ppd);
81  }
82
83  return (_httpResolveURI(device_uri, cg->resolved_uri,
84                          sizeof(cg->resolved_uri), options, NULL, NULL));
85}
86
87
88/*
89 * 'cupsBackendReport()' - Write a device line from a backend.
90 *
91 * This function writes a single device line to stdout for a backend.
92 * It handles quoting of special characters in the device-make-and-model,
93 * device-info, device-id, and device-location strings.
94 *
95 * @since CUPS 1.4/OS X 10.6@
96 */
97
98void
99cupsBackendReport(
100    const char *device_scheme,		/* I - device-scheme string */
101    const char *device_uri,		/* I - device-uri string */
102    const char *device_make_and_model,	/* I - device-make-and-model string or @code NULL@ */
103    const char *device_info,		/* I - device-info string or @code NULL@ */
104    const char *device_id,		/* I - device-id string or @code NULL@ */
105    const char *device_location)	/* I - device-location string or @code NULL@ */
106{
107  if (!device_scheme || !device_uri)
108    return;
109
110  printf("%s %s", device_scheme, device_uri);
111  if (device_make_and_model && *device_make_and_model)
112    quote_string(device_make_and_model);
113  else
114    quote_string("unknown");
115  quote_string(device_info);
116  quote_string(device_id);
117  quote_string(device_location);
118  putchar('\n');
119  fflush(stdout);
120}
121
122
123/*
124 * 'quote_string()' - Write a quoted string to stdout, escaping \ and ".
125 */
126
127static void
128quote_string(const char *s)		/* I - String to write */
129{
130  fputs(" \"", stdout);
131
132  if (s)
133  {
134    while (*s)
135    {
136      if (*s == '\\' || *s == '\"')
137	putchar('\\');
138
139      if (((*s & 255) < ' ' && *s != '\t') || *s == 0x7f)
140        putchar(' ');
141      else
142        putchar(*s);
143
144      s ++;
145    }
146  }
147
148  putchar('\"');
149}
150
151
152/*
153 * End of "$Id: backend.c 11093 2013-07-03 20:48:42Z msweet $".
154 */
155