]> git.ipfire.org Git - thirdparty/cups.git/blobdiff - backend/network.c
Merge pull request #5913 from apple/bug-fix-rollup-1
[thirdparty/cups.git] / backend / network.c
index fb42f791f244fead9f5639191d9526b0a5da4424..f7ee2fbbe3c8e080c9e34d6d7f1e7e22e4240a21 100644 (file)
@@ -1,23 +1,11 @@
 /*
- * "$Id$"
+ * Common backend network APIs for CUPS.
  *
- *   Common backend network APIs for CUPS.
+ * Copyright © 2007-2016 by Apple Inc.
+ * Copyright © 2006-2007 by Easy Software Products, all rights reserved.
  *
- *   Copyright 2007-2011 by Apple Inc.
- *   Copyright 2006-2007 by Easy Software Products, all rights reserved.
- *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   "LICENSE" which should have been included with this file.  If this
- *   file is missing or damaged, see the license at "http://www.cups.org/".
- *
- *   This file is subject to the Apple OS-Developed Software exception.
- *
- * Contents:
- *
- *   backendCheckSideChannel() - Check the side-channel for pending requests.
- *   backendNetworkSideCB()    - Handle common network side-channel commands.
+ * Licensed under Apache License v2.0.  See the file "LICENSE" for more
+ * information.
  */
 
 /*
 
 #include "backend-private.h"
 #include <limits.h>
-#ifdef __hpux
-#  include <sys/time.h>
-#else
-#  include <sys/select.h>
-#endif /* __hpux */
+#include <sys/select.h>
 
 
 /*
  * 'backendCheckSideChannel()' - Check the side-channel for pending requests.
  */
 
