• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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  * 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@ */
cupsBackendDeviceURI(char ** argv)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
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)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
quote_string(const char * s)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 }
143