]> git.ipfire.org Git - thirdparty/cups.git/blobdiff - systemv/lpadmin.c
Merge changes from CUPS 1.5svn-r8849.
[thirdparty/cups.git] / systemv / lpadmin.c
index 2cfe3281919a63f9d1022b0152d8c46837d20a4b..81ed5bb9d7fb9886809eae68ac715863290f41d9 100644 (file)
@@ -1,25 +1,16 @@
 /*
- * "$Id: lpadmin.c 5023 2006-01-29 14:39:44Z mike $"
+ * "$Id: lpadmin.c 7720 2008-07-11 22:46:21Z mike $"
  *
  *   "lpadmin" command for the Common UNIX Printing System (CUPS).
  *
+ *   Copyright 2007-2009 by Apple Inc.
  *   Copyright 1997-2006 by Easy Software Products.
  *
  *   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
- *   "LICENSE.txt" 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
+ *   property of Apple Inc. and are protected by Federal copyright
+ *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ *   which should have been included with this file.  If this file is
+ *   file is missing or damaged, see the license at "http://www.cups.org/".
  *
  * Contents:
  *
@@ -92,6 +83,8 @@ main(int  argc,                       /* I - Number of command-line arguments */
   cups_option_t        *options;       /* Options */
 
 
+  _cupsSetLocale(argv);
+
   http        = NULL;
   printer     = NULL;
   num_options = 0;
@@ -121,7 +114,7 @@ main(int  argc,                     /* I - Number of command-line arguments */
              _cupsLangPuts(stderr,
                            _("lpadmin: Unable to add a printer to the class:\n"
                              "         You must specify a printer name "
-                             "first!\n"));
+                             "first\n"));
              return (1);
            }
 
@@ -135,7 +128,7 @@ main(int  argc,                     /* I - Number of command-line arguments */
              {
                _cupsLangPuts(stderr,
                              _("lpadmin: Expected class name after \'-c\' "
-                               "option!\n"));
+                               "option\n"));
                return (1);
              }
 
@@ -146,7 +139,7 @@ main(int  argc,                     /* I - Number of command-line arguments */
            {
              _cupsLangPuts(stderr,
                            _("lpadmin: Class name can only contain printable "
-                             "characters!\n"));
+                             "characters\n"));
              return (1);
            }
 
@@ -179,7 +172,7 @@ main(int  argc,                     /* I - Number of command-line arguments */
              {
                _cupsLangPuts(stderr,
                              _("lpadmin: Expected printer name after \'-d\' "
-                               "option!\n"));
+                               "option\n"));
                return (1);
              }
 
@@ -190,7 +183,7 @@ main(int  argc,                     /* I - Number of command-line arguments */
            {
              _cupsLangPuts(stderr,
                            _("lpadmin: Printer name can only contain "
-                             "printable characters!\n"));
+                             "printable characters\n"));
              return (1);
            }
 
@@ -217,7 +210,7 @@ main(int  argc,                     /* I - Number of command-line arguments */
              {
                _cupsLangPuts(stderr,
                              _("lpadmin: Expected hostname after \'-h\' "
-                               "option!\n"));
+                               "option\n"));
                return (1);
               }
 
@@ -245,7 +238,7 @@ main(int  argc,                     /* I - Number of command-line arguments */
              _cupsLangPuts(stderr,
                            _("lpadmin: Unable to set the interface script:\n"
                              "         You must specify a printer name "
-                             "first!\n"));
+                             "first\n"));
              return (1);
            }
 
@@ -262,7 +255,7 @@ main(int  argc,                     /* I - Number of command-line arguments */
              {
                _cupsLangPuts(stderr,
                              _("lpadmin: Expected interface after \'-i\' "
-                               "option!\n"));
+                               "option\n"));
                return (1);
              }
 
@@ -281,7 +274,7 @@ main(int  argc,                     /* I - Number of command-line arguments */
                httpEncryption(http, HTTP_ENCRYPT_REQUIRED);
 #else
               _cupsLangPrintf(stderr,
-                             _("%s: Sorry, no encryption support compiled in!\n"),
+                             _("%s: Sorry, no encryption support compiled in\n"),
                              argv[0]);
 #endif /* HAVE_SSL */
              break;
@@ -326,7 +319,7 @@ main(int  argc,                     /* I - Number of command-line arguments */
                            _("lpadmin: Unable to set the interface script or "
                              "PPD file:\n"
                              "         You must specify a printer name "
-                             "first!\n"));
+                             "first\n"));
              return (1);
            }
 
