]> git.ipfire.org Git - thirdparty/cups.git/blobdiff - systemv/lpadmin.c
Load cups into easysw/current.
[thirdparty/cups.git] / systemv / lpadmin.c
index 2cfe3281919a63f9d1022b0152d8c46837d20a4b..8625f5a1505f3e3cd493107927356fac0d0fb139 100644 (file)
@@ -1,25 +1,16 @@
 /*
- * "$Id: lpadmin.c 5023 2006-01-29 14:39:44Z mike $"
+ * "$Id: lpadmin.c 6649 2007-07-11 21:46:42Z mike $"
  *
  *   "lpadmin" command for the Common UNIX Printing System (CUPS).
  *
+ *   Copyright 2007 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;
@@ -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;
@@ -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_OPERATION, IPP_TAG_NAME, "port-monitor",
+                   NULL, "bcp");
+    else if (!strcasecmp(protocol, "tbcp"))
+      ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "port-monitor",
+                   NULL, "tbcp");
+  }
 
   if (op == CUPS_ADD_PRINTER)
     ppdfile = cupsGetPPD(printer);
@@ -1808,6 +1833,10 @@ 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,
@@ -1830,20 +1859,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 +1878,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 +1929,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 +1977,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 6649 2007-07-11 21:46:42Z mike $".
  */