]> git.ipfire.org Git - thirdparty/cups.git/blobdiff - backend/lpd.c
Load cups into easysw/current.
[thirdparty/cups.git] / backend / lpd.c
index 218dba73707c3a28c0c42b90c7a3e2d258516990..10f4b5c0bf642325a37d94270c54624e7fcdd102 100644 (file)
@@ -1,25 +1,16 @@
 /*
- * "$Id: lpd.c 5886 2006-08-24 19:53:17Z mike $"
+ * "$Id: lpd.c 6649 2007-07-11 21:46:42Z mike $"
  *
  *   Line Printer Daemon backend for the Common UNIX Printing System (CUPS).
  *
- *   Copyright 1997-2006 by Easy Software Products, all rights reserved.
+ *   Copyright 2007 by Apple Inc.
+ *   Copyright 1997-2007 by Easy Software Products, all rights reserved.
  *
  *   These coded instructions, statements, and computer programs are the
- *   property of Easy Software Products and are protected by Federal
- *   copyright law.  Distribution and use rights are outlined in the file
+ *   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 please contact Easy Software Products
- *   at:
- *
- *       Attn: CUPS Licensing Information
- *       Easy Software Products
- *       44141 Airport View Drive, Suite 204
- *       Hollywood, Maryland 20636 USA
- *
- *       Voice: (301) 373-9600
- *       EMail: cups-info@cups.org
- *         WWW: http://www.cups.org
+ *   file is missing or damaged, see the license at "http://www.cups.org/".
  *
  *   This file is subject to the Apple OS-Developed Software exception.
  *
@@ -41,6 +32,7 @@
 #include <cups/backend.h>
 #include <cups/http-private.h>
 #include <cups/cups.h>
+#include <cups/i18n.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <stdarg.h>
@@ -73,6 +65,14 @@ static char  tmpfilename[1024] = ""; /* Temporary spool file name */
 static int     abort_job = 0;          /* Non-zero if we get SIGTERM */
 
 
+/*
+ * Print mode...
+ */
+
+#define MODE_STANDARD          0       /* Queue a copy */
+#define MODE_STREAM            1       /* Stream a copy */
+
+
 /*
  * The order for control and data files in LPD requests...
  */
@@ -96,9 +96,9 @@ static int    abort_job = 0;          /* Non-zero if we get SIGTERM */
 
 static int     lpd_command(int lpd_fd, int timeout, char *format, ...);
 static int     lpd_queue(const char *hostname, int port, const char *printer,
-                         const char *filename,
-                         const char *user, const char *title, int copies,
-                         int banner, int format, int order, int reserve,
+                         int print_fd, int mode, const char *user,
+                         const char *title, int copies, int banner,
+                         int format, int order, int reserve,
                          int manual_copies, int timeout, int contimeout);
 static void    lpd_timeout(int sig);
 static int     lpd_write(int lpd_fd, char *buffer, int length);