@@ -343,7 +336,7 @@ main(int  argc,                     /* I - Number of command-line arguments */
              {
                _cupsLangPuts(stderr,
                              _("lpadmin: Expected model after \'-m\' "
-                               "option!\n"));
+                               "option\n"));
                return (1);
              }
 
@@ -363,7 +356,7 @@ main(int  argc,                     /* I - Number of command-line arguments */
              {
                _cupsLangPuts(stderr,
                              _("lpadmin: Expected name=value after \'-o\' "
-                               "option!\n"));
+                               "option\n"));
                return (1);
              }
 
@@ -396,7 +389,7 @@ main(int  argc,                     /* I - Number of command-line arguments */
              {
                _cupsLangPuts(stderr,
                              _("lpadmin: Expected printer after \'-p\' "
-                               "option!\n"));
+                               "option\n"));
                return (1);
              }
 
@@ -407,7 +400,7 @@ main(int  argc,                     /* I - Number of command-line arguments */
            {
              _cupsLangPuts(stderr,
                            _("lpadmin: Printer name can only contain "
-                             "printable characters!\n"));
+                             "printable characters\n"));
              return (1);
            }
            break;
@@ -433,7 +426,7 @@ main(int  argc,                     /* I - Number of command-line arguments */
                            _("lpadmin: Unable to remove a printer from the "
                              "class:\n"
                              "         You must specify a printer name "
-                             "first!\n"));
+                             "first\n"));
              return (1);
            }
 
@@ -447,7 +440,7 @@ main(int  argc,                     /* I - Number of command-line arguments */
              {
                _cupsLangPuts(stderr,
                              _("lpadmin: Expected class after \'-r\' "
-                               "option!\n"));
+                               "option\n"));
                return (1);
              }
 
@@ -458,7 +451,7 @@ main(int  argc,                     /* I - Number of command-line arguments */
            {
              _cupsLangPuts(stderr,
                            _("lpadmin: Class name can only contain printable "
-                             "characters!\n"));
+                             "characters\n"));
              return (1);
            }
 
@@ -466,6 +459,25 @@ main(int  argc,                    /* I - Number of command-line arguments */
              return (1);
            break;
 
+        case 'U' : /* Username */
+           if (argv[i][2] != '\0')
+             cupsSetUser(argv[i] + 2);
+           else
+           {
+             i ++;
+             if (i >= argc)
+             {
+               _cupsLangPrintf(stderr,
+                               _("%s: Error - expected username after "
+                                 "\'-U\' option\n"),
+                               argv[0]);
+               return (1);
+             }
+
+              cupsSetUser(argv[i]);
+           }
+           break;
+           
         case 'u' : /* Allow/deny users */
            if (argv[i][2])
              val = argv[i] + 2;
@@ -477,7 +489,7 @@ main(int  argc,                     /* I - Number of command-line arguments */
              {
                _cupsLangPuts(stderr,
                              _("lpadmin: Expected allow/deny:userlist after "
-                               "\'-u\' option!\n"));
+                               "\'-u\' option\n"));
                return (1);
              }
 
@@ -493,7 +505,7 @@ main(int  argc,                     /* I - Number of command-line arguments */
             else
            {
              _cupsLangPrintf(stderr,
-                             _("lpadmin: Unknown allow/deny option \"%s\"!\n"),
+                             _("lpadmin: Unknown allow/deny option \"%s\"\n"),
                              val);
              return (1);
            }
@@ -519,7 +531,7 @@ main(int  argc,                     /* I - Number of command-line arguments */
              _cupsLangPuts(stderr,
                            _("lpadmin: Unable to set the device URI:\n"
                              "         You must specify a printer name "
-                             "first!\n"));
+                             "first\n"));
              return (1);
            }
 
@@ -536,7 +548,7 @@ main(int  argc,                     /* I - Number of command-line arguments */
              {
                _cupsLangPuts(stderr,
                              _("lpadmin: Expected device URI after \'-v\' "
-                               "option!\n"));
+                               "option\n"));
                return (1);
              }
 