-
 void
 backendCheckSideChannel(
     int         snmp_fd,               /* I - SNMP socket */
@@ -57,6 +40,65 @@ backendCheckSideChannel(
 }
 
 
+/*
+ * 'backendLookup()' - Lookup the given host and log addresses.
+ */
+
+http_addrlist_t        *                       /* O - List of addresses or NULL */
+backendLookup(const char *hostname,    /* I - Hostname */
+              int        port,         /* I - Port number */
+             int        *cancel)       /* I - Variable to watch for job cancel */
+{
+  char                 portname[32],   /* Port number as string */
+                       addrname[256];  /* Address as string */
+  http_addrlist_t      *addrlist,      /* List of addresses */
+                       *current;       /* Current address */
+
+
+ /*
+  * Lookup the address for the named host...
+  */
+
+  snprintf(portname, sizeof(portname), "%d", port);
+
+  fputs("STATE: +connecting-to-device\n", stderr);
+  fprintf(stderr, "DEBUG: Looking up \"%s\"...\n", hostname);
+
+  while ((addrlist = httpAddrGetList(hostname, AF_UNSPEC, portname)) == NULL)
+  {
+    _cupsLangPrintFilter(stderr, "INFO", _("Unable to locate printer \"%s\"."), hostname);
+    sleep(10);
+
+    if (getenv("CLASS") != NULL)
+    {
+      fputs("STATE: -connecting-to-device\n", stderr);
+      exit(CUPS_BACKEND_STOP);
+    }
+
+    if (cancel && *cancel)
+    {
+      fputs("STATE: -connecting-to-device\n", stderr);
+      exit(CUPS_BACKEND_OK);
+    }
+  }
+
+  fputs("STATE: -connecting-to-device\n", stderr);
+
+ /*
+  * Log the addresses we got...
+  */
+
+  for (current = addrlist; current; current = current->next)
+    fprintf(stderr, "DEBUG: %s=%s\n", hostname, httpAddrString(&current->addr, addrname, sizeof(addrname)));
+
+ /*
+  * Return...
+  */
+
+  return (addrlist);
+}
+
+
 /*
  * 'backendNetworkSideCB()' - Handle common network side-channel commands.
  */
@@ -71,7 +113,7 @@ backendNetworkSideCB(
 {
   cups_sc_command_t    command;        /* Request command */
   cups_sc_status_t     status;         /* Request/response status */
-  char                 data[2048];     /* Request/response data */
+  char                 data[65536];    /* Request/response data */
   int                  datalen;        /* Request/response data size */
   const char           *device_id;     /* 1284DEVICEID env var */
 
@@ -92,7 +134,7 @@ backendNetworkSideCB(
          status = CUPS_SC_STATUS_NOT_IMPLEMENTED;
        else if (backendDrainOutput(print_fd, device_fd))
          status = CUPS_SC_STATUS_IO_ERROR;
-       else 
+       else
           status = CUPS_SC_STATUS_OK;
 
        datalen = 0;
@@ -100,7 +142,7 @@ backendNetworkSideCB(
 
     case CUPS_SC_CMD_GET_BIDI :
        status  = CUPS_SC_STATUS_OK;
-        data[0] = use_bc;
+        data[0] = (char)use_bc;
         datalen = 1;
         break;
 
@@ -119,8 +161,35 @@ backendNetworkSideCB(
 
         if (snmp_fd >= 0)
        {
+         char          *dataptr;       /* Pointer into data */
          cups_snmp_t   packet;         /* Packet from printer */
+          const char   *snmp_value;    /* CUPS_SNMP_VALUE env var */
 
+          if ((snmp_value = getenv("CUPS_SNMP_VALUE")) != NULL)
+          {
+            const char *snmp_count;    /* CUPS_SNMP_COUNT env var */
+            int                count;          /* Repetition count */
+
+            if ((snmp_count = getenv("CUPS_SNMP_COUNT")) != NULL)
+            {
+              if ((count = atoi(snmp_count)) <= 0)
+                count = 1;
+            }
+            else
+              count = 1;
+
+           for (dataptr = data + strlen(data) + 1;
+                count > 0 && dataptr < (data + sizeof(data) - 1);
+                count --, dataptr += strlen(dataptr))
+             strlcpy(dataptr, snmp_value, sizeof(data) - (size_t)(dataptr - data));
+
+           fprintf(stderr, "DEBUG: Returning %s %s\n", data,
+                   data + strlen(data) + 1);
+
+           status  = CUPS_SC_STATUS_OK;
+           datalen = (int)(dataptr - data);
+           break;
+          }
 
           if (!_cupsSNMPStringToOID(data, packet.object_name, CUPS_SNMP_MAX_OID))
          {
@@ -141,8 +210,7 @@ backendNetworkSideCB(
           {
            if (_cupsSNMPRead(snmp_fd, &packet, 1.0))
            {
-             char      *dataptr;       /* Pointer into data */
-             int       i;              /* Looping var */
+             size_t    i;              /* Looping var */
 
 
               if (!_cupsSNMPOIDToString(packet.object_name, data, sizeof(data)))
@@ -157,35 +225,31 @@ backendNetworkSideCB(
              switch (packet.object_type)
              {
                case CUPS_ASN1_BOOLEAN :
-                   snprintf(dataptr, sizeof(data) - (dataptr - data), "%d",
-                            packet.object_value.boolean);
+                   snprintf(dataptr, sizeof(data) - (size_t)(dataptr - data), "%d", packet.object_value.boolean);
                    datalen += (int)strlen(dataptr);
                    break;
 
                case CUPS_ASN1_INTEGER :
-                   snprintf(dataptr, sizeof(data) - (dataptr - data), "%d",
+                   snprintf(dataptr, sizeof(data) - (size_t)(dataptr - data), "%d",
                             packet.object_value.integer);
                    datalen += (int)strlen(dataptr);
                    break;
 
                case CUPS_ASN1_BIT_STRING :
                case CUPS_ASN1_OCTET_STRING :
-                   if (packet.object_value.string.num_bytes < 0)
-                     i = 0;
-                   else if (packet.object_value.string.num_bytes < 
-                            (sizeof(data) - (dataptr - data)))
+                   if (packet.object_value.string.num_bytes < (sizeof(data) - (size_t)(dataptr - data)))
                      i = packet.object_value.string.num_bytes;
                    else
-                     i = (int)(sizeof(data) - (dataptr - data));
+                     i = sizeof(data) - (size_t)(dataptr - data);
 
                    memcpy(dataptr, packet.object_value.string.bytes, i);
 
-                    datalen += i;
+                    datalen += (int)i;
                    break;
 
                case CUPS_ASN1_OID :
                    _cupsSNMPOIDToString(packet.object_value.oid, dataptr,
-                                        sizeof(data) - (dataptr - data));
+                                        sizeof(data) - (size_t)(dataptr - data));
                    datalen += (int)strlen(dataptr);
                    break;
 
@@ -194,32 +258,27 @@ backendNetworkSideCB(
                         i < packet.object_value.string.num_bytes &&
                             dataptr < (data + sizeof(data) - 3);
                         i ++, dataptr += 2)
-                     sprintf(dataptr, "%02X",
-                             packet.object_value.string.bytes[i]);
+                     snprintf(dataptr, sizeof(data) - (size_t)(dataptr - data), "%02X", packet.object_value.string.bytes[i]);
                    datalen += (int)strlen(dataptr);
                    break;
 
                 case CUPS_ASN1_COUNTER :
-                   snprintf(dataptr, sizeof(data) - (dataptr - data), "%d",
-                            packet.object_value.counter);
+                   snprintf(dataptr, sizeof(data) - (size_t)(dataptr - data), "%u", packet.object_value.counter);
                    datalen += (int)strlen(dataptr);
                    break;
 
                 case CUPS_ASN1_GAUGE :
-                   snprintf(dataptr, sizeof(data) - (dataptr - data), "%u",
-                            packet.object_value.gauge);
+                   snprintf(dataptr, sizeof(data) - (size_t)(dataptr - data), "%u", packet.object_value.gauge);
                    datalen += (int)strlen(dataptr);
                    break;
 
                 case CUPS_ASN1_TIMETICKS :
-                   snprintf(dataptr, sizeof(data) - (dataptr - data), "%u",
-                            packet.object_value.timeticks);
+                   snprintf(dataptr, sizeof(data) - (size_t)(dataptr - data), "%u", packet.object_value.timeticks);
                    datalen += (int)strlen(dataptr);
                    break;
 
                 default :
-                   fprintf(stderr, "DEBUG: Unknown OID value type %02X!\n",
-                           packet.object_type);
+                   fprintf(stderr, "DEBUG: Unknown OID value type %02X.\n", packet.object_type);
 
                case CUPS_ASN1_NULL_VALUE :
                    dataptr[0] = '\0';
@@ -242,6 +301,12 @@ backendNetworkSideCB(
        datalen = 0;
        break;
 
+    case CUPS_SC_CMD_GET_CONNECTED :
+       status  = CUPS_SC_STATUS_OK;
+        data[0] = device_fd != -1;
+        datalen = 1;
+        break;
+
     case CUPS_SC_CMD_GET_DEVICE_ID :
         if (snmp_fd >= 0)
        {
@@ -279,12 +344,6 @@ backendNetworkSideCB(
          break;
        }
 
-    case CUPS_SC_CMD_GET_CONNECTED :
-       status  = CUPS_SC_STATUS_OK;
-        data[0] = device_fd != -1;
-        datalen = 1;
-        break;
-
     default :
         status  = CUPS_SC_STATUS_NOT_IMPLEMENTED;
        datalen = 0;
@@ -293,8 +352,3 @@ backendNetworkSideCB(
 
   return (cupsSideChannelWrite(command, status, data, datalen, 1.0));
 }
-
-
-/*
- * End of "$Id$".
- */