@@ -131,7 +131,9 @@ main(int  argc,                             /* I - Number of command-line arguments (6 or 7) */
                        *filename,      /* File to print */
                        title[256];     /* Title string */
   int                  port;           /* Port number */
+  int                  fd;             /* Print file */
   int                  status;         /* Status of LPD job */
+  int                  mode;           /* Print mode */
   int                  banner;         /* Print banner page? */
   int                  format;         /* Print format */
   int                  order;          /* Order of control/data files */
@@ -184,49 +186,11 @@ main(int  argc,                           /* I - Number of command-line arguments (6 or 7) */
   }
   else if (argc < 6 || argc > 7)
   {
-    fprintf(stderr, "Usage: %s job-id user title copies options [file]\n",
+    fprintf(stderr, _("Usage: %s job-id user title copies options [file]\n"),
             argv[0]);
     return (CUPS_BACKEND_FAILED);
   }
 
- /*
-  * If we have 7 arguments, print the file named on the command-line.
-  * Otherwise, copy stdin to a temporary file and print the temporary
-  * file.
-  */
-
-  if (argc == 6)
-  {
-   /*
-    * Copy stdin to a temporary file...
-    */
-
-    int  fd;           /* Temporary file */
-    char buffer[8192]; /* Buffer for copying */
-    int  bytes;                /* Number of bytes read */
-
-
-    if ((fd = cupsTempFd(tmpfilename, sizeof(tmpfilename))) < 0)
-    {
-      perror("ERROR: unable to create temporary file");
-      return (CUPS_BACKEND_FAILED);
-    }
-
-    while ((bytes = fread(buffer, 1, sizeof(buffer), stdin)) > 0)
-      if (write(fd, buffer, bytes) < bytes)
-      {
-        perror("ERROR: unable to write to temporary file");
-       close(fd);
-       unlink(tmpfilename);
-       return (CUPS_BACKEND_FAILED);
-      }
-
-    close(fd);
-    filename = tmpfilename;
-  }
-  else
-    filename = argv[6];
-
  /*
   * Extract the hostname and printer name from the URI...
   */
@@ -249,6 +213,7 @@ main(int  argc,                             /* I - Number of command-line arguments (6 or 7) */
   * See if there are any options...
   */
 
+  mode          = MODE_STANDARD;
   banner        = 0;
   format        = 'l';
   order         = ORDER_CONTROL_DATA;
@@ -258,10 +223,16 @@ main(int  argc,                           /* I - Number of command-line arguments (6 or 7) */
   contimeout    = 7 * 24 * 60 * 60;
 
 #ifdef __APPLE__
-  /* We want to pass utf-8 characters, not re-map them (3071945) */
+ /*
+  * We want to pass utf-8 characters, not re-map them (3071945)
+  */
+
   sanitize_title = 0;
 
-  /* Get the default timeout from a system preference... */
+ /*
+  * Get the default timeout from a system preference...
+  */
+
   {
     CFPropertyListRef  pvalue;         /* Preference value */
     SInt32             toval;          /* Timeout value */
@@ -351,7 +322,21 @@ main(int  argc,                            /* I - Number of command-line arguments (6 or 7) */
         if (strchr("cdfglnoprtv", value[0]))
          format = value[0];
        else
-         fprintf(stderr, "ERROR: Unknown format character \"%c\"\n", value[0]);
+         fprintf(stderr, _("ERROR: Unknown format character \"%c\"\n"),
+                 value[0]);
+      }
+      else if (!strcasecmp(name, "mode") && value[0])
+      {
+       /*
+        * Set control/data order...
+       */
+
+        if (!strcasecmp(value, "standard"))
+         mode = MODE_STANDARD;
+       else if (!strcasecmp(value, "stream"))
+         mode = MODE_STREAM;
+       else
+         fprintf(stderr, _("ERROR: Unknown print mode \"%s\"\n"), value);
       }
       else if (!strcasecmp(name, "order") && value[0])
       {
@@ -364,7 +349,7 @@ main(int  argc,                             /* I - Number of command-line arguments (6 or 7) */
        else if (!strcasecmp(value, "data,control"))
          order = ORDER_DATA_CONTROL;
        else
-         fprintf(stderr, "ERROR: Unknown file order \"%s\"\n", value);
+         fprintf(stderr, _("ERROR: Unknown file order \"%s\"\n"), value);
       }
       else if (!strcasecmp(name, "reserve"))
       {
@@ -411,7 +396,7 @@ main(int  argc,                             /* I - Number of command-line arguments (6 or 7) */
       else if (!strcasecmp(name, "contimeout"))
       {
        /*
-        * Set the timeout...
+        * Set the connection timeout...
        */
 
        if (atoi(value) > 0)
@@ -420,6 +405,64 @@ main(int  argc,                            /* I - Number of command-line arguments (6 or 7) */
     }
   }
 
+  if (mode == MODE_STREAM)
+    order = ORDER_CONTROL_DATA;
+
+ /*
+  * If we have 7 arguments, print the file named on the command-line.
+  * Otherwise, copy stdin to a temporary file and print the temporary
+  * file.
+  */
+
+  if (argc == 6 && mode == MODE_STANDARD)
+  {
+   /*
+    * Copy stdin to a temporary file...
+    */
+
+    char buffer[8192]; /* Buffer for copying */
+    int  bytes;                /* Number of bytes read */
+
+
+    if ((fd = cupsTempFd(tmpfilename, sizeof(tmpfilename))) < 0)
+    {
+      perror("ERROR: unable to create temporary file");
+      return (CUPS_BACKEND_FAILED);
+    }
+
+    while ((bytes = fread(buffer, 1, sizeof(buffer), stdin)) > 0)
+      if (write(fd, buffer, bytes) < bytes)
+      {
+        perror("ERROR: unable to write to temporary file");
+       close(fd);
+       unlink(tmpfilename);
+       return (CUPS_BACKEND_FAILED);
+      }
+
+    filename = tmpfilename;
+  }
+  else if (argc == 6)
+  {
+   /*
+    * Stream from stdin...
+    */
+
+    filename = NULL;
+    fd       = 0;
+  }
+  else
+  {
+    filename = argv[6];
+    fd       = open(filename, O_RDONLY);
+
+    if (fd == -1)
+    {
+      fprintf(stderr, _("ERROR: Unable to open print file %s: %s\n"),
+              filename, strerror(errno));
+      return (CUPS_BACKEND_FAILED);
+    }
+  }
+
  /*
   * Sanitize the document title...
   */
@@ -455,7 +498,7 @@ main(int  argc,                             /* I - Number of command-line arguments (6 or 7) */
       copies        = atoi(argv[4]);
     }
 
-    status = lpd_queue(hostname, port, resource + 1, filename,
+    status = lpd_queue(hostname, port, resource + 1, fd, mode,
                        username, title, copies,
                       banner, format, order, reserve, manual_copies,
                       timeout, contimeout);
@@ -464,7 +507,7 @@ main(int  argc,                             /* I - Number of command-line arguments (6 or 7) */
       fprintf(stderr, "PAGE: 1 %d\n", atoi(argv[4]));
   }
   else
-    status = lpd_queue(hostname, port, resource + 1, filename,
+    status = lpd_queue(hostname, port, resource + 1, fd, mode,
                        username, title, 1,
                       banner, format, order, reserve, 1,
                       timeout, contimeout);
@@ -476,6 +519,9 @@ main(int  argc,                             /* I - Number of command-line arguments (6 or 7) */
   if (tmpfilename[0])
     unlink(tmpfilename);
 
+  if (fd)
+    close(fd);
+
  /*
   * Return the queue status...
   */
@@ -533,14 +579,15 @@ lpd_command(int  fd,              /* I - Socket connection to LPD host */
   * Read back the status from the command and return it...
   */
 
-  fprintf(stderr, "DEBUG: Reading command status...\n");
+  fputs("DEBUG: Reading command status...\n", stderr);
 
   alarm(timeout);
 
   if (recv(fd, &status, 1, 0) < 1)
   {
-    fprintf(stderr, "WARNING: Remote host did not respond with command "
-                   "status byte after %d seconds!\n", timeout);
+    fprintf(stderr,
+            _("WARNING: Remote host did not respond with command status "
+             "byte after %d seconds!\n"), timeout);
     status = errno;
   }
 
@@ -560,7 +607,8 @@ static int                          /* O - Zero on success, non-zero on failure */
 lpd_queue(const char *hostname,                /* I - Host to connect to */
           int        port,             /* I - Port to connect on */
           const char *printer,         /* I - Printer/queue name */
-         const char *filename,         /* I - File to print */
+         int        print_fd,          /* I - File to print */
+         int        mode,              /* I - Print mode */
           const char *user,            /* I - Requesting user */
          const char *title,            /* I - Job title */
          int        copies,            /* I - Number of copies */
@@ -572,7 +620,6 @@ lpd_queue(const char *hostname,             /* I - Host to connect to */
          int        timeout,           /* I - Timeout... */
          int        contimeout)        /* I - Connection timeout */
 {
-  FILE                 *fp;            /* Job file */
   char                 localhost[255]; /* Local host name */
   int                  error;          /* Error number */
   struct stat          filestats;      /* File statistics */
@@ -582,13 +629,13 @@ lpd_queue(const char *hostname,           /* I - Host to connect to */
                        *cptr;          /* Pointer into control file string */
   char                 status;         /* Status byte from command */
   char                 portname[255];  /* Port name */
+  int                  delay;          /* Delay for retries... */
+  char                 addrname[256];  /* Address name */
   http_addrlist_t      *addrlist,      /* Address list */
                        *addr;          /* Socket address */
   int                  copy;           /* Copies written */
   time_t               start_time;     /* Time of first connect */
-#ifdef __APPLE__
   int                  recoverable;    /* Recoverable error shown? */
-#endif /* __APPLE__ */
   size_t               nbytes;         /* Number of bytes written */
   off_t                        tbytes;         /* Total bytes written */
   char                 buffer[32768];  /* Output buffer */
@@ -621,18 +668,15 @@ lpd_queue(const char *hostname,           /* I - Host to connect to */
 
   if ((addrlist = httpAddrGetList(hostname, AF_UNSPEC, portname)) == NULL)
   {
-    fprintf(stderr, "ERROR: Unable to locate printer \'%s\'!\n",
-            hostname);
+    fprintf(stderr, _("ERROR: Unable to locate printer \'%s\'!\n"), hostname);
     return (CUPS_BACKEND_STOP);
   }
 
  /*
-  * Remember when we starting trying to connect to the printer...
+  * Remember when we started trying to connect to the printer...
   */
 
-#ifdef __APPLE__
   recoverable = 0;
-#endif /* __APPLE__ */
   start_time  = time(NULL);
 
  /*
@@ -646,10 +690,12 @@ lpd_queue(const char *hostname,           /* I - Host to connect to */
     */
 
     fputs("STATE: +connecting-to-device\n", stderr);
-    fprintf(stderr, "INFO: Attempting to connect to host %s for printer %s\n",
+    fprintf(stderr,
+            _("INFO: Attempting to connect to host %s for printer %s\n"),
             hostname, printer);
 
-    for (lport = reserve == RESERVE_RFC1179 ? 732 : 1024, addr = addrlist;;
+    for (lport = reserve == RESERVE_RFC1179 ? 732 : 1024, addr = addrlist,
+             delay = 5;;
          addr = addr->next)
     {
      /*
@@ -745,8 +791,8 @@ lpd_queue(const char *hostname,             /* I - Host to connect to */
        * available printer in the class.
        */
 
-        fprintf(stderr, "INFO: Unable to connect to %s, queuing on next printer in class...\n",
-               hostname);
+        fputs(_("INFO: Unable to contact printer, queuing on next "
+               "printer in class...\n"), stderr);
 
         httpAddrFreeList(addrlist);
 
@@ -764,23 +810,21 @@ lpd_queue(const char *hostname,           /* I - Host to connect to */
       {
         if (contimeout && (time(NULL) - start_time) > contimeout)
        {
-         fputs("ERROR: Printer not responding!\n", stderr);
+         fputs(_("ERROR: Printer not responding!\n"), stderr);
          return (CUPS_BACKEND_FAILED);
        }
 
-#ifdef __APPLE__
         recoverable = 1;
-       fprintf(stderr, "WARNING: recoverable: "
-                       "Network host \'%s\' is busy, down, or "
-                       "unreachable; will retry in 30 seconds...\n",
-                hostname);
-#else
-       fprintf(stderr, "WARNING: "
-                       "Network host \'%s\' is busy, down, or "
-                       "unreachable; will retry in 30 seconds...\n",
-                hostname);
-#endif /* __APPLE__ */
-       sleep(30);
+
+       fprintf(stderr,
+               _("WARNING: recoverable: Network host \'%s\' is busy; will "
+                 "retry in %d seconds...\n"),
+               hostname, delay);
+
+       sleep(delay);
+
+       if (delay < 30)
+         delay += 5;
       }
       else if (error == EADDRINUSE)
       {
@@ -792,19 +836,15 @@ lpd_queue(const char *hostname,           /* I - Host to connect to */
       }
       else
       {
-#ifdef __APPLE__
         recoverable = 1;
-       perror("ERROR: recoverable: "
-              "Unable to connect to printer; will retry in 30 seconds...");
-#else
-       perror("ERROR: "
-              "Unable to connect to printer; will retry in 30 seconds...");
-#endif /* __APPLE__ */
-        sleep(30);
+
+        fprintf(stderr, "DEBUG: Connection error: %s\n", strerror(errno));
+       fputs(_("ERROR: recoverable: Unable to connect to printer; will "
+               "retry in 30 seconds...\n"), stderr);
+       sleep(30);
       }
     }
 
-#ifdef __APPLE__
     if (recoverable)
     {
      /*
@@ -816,35 +856,55 @@ lpd_queue(const char *hostname,           /* I - Host to connect to */
       fputs("INFO: recovered: \n", stderr);
       sleep(5);
     }
-#endif /* __APPLE__ */
 
     fputs("STATE: -connecting-to-device\n", stderr);
-    fprintf(stderr, "INFO: Connected to %s...\n", hostname);
-    fprintf(stderr, "DEBUG: Connected on ports %d (local %d)...\n", port,
-            lport);
+    fprintf(stderr, _("INFO: Connected to %s...\n"), hostname);
+
+#ifdef AF_INET6
+    if (addr->addr.addr.sa_family == AF_INET6)
+      fprintf(stderr, "DEBUG: Connected to [%s]:%d (IPv6) (local port %d)...\n", 
+             httpAddrString(&addr->addr, addrname, sizeof(addrname)),
+             ntohs(addr->addr.ipv6.sin6_port), lport);
+    else
+#endif /* AF_INET6 */
+      if (addr->addr.addr.sa_family == AF_INET)
+       fprintf(stderr, "DEBUG: Connected to %s:%d (IPv4) (local port %d)...\n",
+               httpAddrString(&addr->addr, addrname, sizeof(addrname)),
+               ntohs(addr->addr.ipv4.sin_port), lport);
 
    /*
     * Next, open the print file and figure out its size...
     */
 
-    if (stat(filename, &filestats))
+    if (print_fd)
     {
-      httpAddrFreeList(addrlist);
-      close(fd);
+     /*
+      * Use the size from the print file...
+      */
 
-      perror("ERROR: unable to stat print file");
-      return (CUPS_BACKEND_FAILED);
-    }
+      if (fstat(print_fd, &filestats))
+      {
+       httpAddrFreeList(addrlist);
+       close(fd);
 
-    filestats.st_size *= manual_copies;
+       perror("ERROR: unable to stat print file");
+       return (CUPS_BACKEND_FAILED);
+      }
 
-    if ((fp = fopen(filename, "rb")) == NULL)
+      filestats.st_size *= manual_copies;
+    }
+    else
     {
-      httpAddrFreeList(addrlist);
-      close(fd);
+     /*
+      * Use a "very large value" for the size so that the printer will
+      * keep printing until we close the connection...
+      */
 
-      perror("ERROR: unable to open print file for reading");
-      return (CUPS_BACKEND_FAILED);
+#ifdef _LARGEFILE_SOURCE
+      filestats.st_size = (size_t)(999999999999.0);
+#else
+      filestats.st_size = 2147483647;
+#endif /* _LARGEFILE_SOURCE */
     }
 
    /*
@@ -904,7 +964,7 @@ lpd_queue(const char *hostname,             /* I - Host to connect to */
         return (CUPS_BACKEND_FAILED);
       }
 
-      fprintf(stderr, "INFO: Sending control file (%u bytes)\n",
+      fprintf(stderr, _("INFO: Sending control file (%u bytes)\n"),
               (unsigned)strlen(control));
 
       if (lpd_write(fd, control, strlen(control) + 1) < (strlen(control) + 1))
@@ -918,8 +978,9 @@ lpd_queue(const char *hostname,             /* I - Host to connect to */
 
         if (read(fd, &status, 1) < 1)
        {
-         fprintf(stderr, "WARNING: Remote host did not respond with control "
-                         "status byte after %d seconds!\n", timeout);
+         fprintf(stderr,
+                 _("WARNING: Remote host did not respond with control "
+                   "status byte after %d seconds!\n"), timeout);
          status = errno;
        }
 
@@ -927,10 +988,11 @@ lpd_queue(const char *hostname,           /* I - Host to connect to */
       }
 
       if (status != 0)
-       fprintf(stderr, "ERROR: Remote host did not accept control file (%d)\n",
+       fprintf(stderr,
+               _("ERROR: Remote host did not accept control file (%d)\n"),
                status);
       else
-       fputs("INFO: Control file sent successfully\n", stderr);
+       fputs(_("INFO: Control file sent successfully\n"), stderr);
     }
     else
       status = 0;
@@ -951,17 +1013,22 @@ lpd_queue(const char *hostname,          /* I - Host to connect to */
         return (CUPS_BACKEND_FAILED);
       }
 
-      fprintf(stderr, "INFO: Sending data file (" CUPS_LLFMT " bytes)\n",
+      fprintf(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);
 
       tbytes = 0;
       for (copy = 0; copy < manual_copies; copy ++)
       {
-       rewind(fp);
+       lseek(print_fd, 0, SEEK_SET);
 
-       while ((nbytes = fread(buffer, 1, sizeof(buffer), fp)) > 0)
+       while ((nbytes = read(print_fd, buffer, sizeof(buffer))) > 0)
        {
-         fprintf(stderr, "INFO: Spooling LPR job, %.0f%% complete...\n",
+         fprintf(stderr, _("INFO: Spooling LPR job, %.0f%% complete...\n"),
                  100.0 * tbytes / filestats.st_size);
 
          if (lpd_write(fd, buffer, nbytes) < nbytes)
@@ -974,39 +1041,45 @@ lpd_queue(const char *hostname,          /* I - Host to connect to */
        }
       }
 
-      if (tbytes < filestats.st_size)
-       status = errno;
-      else if (lpd_write(fd, "", 1) < 1)
-      {
-        perror("ERROR: Unable to send trailing nul to printer");
-       status = errno;
-      }
-      else
+      if (mode == MODE_STANDARD)
       {
-       /*
-        * Read the status byte from the printer; if we can't read the byte
-       * back now, we should set status to "errno", however at this point
-       * we know the printer got the whole file and we don't necessarily
-       * want to requeue it over and over...
-       */
+       if (tbytes < filestats.st_size)
+         status = errno;
+       else if (lpd_write(fd, "", 1) < 1)
+       {
+          perror("ERROR: Unable to send trailing nul to printer");
+         status = errno;
+       }
+       else
+       {
+        /*
+          * Read the status byte from the printer; if we can't read the byte
+         * back now, we should set status to "errno", however at this point
+         * we know the printer got the whole file and we don't necessarily
+         * want to requeue it over and over...
+         */
 
-       alarm(timeout);
+         alarm(timeout);
 
-        if (recv(fd, &status, 1, 0) < 1)
-       {
-         fprintf(stderr, "WARNING: Remote host did not respond with data "
-                         "status byte after %d seconds!\n", timeout);
-         status = 0;
-        }
+          if (recv(fd, &status, 1, 0) < 1)
+         {
+           fprintf(stderr,
+                   _("WARNING: Remote host did not respond with data "
+                     "status byte after %d seconds!\n"), timeout);
+           status = 0;
+          }
 
-       alarm(0);
+         alarm(0);
+       }
       }
+      else
+        status = 0;
 
       if (status != 0)
-       fprintf(stderr, "ERROR: Remote host did not accept data file (%d)\n",
+       fprintf(stderr, _("ERROR: Remote host did not accept data file (%d)\n"),
                status);
       else
-       fputs("INFO: Data file sent successfully\n", stderr);
+       fputs(_("INFO: Data file sent successfully\n"), stderr);
     }
 
     if (status == 0 && order == ORDER_DATA_CONTROL)
@@ -1020,7 +1093,7 @@ lpd_queue(const char *hostname,           /* I - Host to connect to */
         return (CUPS_BACKEND_FAILED);
       }
 
-      fprintf(stderr, "INFO: Sending control file (%lu bytes)\n",
+      fprintf(stderr, _("INFO: Sending control file (%lu bytes)\n"),
               (unsigned long)strlen(control));
 
       if (lpd_write(fd, control, strlen(control) + 1) < (strlen(control) + 1))
@@ -1034,8 +1107,9 @@ lpd_queue(const char *hostname,           /* I - Host to connect to */
 
         if (read(fd, &status, 1) < 1)
        {
-         fprintf(stderr, "WARNING: Remote host did not respond with control "
-                         "status byte after %d seconds!\n", timeout);
+         fprintf(stderr,
+                 _("WARNING: Remote host did not respond with control "
+                   "status byte after %d seconds!\n"), timeout);
          status = errno;
        }
 
@@ -1043,10 +1117,11 @@ lpd_queue(const char *hostname,         /* I - Host to connect to */
       }
 
       if (status != 0)
-       fprintf(stderr, "ERROR: Remote host did not accept control file (%d)\n",
+       fprintf(stderr,
+               _("ERROR: Remote host did not accept control file (%d)\n"),
                status);
       else
-       fputs("INFO: Control file sent successfully\n", stderr);
+       fputs(_("INFO: Control file sent successfully\n"), stderr);
     }
 
    /*
@@ -1054,7 +1129,6 @@ lpd_queue(const char *hostname,           /* I - Host to connect to */
     */
 
     close(fd);
-    fclose(fp);
 
     if (status == 0)
     {
@@ -1231,5 +1305,5 @@ sigterm_handler(int sig)          /* I - Signal */
 
 
 /*
- * End of "$Id: lpd.c 5886 2006-08-24 19:53:17Z mike $".
+ * End of "$Id: lpd.c 6649 2007-07-11 21:46:42Z mike $".
  */