@@ -570,7 +582,7 @@ main(int  argc,                     /* I - Number of command-line arguments */
              {
                _cupsLangPuts(stderr,
                              _("lpadmin: Expected printer or class after "
-                               "\'-x\' option!\n"));
+                               "\'-x\' option\n"));
                return (1);
              }
 
@@ -581,7 +593,7 @@ main(int  argc,                     /* I - Number of command-line arguments */
            {
              _cupsLangPuts(stderr,
                            _("lpadmin: Printer name can only contain "
-                             "printable characters!\n"));
+                             "printable characters\n"));
              return (1);
            }
 
@@ -612,7 +624,7 @@ main(int  argc,                     /* I - Number of command-line arguments */
                            _("lpadmin: Unable to set the printer "
                              "description:\n"
                              "         You must specify a printer name "
-                             "first!\n"));
+                             "first\n"));
              return (1);
            }
 
@@ -629,7 +641,7 @@ main(int  argc,                     /* I - Number of command-line arguments */
              {
                _cupsLangPuts(stderr,
                              _("lpadmin: Expected description after "
-                               "\'-D\' option!\n"));
+                               "\'-D\' option\n"));
                return (1);
              }
 
@@ -645,12 +657,12 @@ main(int  argc,                   /* I - Number of command-line arguments */
            {
              _cupsLangPuts(stderr,
                            _("lpadmin: Expected file type(s) after \'-I\' "
-                             "option!\n"));
+                             "option\n"));
              return (1);
            }
 
            _cupsLangPuts(stderr,
-                         _("lpadmin: Warning - content type list ignored!\n"));
+                         _("lpadmin: Warning - content type list ignored\n"));
            break;
            
         case 'L' : /* Set the printer-location attribute */
@@ -673,7 +685,7 @@ main(int  argc,                     /* I - Number of command-line arguments */
              _cupsLangPuts(stderr,
                            _("lpadmin: Unable to set the printer location:\n"
                              "         You must specify a printer name "
-                             "first!\n"));
+                             "first\n"));
              return (1);
            }
 
@@ -690,7 +702,7 @@ main(int  argc,                     /* I - Number of command-line arguments */
              {
                _cupsLangPuts(stderr,
                              _("lpadmin: Expected location after \'-L\' "
-                               "option!\n"));
+                               "option\n"));
                return (1);
              }
 
@@ -719,7 +731,7 @@ main(int  argc,                     /* I - Number of command-line arguments */
              _cupsLangPuts(stderr,
                            _("lpadmin: Unable to set the PPD file:\n"
                              "         You must specify a printer name "
-                             "first!\n"));
+                             "first\n"));
              return (1);
            }
 
@@ -735,7 +747,7 @@ main(int  argc,                     /* I - Number of command-line arguments */
              if (i >= argc)
              {
                _cupsLangPuts(stderr,
-                             _("lpadmin: Expected PPD after \'-P\' option!\n"));
+                             _("lpadmin: Expected PPD after \'-P\' option\n"));
                return (1);
              }
 
@@ -746,12 +758,12 @@ main(int  argc,                   /* I - Number of command-line arguments */
 
        default :
            _cupsLangPrintf(stderr,
-                           _("lpadmin: Unknown option \'%c\'!\n"), argv[i][1]);
+                           _("lpadmin: Unknown option \'%c\'\n"), argv[i][1]);
            return (1);
       }
     else
     {
-      _cupsLangPrintf(stderr, _("lpadmin: Unknown argument \'%s\'!\n"),
+      _cupsLangPrintf(stderr, _("lpadmin: Unknown argument \'%s\'\n"),
                       argv[i]);
       return (1);
     }
@@ -779,7 +791,7 @@ main(int  argc,                     /* I - Number of command-line arguments */
     {
       _cupsLangPuts(stderr,
                     _("lpadmin: Unable to set the printer options:\n"
-                     "         You must specify a printer name first!\n"));
+                     "         You must specify a printer name first\n"));
       return (1);
     }
 
