]> git.ipfire.org Git - thirdparty/cups.git/blobdiff - backend/network.c
License change: Apache License, Version 2.0.
[thirdparty/cups.git] / backend / network.c
index 2eadbff77c819708f80146f2935f3fdea90f83fe..4414ce5e63ff5b5871d8f34bb4d0d4e224cea7d9 100644 (file)
@@ -1,9 +1,7 @@
 /*
- * "$Id$"
- *
  * Common backend network APIs for CUPS.
  *
- * Copyright 2007-2011 by Apple Inc.
+ * Copyright 2007-2016 by Apple Inc.
  * Copyright 2006-2007 by Easy Software Products, all rights reserved.
  *
  * These coded instructions, statements, and computer programs are the
@@ -11,8 +9,6 @@
  * 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.
  */
 
 /*
@@ -28,7 +24,6 @@
  * 'backendCheckSideChannel()' - Check the side-channel for pending requests.
  */
 
-
 void
 backendCheckSideChannel(
     int         snmp_fd,               /* I - SNMP socket */
@@ -48,6 +43,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.
  */
@@ -91,7 +145,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;
 
@@ -130,13 +184,13 @@ backendNetworkSideCB(
            for (dataptr = data + strlen(data) + 1;
                 count > 0 && dataptr < (data + sizeof(data) - 1);
                 count --, dataptr += strlen(dataptr))
-             strlcpy(dataptr, snmp_value, sizeof(data) - (dataptr - data));
+             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 = dataptr - data;
+           datalen = (int)(dataptr - data);
            break;
           }
 
@@ -159,7 +213,7 @@ backendNetworkSideCB(
           {
            if (_cupsSNMPRead(snmp_fd, &packet, 1.0))
            {
-             int       i;              /* Looping var */
+             size_t    i;              /* Looping var */
 
 
               if (!_cupsSNMPOIDToString(packet.object_name, data, sizeof(data)))
@@ -174,35 +228,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;
 
@@ -211,32 +261,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]);
+                     sprintf(dataptr, "%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';
@@ -259,6 +304,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)
        {
@@ -296,12 +347,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;
@@ -310,8 +355,3 @@ backendNetworkSideCB(
 
   return (cupsSideChannelWrite(command, status, data, datalen, 1.0));
 }
-
-
-/*
- * End of "$Id$".
- */