Home | History | Annotate | Download | only in cups
      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@ */
     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 }
    143