@@ -902,12 +914,13 @@ add_printer_to_class(http_t *http,        /* I - Server connection */
     attr = ippAddStrings(request, IPP_TAG_PRINTER, IPP_TAG_URI,
                          "member-uris", members->num_values + 1, NULL, NULL);
     for (i = 0; i < members->num_values; i ++)
-      attr->values[i].string.text = strdup(members->values[i].string.text);
+      attr->values[i].string.text = _cupsStrAlloc(members->values[i].string.text);
 
-    attr->values[i].string.text = strdup(uri);
+    attr->values[i].string.text = _cupsStrAlloc(uri);
   }
   else
-    attr = ippAddString(request, IPP_TAG_PRINTER, IPP_TAG_URI, "member-uris", NULL, uri);
+    ippAddString(request, IPP_TAG_PRINTER, IPP_TAG_URI, "member-uris", NULL,
+                 uri);
 
  /*
   * Then send the request...
@@ -1112,7 +1125,7 @@ delete_printer_from_class(
 
   if ((members = ippFindAttribute(response, "member-names", IPP_TAG_NAME)) == NULL)
   {
-    _cupsLangPuts(stderr, _("lpadmin: No member names were seen!\n"));
+    _cupsLangPuts(stderr, _("lpadmin: No member names were seen\n"));
 
     ippDelete(response);
 
@@ -1177,7 +1190,8 @@ delete_printer_from_class(
 
     for (j = 0, k = 0; j < members->num_values; j ++)
       if (j != i)
-        attr->values[k ++].string.text = strdup(members->values[j].string.text);
+        attr->values[k ++].string.text =
+           _cupsStrAlloc(members->values[j].string.text);
   }
 
  /*
@@ -1436,9 +1450,7 @@ set_printer_file(http_t *http,            /* I - Server connection */
 
     if ((fd = cupsTempFd(tempfile, sizeof(tempfile))) < 0)
     {
-      _cupsLangPrintf(stderr,
-                      _("lpadmin: Unable to create temporary file: %s\n"),
-                     strerror(errno));
+      _cupsLangPrintError(_("ERROR: Unable to create temporary file"));
       return (1);
     }
 
