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