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