]> git.ipfire.org Git - thirdparty/cups.git/blobdiff - backend/lpd.c
More localization work.
[thirdparty/cups.git] / backend / lpd.c
index 7c1cb9c51e66f641b9f450118db09c1c2750bca1..4ac5b819fa0efca7ebc1a8e053d73d1862a91401 100644 (file)
@@ -1,9 +1,9 @@
 /*
  * "$Id$"
  *
- *   Line Printer Daemon backend for the Common UNIX Printing System (CUPS).
+ *   Line Printer Daemon backend for CUPS.
  *
- *   Copyright 2007-2008 by Apple Inc.
+ *   Copyright 2007-2010 by Apple Inc.
  *   Copyright 1997-2007 by Easy Software Products, all rights reserved.
  *
  *   These coded instructions, statements, and computer programs are the
@@ -34,6 +34,7 @@
 #include <stdarg.h>
 #include <sys/types.h>
 #include <sys/stat.h>
+#include <stdio.h>
 
 #ifdef WIN32
 #  include <winsock.h>
@@ -113,7 +114,7 @@ main(int  argc,                             /* I - Number of command-line arguments (6 or 7) */
      char *argv[])                     /* I - Command-line arguments */
 {
   const char   *device_uri;            /* Device URI */
-  char         method[255],            /* Method in URI */
+  char         scheme[255],            /* Scheme in URI */
                hostname[1024],         /* Hostname */
                username[255],          /* Username info */
                resource[1024],         /* Resource info (printer name) */
@@ -181,7 +182,7 @@ main(int  argc,                             /* I - Number of command-line arguments (6 or 7) */
   else if (argc < 6 || argc > 7)
   {
     _cupsLangPrintf(stderr,
-                    _("Usage: %s job-id user title copies options [file]\n"),
+                    _("Usage: %s job-id user title copies options [file]"),
                     argv[0]);
     return (CUPS_BACKEND_FAILED);
   }
@@ -193,9 +194,8 @@ main(int  argc,                             /* I - Number of command-line arguments (6 or 7) */
   if ((device_uri = cupsBackendDeviceURI(argv)) == NULL)
     return (CUPS_BACKEND_FAILED);
 
-  httpSeparateURI(HTTP_URI_CODING_ALL, device_uri,
-                  method, sizeof(method), username, sizeof(username),
-                 hostname, sizeof(hostname), &port,
+  httpSeparateURI(HTTP_URI_CODING_ALL, device_uri, scheme, sizeof(scheme),
+                  username, sizeof(username), hostname, sizeof(hostname), &port,
                  resource, sizeof(resource));
 
   if (!port)
@@ -324,8 +324,9 @@ main(int  argc,                             /* I - Number of command-line arguments (6 or 7) */
         if (strchr("cdfglnoprtv", value[0]))
          format = value[0];
        else
-         _cupsLangPrintf(stderr, _("ERROR: Unknown format character \"%c\"\n"),
-                         value[0]);
+         _cupsLangPrintFilter(stderr, "ERROR",
+                              _("Unknown format character: \"%c\"."),
+                              value[0]);
       }
       else if (!strcasecmp(name, "mode") && value[0])
       {
@@ -338,8 +339,8 @@ main(int  argc,                             /* I - Number of command-line arguments (6 or 7) */
        else if (!strcasecmp(value, "stream"))
          mode = MODE_STREAM;
        else
-         _cupsLangPrintf(stderr, _("ERROR: Unknown print mode \"%s\"\n"),
-                         value);
+         _cupsLangPrintFilter(stderr, "ERROR",
+                              _("Unknown print mode: \"%s\"."), value);
       }
       else if (!strcasecmp(name, "order") && value[0])
       {
@@ -352,8 +353,8 @@ main(int  argc,                             /* I - Number of command-line arguments (6 or 7) */
        else if (!strcasecmp(value, "data,control"))
          order = ORDER_DATA_CONTROL;
        else
-         _cupsLangPrintf(stderr, _("ERROR: Unknown file order \"%s\"\n"),
-                         value);
+         _cupsLangPrintFilter(stderr, "ERROR",
+                              _("Unknown file order: \"%s\"."), value);
       }
       else if (!strcasecmp(name, "reserve"))
       {
@@ -386,7 +387,7 @@ main(int  argc,                             /* I - Number of command-line arguments (6 or 7) */
        */
 
         sanitize_title = !value[0] || !strcasecmp(value, "on") ||
-                       !strcasecmp(value, "yes") || !strcasecmp(value, "true");
+                        !strcasecmp(value, "yes") || !strcasecmp(value, "true");
       }
       else if (!strcasecmp(name, "timeout"))
       {
@@ -424,24 +425,37 @@ main(int  argc,                           /* I - Number of command-line arguments (6 or 7) */
     * Copy stdin to a temporary file...
     */
 
-    char buffer[8192]; /* Buffer for copying */
-    int  bytes;                /* Number of bytes read */
+    http_addrlist_t    *addrlist;      /* Address list */
+    int                        snmp_fd;        /* SNMP socket */
+
+
+    fputs("STATE: +connecting-to-device\n", stderr);
+    fprintf(stderr, "DEBUG: Looking up \"%s\"...\n", hostname);
+
+    if ((addrlist = httpAddrGetList(hostname, AF_UNSPEC, "1")) == NULL)
+    {
+      _cupsLangPrintFilter(stderr, "ERROR",
+                           _("Unable to locate printer \"%s\"."), hostname);
+      return (CUPS_BACKEND_STOP);
+    }
 
+    snmp_fd = _cupsSNMPOpen(addrlist->addr.addr.sa_family);
 
     if ((fd = cupsTempFd(tmpfilename, sizeof(tmpfilename))) < 0)
     {
-      _cupsLangPrintError(_("ERROR: Unable to create temporary file"));
+      perror("DEBUG: Unable to create temporary file");
       return (CUPS_BACKEND_FAILED);
     }
 
-    while ((bytes = fread(buffer, 1, sizeof(buffer), stdin)) > 0)
-      if (write(fd, buffer, bytes) < bytes)
-      {
-        _cupsLangPrintError(_("ERROR: Unable to write to temporary file"));
-       close(fd);
-       unlink(tmpfilename);
-       return (CUPS_BACKEND_FAILED);
-      }
+    _cupsLangPrintFilter(stderr, "INFO", _("Copying print data."));
+
+    backendRunLoop(-1, fd, snmp_fd, &(addrlist->addr), 0, 0, 
+                  backendNetworkSideCB);
+
+    if (snmp_fd >= 0)
+      _cupsSNMPClose(snmp_fd);
+
+    httpAddrFreeList(addrlist);
   }
   else if (argc == 6)
   {
@@ -459,8 +473,7 @@ main(int  argc,                             /* I - Number of command-line arguments (6 or 7) */
 
     if (fd == -1)
     {
-      _cupsLangPrintf(stderr, _("ERROR: Unable to open print file %s: %s\n"),
-                      filename, strerror(errno));
+      _cupsLangPrintError("ERROR", _("Unable to open print file"));
       return (CUPS_BACKEND_FAILED);
     }
   }
@@ -575,7 +588,7 @@ lpd_command(int  fd,                /* I - Socket connection to LPD host */
 
   if (lpd_write(fd, buf, bytes) < bytes)
   {
-    _cupsLangPrintError(_("ERROR: Unable to send LPD command"));
+    perror("DEBUG: Unable to send LPD command");
     return (-1);
   }
 
@@ -589,9 +602,9 @@ lpd_command(int  fd,                /* I - Socket connection to LPD host */
 
   if (recv(fd, &status, 1, 0) < 1)
   {
-    _cupsLangPrintf(stderr,
-                   _("WARNING: Remote host did not respond with command "
-                     "status byte after %d seconds!\n"), timeout);
+    _cupsLangPrintFilter(stderr, "WARNING",
+                        _("Printer did not respond after %d seconds."),
+                        timeout);
     status = errno;
   }
 
@@ -641,7 +654,6 @@ lpd_queue(const char *hostname,             /* I - Host to connect to */
                        have_supplies;  /* Printer supports supply levels? */
   int                  copy;           /* Copies written */
   time_t               start_time;     /* Time of first connect */
-  int                  recoverable;    /* Recoverable error shown? */
   size_t               nbytes;         /* Number of bytes written */
   off_t                        tbytes;         /* Total bytes written */
   char                 buffer[32768];  /* Output buffer */
@@ -672,10 +684,13 @@ lpd_queue(const char *hostname,           /* I - Host to connect to */
 
   sprintf(portname, "%d", port);
 
+  fputs("STATE: +connecting-to-device\n", stderr);
+  fprintf(stderr, "DEBUG: Looking up \"%s\"...\n", hostname);
+
   if ((addrlist = httpAddrGetList(hostname, AF_UNSPEC, portname)) == NULL)
   {
-    _cupsLangPrintf(stderr, _("ERROR: Unable to locate printer \'%s\'!\n"),
-                    hostname);
+    _cupsLangPrintFilter(stderr, "ERROR", _("Unable to locate printer \"%s\"."),
+                        hostname);
     return (CUPS_BACKEND_STOP);
   }
 
@@ -683,8 +698,7 @@ lpd_queue(const char *hostname,             /* I - Host to connect to */
   * Remember when we started trying to connect to the printer...
   */
 
-  recoverable = 0;
-  start_time  = time(NULL);
+  start_time = time(NULL);
 
  /*
   * Loop forever trying to print the file...
@@ -696,10 +710,9 @@ lpd_queue(const char *hostname,            /* I - Host to connect to */
     * First try to reserve a port for this connection...
     */
 
-    fputs("STATE: +connecting-to-device\n", stderr);
-    fprintf(stderr, "DEBUG: Connecting to %s:%d for printer %s\n",
-           hostname, port, printer);
-    _cupsLangPuts(stderr, _("INFO: Connecting to printer...\n"));
+    fprintf(stderr, "DEBUG: Connecting to %s:%d for printer %s\n", hostname,
+            port, printer);
+    _cupsLangPrintFilter(stderr, "INFO", _("Connecting to printer."));
 
     for (lport = reserve == RESERVE_RFC1179 ? 732 : 1024, addr = addrlist,
              delay = 5;;
@@ -742,7 +755,7 @@ lpd_queue(const char *hostname,             /* I - Host to connect to */
 
        if ((fd = socket(addr->addr.addr.sa_family, SOCK_STREAM, 0)) < 0)
        {
-          _cupsLangPrintError(_("ERROR: Unable to create socket"));
+         perror("DEBUG: Unable to create socket");
          sleep(1);
 
           continue;
@@ -759,7 +772,7 @@ lpd_queue(const char *hostname,             /* I - Host to connect to */
 
        if ((fd = rresvport_af(&lport, addr->addr.addr.sa_family)) < 0)
        {
-         _cupsLangPrintError(_("ERROR: Unable to reserve port"));
+         perror("DEBUG: Unable to reserve port");
          sleep(1);
 
          continue;
@@ -784,7 +797,6 @@ lpd_queue(const char *hostname,             /* I - Host to connect to */
 
       error = errno;
       close(fd);
-      fd = -1;
 
       if (addr->next)
         continue;
@@ -798,9 +810,9 @@ lpd_queue(const char *hostname,             /* I - Host to connect to */
        * available printer in the class.
        */
 
-        _cupsLangPuts(stderr,
-                     _("INFO: Unable to contact printer, queuing on next "
-                       "printer in class...\n"));
+        _cupsLangPrintFilter(stderr, "INFO",
+                            _("Unable to contact printer, queuing on next "
+                              "printer in class."));
 
         httpAddrFreeList(addrlist);
 
@@ -813,20 +825,40 @@ lpd_queue(const char *hostname,           /* I - Host to connect to */
         return (CUPS_BACKEND_FAILED);
       }
 
+      fprintf(stderr, "DEBUG: Connection error: %s\n", strerror(error));
+
       if (error == ECONNREFUSED || error == EHOSTDOWN ||
           error == EHOSTUNREACH)
       {
         if (contimeout && (time(NULL) - start_time) > contimeout)
        {
-         _cupsLangPuts(stderr, _("ERROR: Printer not responding!\n"));
+         _cupsLangPrintFilter(stderr, "ERROR",
+                              _("The printer is not responding."));
          return (CUPS_BACKEND_FAILED);
        }
 
-        recoverable = 1;
-
-       _cupsLangPrintf(stderr,
-                       _("WARNING: recoverable: Network host \'%s\' is busy; "
-                         "will retry in %d seconds...\n"), hostname, delay);
+       switch (error)
+       {
+         case EHOSTDOWN :
+             _cupsLangPrintFilter(stderr, "WARNING",
+                                  _("Network printer \"%s\" may not exist or "
+                                    "is unavailable at this time."),
+                                  hostname);
+             break;
+
+         case EHOSTUNREACH :
+             _cupsLangPrintFilter(stderr, "WARNING",
+                                  _("Network printer \"%s\" is unreachable at "
+                                    "this time."), hostname);
+             break;
+
+         case ECONNREFUSED :
+         default :
+             _cupsLangPrintFilter(stderr, "WARNING",
+                                  _("Network printer \"%s\" is busy."),
+                                  hostname);
+             break;
+        }
 
        sleep(delay);
 
@@ -843,30 +875,15 @@ lpd_queue(const char *hostname,           /* I - Host to connect to */
       }
       else
       {
-        recoverable = 1;
-
-        fprintf(stderr, "DEBUG: Connection error: %s\n", strerror(errno));
-       _cupsLangPuts(stderr,
-                     _("ERROR: recoverable: Unable to connect to printer; "
-                       "will retry in 30 seconds...\n"));
+       _cupsLangPrintFilter(stderr, "ERROR",
+                            _("Network printer \"%s\" is not responding."),
+                            hostname);
        sleep(30);
       }
     }
 
-    if (recoverable)
-    {
-     /*
-      * If we've shown a recoverable error make sure the printer proxies
-      * have a chance to see the recovered message. Not pretty but
-      * necessary for now...
-      */
-
-      fputs("INFO: recovered: \n", stderr);
-      sleep(5);
-    }
-
     fputs("STATE: -connecting-to-device\n", stderr);
-    _cupsLangPuts(stderr, _("INFO: Connected to printer...\n"));
+    _cupsLangPrintFilter(stderr, "INFO", _("Connected to printer."));
 
 #ifdef AF_INET6
     if (addr->addr.addr.sa_family == AF_INET6)
@@ -910,7 +927,7 @@ lpd_queue(const char *hostname,             /* I - Host to connect to */
        httpAddrFreeList(addrlist);
        close(fd);
 
-       _cupsLangPrintError(_("ERROR: unable to stat print file"));
+       perror("DEBUG: unable to stat print file");
        return (CUPS_BACKEND_FAILED);
       }
 
@@ -997,13 +1014,14 @@ lpd_queue(const char *hostname,          /* I - Host to connect to */
         return (CUPS_BACKEND_FAILED);
       }
 
-      _cupsLangPrintf(stderr, _("INFO: Sending control file (%u bytes)\n"),
-                     (unsigned)strlen(control));
+      fprintf(stderr, "DEBUG: Sending control file (%u bytes)\n",
+             (unsigned)strlen(control));
 
       if (lpd_write(fd, control, strlen(control) + 1) < (strlen(control) + 1))
       {
        status = errno;
-       _cupsLangPrintError(_("ERROR: Unable to write control file"));
+       perror("DEBUG: Unable to write control file");
+
       }
       else
       {
@@ -1011,9 +1029,9 @@ lpd_queue(const char *hostname,           /* I - Host to connect to */
 
         if (read(fd, &status, 1) < 1)
        {
-         _cupsLangPrintf(stderr,
-                         _("WARNING: Remote host did not respond with control "
-                           "status byte after %d seconds!\n"), timeout);
+         _cupsLangPrintFilter(stderr, "WARNING",
+                              _("Printer did not respond after %d seconds."),
+                              timeout);
          status = errno;
        }
 
@@ -1021,11 +1039,12 @@ lpd_queue(const char *hostname,         /* I - Host to connect to */
       }
 
       if (status != 0)
-       _cupsLangPrintf(stderr,
-                       _("ERROR: Remote host did not accept control file "
-                         "(%d)\n"), status);
+       _cupsLangPrintFilter(stderr, "ERROR",
+                            _("Remote host did not accept control file (%d)."),
+                            status);
       else
-       _cupsLangPuts(stderr, _("INFO: Control file sent successfully\n"));
+       _cupsLangPrintFilter(stderr, "INFO",
+                            _("Control file sent successfully."));
     }
     else
       status = 0;
@@ -1052,13 +1071,8 @@ lpd_queue(const char *hostname,          /* I - Host to connect to */
         return (CUPS_BACKEND_FAILED);
       }
 
-      _cupsLangPrintf(stderr,
-#ifdef HAVE_LONG_LONG
-                     _("INFO: Sending data file (%lld bytes)\n"),
-#else
-                     _("INFO: Sending data file (%ld bytes)\n"),
-#endif /* HAVE_LONG_LONG */
-                     CUPS_LLCAST filestats.st_size);
+      fprintf(stderr, "DEBUG: Sending data file (" CUPS_LLFMT " bytes)\n",
+             CUPS_LLCAST filestats.st_size);
 
       tbytes = 0;
       for (copy = 0; copy < manual_copies; copy ++)
@@ -1067,13 +1081,13 @@ lpd_queue(const char *hostname,         /* I - Host to connect to */
 
        while ((nbytes = read(print_fd, buffer, sizeof(buffer))) > 0)
        {
-         _cupsLangPrintf(stderr,
-                         _("INFO: Spooling LPR job, %.0f%% complete...\n"),
-                         100.0 * tbytes / filestats.st_size);
+         _cupsLangPrintFilter(stderr, "INFO",
+                              _("Spooling job, %.0f%% complete."),
+                              100.0 * tbytes / filestats.st_size);
 
          if (lpd_write(fd, buffer, nbytes) < nbytes)
          {
-            _cupsLangPrintError(_("ERROR: Unable to send print file to printer"));
+           perror("DEBUG: Unable to send print file to printer");
             break;
          }
          else
@@ -1087,7 +1101,7 @@ lpd_queue(const char *hostname,           /* I - Host to connect to */
          status = errno;
        else if (lpd_write(fd, "", 1) < 1)
        {
-          _cupsLangPrintError(_("ERROR: Unable to send trailing nul to printer"));
+         perror("DEBUG: Unable to send trailing nul to printer");
          status = errno;
        }
        else
@@ -1103,9 +1117,9 @@ lpd_queue(const char *hostname,           /* I - Host to connect to */
 
           if (recv(fd, &status, 1, 0) < 1)
          {
-           _cupsLangPrintf(stderr,
-                           _("WARNING: Remote host did not respond with data "
-                             "status byte after %d seconds!\n"), timeout);
+           _cupsLangPrintFilter(stderr, "WARNING",
+                                _("Printer did not respond after %d seconds."),
+                                timeout);
            status = 0;
           }
 
@@ -1116,11 +1130,12 @@ lpd_queue(const char *hostname,         /* I - Host to connect to */
         status = 0;
 
       if (status != 0)
-       _cupsLangPrintf(stderr,
-                       _("ERROR: Remote host did not accept data file (%d)\n"),
-                       status);
+       _cupsLangPrintFilter(stderr, "ERROR",
+                            _("Remote host did not accept data file (%d)."),
+                            status);
       else
-       _cupsLangPuts(stderr, _("INFO: Data file sent successfully\n"));
+       _cupsLangPrintFilter(stderr, "INFO",
+                            _("Data file sent successfully."));
     }
 
     if (status == 0 && order == ORDER_DATA_CONTROL)
@@ -1144,13 +1159,13 @@ lpd_queue(const char *hostname,         /* I - Host to connect to */
         return (CUPS_BACKEND_FAILED);
       }
 
-      _cupsLangPrintf(stderr, _("INFO: Sending control file (%lu bytes)\n"),
-                     (unsigned long)strlen(control));
+      fprintf(stderr, "DEBUG: Sending control file (%lu bytes)\n",
+             (unsigned long)strlen(control));
 
       if (lpd_write(fd, control, strlen(control) + 1) < (strlen(control) + 1))
       {
        status = errno;
-       _cupsLangPrintError(_("ERROR: Unable to write control file"));
+       perror("DEBUG: Unable to write control file");
       }
       else
       {
@@ -1158,9 +1173,9 @@ lpd_queue(const char *hostname,           /* I - Host to connect to */
 
         if (read(fd, &status, 1) < 1)
        {
-         _cupsLangPrintf(stderr,
-                         _("WARNING: Remote host did not respond with control "
-                           "status byte after %d seconds!\n"), timeout);
+         _cupsLangPrintFilter(stderr, "WARNING",
+                              _("Printer did not respond after %d seconds."),
+                              timeout);
          status = errno;
        }
 
@@ -1168,11 +1183,12 @@ lpd_queue(const char *hostname,         /* I - Host to connect to */
       }
 
       if (status != 0)
-       _cupsLangPrintf(stderr,
-                       _("ERROR: Remote host did not accept control file "
-                         "(%d)\n"), status);
+       _cupsLangPrintFilter(stderr, "ERROR",
+                            _("Remote host did not accept control file (%d)."),
+                            status);
       else
-       _cupsLangPuts(stderr, _("INFO: Control file sent successfully\n"));
+       _cupsLangPrintFilter(stderr, "INFO",
+                            _("Control file sent successfully."));
     }
 
    /*