@@ -1714,8 +1726,10 @@ set_printer_options(
                *response;              /* IPP Response */
   ipp_attribute_t *attr;               /* IPP attribute */
   ipp_op_t     op;                     /* Operation to perform */
-  const char   *val,                   /* Option value */
-               *ppdfile;               /* PPD filename */
+  const char   *ppdfile;               /* PPD filename */
+  int          ppdchanged;             /* PPD changed? */
+  ppd_file_t   *ppd;                   /* PPD file */
+  ppd_choice_t *choice;                /* Marked choice */
   char         uri[HTTP_MAX_URI],      /* URI for printer/class */
                line[1024],             /* Line from PPD file */
                keyword[1024],          /* Keyword from Default line */
@@ -1724,7 +1738,7 @@ set_printer_options(
   FILE         *in,                    /* PPD file */
                *out;                   /* Temporary file */
   int          outfd;                  /* Temporary file descriptor */
-  const char   *protocol;              /* Protocol */
+  const char   *protocol;              /* Old protocol option */
 
 
   DEBUG_printf(("set_printer_options(%p, \"%s\", %d, %p)\n", http, printer,
@@ -1763,7 +1777,8 @@ set_printer_options(
     * See what kind of printer or class it is...
     */
 
-    if ((attr = ippFindAttribute(response, "printer-type", IPP_TAG_ENUM)) != NULL)
+    if ((attr = ippFindAttribute(response, "printer-type",
+                                 IPP_TAG_ENUM)) != NULL)
     {
       if (attr->values[0].integer & (CUPS_PRINTER_CLASS | CUPS_PRINTER_IMPLICIT))
       {
@@ -1795,7 +1810,17 @@ set_printer_options(
   * Add the options...
   */
 
-  cupsEncodeOptions(request, num_options, options);
+  cupsEncodeOptions2(request, num_options, options, IPP_TAG_PRINTER);
+
+  if ((protocol = cupsGetOption("protocol", num_options, options)) != NULL)
+  {
+    if (!strcasecmp(protocol, "bcp"))
+      ippAddString(request, IPP_TAG_PRINTER, IPP_TAG_NAME, "port-monitor",
+                   NULL, "bcp");
+    else if (!strcasecmp(protocol, "tbcp"))
+      ippAddString(request, IPP_TAG_PRINTER, IPP_TAG_NAME, "port-monitor",
+                   NULL, "tbcp");
+  }
 
   if (op == CUPS_ADD_PRINTER)
     ppdfile = cupsGetPPD(printer);
@@ -1808,11 +1833,13 @@ set_printer_options(
     * Set default options in the PPD file...
     */
 
+    ppd = ppdOpenFile(ppdfile);
+    ppdMarkDefaults(ppd);
+    cupsMarkOptions(ppd, num_options, options);
+
     if ((outfd = cupsTempFd(tempfile, sizeof(tempfile))) < 0)
     {
-      _cupsLangPrintf(stderr,
-                      _("lpadmin: Unable to create temporary file - %s\n"),
-                     strerror(errno));
+      _cupsLangPrintError(_("ERROR: Unable to create temporary file"));
       ippDelete(request);
       unlink(ppdfile);
       return (1);
@@ -1830,20 +1857,12 @@ set_printer_options(
       return (1);
     }
 
-    out      = fdopen(outfd, "wb");
-    protocol = cupsGetOption("protocol", num_options, options);    
+    out        = fdopen(outfd, "wb");
+    ppdchanged = 0;
 
     while (get_line(line, sizeof(line), in) != NULL)
     {
-      if (!strncmp(line, "*cupsProtocol:", 14) && protocol)
-      {
-       /*
-        * Set a new output protocol (BCP or TBCP) below...
-       */
-
-        continue;
-      }
-      else if (strncmp(line, "*Default", 8))
+      if (strncmp(line, "*Default", 8))
         fprintf(out, "%s\n", line);
       else
       {
@@ -1857,32 +1876,42 @@ set_printer_options(
          if (*keyptr == ':' || isspace(*keyptr & 255))
            break;
 
-        *keyptr = '\0';
-
-        if (!strcmp(keyword, "PageRegion"))
-         val = cupsGetOption("PageSize", num_options, options);
+        *keyptr++ = '\0';
+        while (isspace(*keyptr & 255))
+         keyptr ++;
+
+        if (!strcmp(keyword, "PageRegion") ||
+           !strcmp(keyword, "PageSize") ||
+           !strcmp(keyword, "PaperDimension") ||
+           !strcmp(keyword, "ImageableArea"))
+       {
+         if ((choice = ppdFindMarkedChoice(ppd, "PageSize")) == NULL)
+           choice = ppdFindMarkedChoice(ppd, "PageRegion");
+        }
        else
-         val = cupsGetOption(keyword, num_options, options);
+         choice = ppdFindMarkedChoice(ppd, keyword);
 
-        if (val != NULL)
-         fprintf(out, "*Default%s: %s\n", keyword, val);
+        if (choice && strcmp(choice->choice, keyptr))
+       {
+         fprintf(out, "*Default%s: %s\n", keyword, choice->choice);
+         ppdchanged = 1;
+       }
        else
          fprintf(out, "%s\n", line);
       }
     }
 
-    if (protocol)
-      fprintf(out, "*cupsProtocol: \"%s\"\n", protocol);
-
     fclose(in);
     fclose(out);
     close(outfd);
+    ppdClose(ppd);
 
    /*
     * Do the request...
     */
 
-    response = cupsDoFileRequest(http, request, "/admin/", tempfile);
+    ippDelete(cupsDoFileRequest(http, request, "/admin/",
+                                ppdchanged ? tempfile : NULL));
 
    /*
     * Clean up temp files... (TODO: catch signals in case we CTRL-C during
@@ -1898,14 +1927,13 @@ set_printer_options(
     * No PPD file - just set the options...
     */
 
-    response = cupsDoRequest(http, request, "/admin/");
+    ippDelete(cupsDoRequest(http, request, "/admin/"));
   }
 
  /*
   * Check the response...
   */
 
-  ippDelete(response);
   if (cupsLastError() > IPP_OK_CONFLICT)
   {
     _cupsLangPrintf(stderr, "lpadmin: %s\n", cupsLastErrorString());
@@ -1947,5 +1975,5 @@ validate_name(const char *name)           /* I - Name to check */
 
 
 /*
- * End of "$Id: lpadmin.c 5023 2006-01-29 14:39:44Z mike $".
+ * End of "$Id: lpadmin.c 7720 2008-07-11 22:46:21Z mike $".
  */