~ubuntu-branches/ubuntu/utopic/cups/utopic

« back to all changes in this revision

Viewing changes to .pc/color-management-extension.patch/cgi-bin/printers.c

  • Committer: Package Import Robot
  • Author(s): Didier Raboud, Till Kamppeter, Steve Langasek, Didier Raboud
  • Date: 2014-01-03 18:42:39 UTC
  • mfrom: (1.3.2)
  • mto: This revision was merged to the branch mainline in revision 142.
  • Revision ID: package-import@ubuntu.com-20140103184239-juzq32ckr7ra49b3
* New 1.7.0 upstream release

[ Till Kamppeter ]
* Refresh most patches with quilt
* Removed usb-backend-do-not-crash-if-usb-disabled-in-bios and
  cupsd-no-crash-on-avahi-threaded-poll-shutdown patches as they got
  applied upstream
* Removed drop-arch-specifics-from-doc patch as it is not needed
  anymore
* Updated drop_unnecessary_dependencies, manpage-hyphen-minus,
  manpage-translations and ppd-poll-with-client-conf patches manually
  to apply to the new CUPS version
* Added error counting exception from
  usb-backend-do-not-crash-if-usb-disabled-in-bios to
  tests-ignore-warnings
* Install the newly added ippfind utility and its manpage in
  cups-client
* Added pwg.h to libcups2-dev package
* Call dh_auto_clean only if the file Makedefs is present, to avoid a
  FTBFS
* Added color management extensions from Joe Simon's GSoC 2013
  project.
* Patch cups-files.conf to activate CUPS daemon syncing of files when
  closing, so that config files (like printers.conf) do not
  mysteriously disappear (LP: #1157972)
* In the AppArmor profile, allow execution of programs in
  /etc/cups/interfaces/, needed to make CUPS working with queues based
  on System V interface scripts, especially PPD-less queues
  auto-generated by cups-browsed from cups-filters 1.0.41 on.
* Silenced AppArmor noise from udev.conf in syslog (LP: #1229766)

[ Steve Langasek ]
* Add cups-filters (>= 1.0.42) as alternative to foomatic-filters
  (which is deprecated) in package relationships

[ Didier Raboud ]
* Remove Roger Leigh from uploaders on his request with thanks for his
  past work!
* Switch avahi LSB Should-Start dependency to be avahi-daemon; also
  bump package relationship to >= 0.6.31-3~ (Closes: #731608)
* Refresh the manpage translation files
* Move the USB backend quirk rules file to cups-server-common
* Add 38 new 1.7.0 libcups2 symbols
* Mark one C++ libcupsppdc1 symbol as optional as it isn't exported in
  1.7.0 anymore
* Import Fedora patches:
  - to avoid sign-extending CRCs in gz decompression
  - to build with full read-only relocations
  - to fix job history logging (upstream patch)
  - to set the internal default for SyncOnClose to Yes, instead of
    only configuring it to Yes
  - to fix a stringpool corruption issue
  - to prevent USB timeouts causing incorrect print output
* Import Fedora patch updates:
  - to dont-use-dbus-from-two-threads patch so it removes a call to
    avahi_threaded_poll_stop()
  - to avoid_stale_lockfile_in_dbus_notifier patch to call _exit when
    handling SIGTERM
* Move manpage-translations patch at the very end of the patch series
  to have it include all our patches

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 * "$Id: printers.c 10996 2013-05-29 11:51:34Z msweet $"
 
3
 *
 
4
 *   Printer status CGI for CUPS.
 
5
 *
 
6
 *   Copyright 2007-2012 by Apple Inc.
 
7
 *   Copyright 1997-2006 by Easy Software Products.
 
8
 *
 
9
 *   These coded instructions, statements, and computer programs are the
 
10
 *   property of Apple Inc. and are protected by Federal copyright
 
11
 *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
 
12
 *   which should have been included with this file.  If this file is
 
13
 *   file is missing or damaged, see the license at "http://www.cups.org/".
 
14
 *
 
15
 * Contents:
 
16
 *
 
17
 *   main()              - Main entry for CGI.
 
18
 *   do_printer_op()     - Do a printer operation.
 
19
 *   show_all_printers() - Show all printers...
 
20
 *   show_printer()      - Show a single printer.
 
21
 */
 
22
 
 
23
/*
 
24
 * Include necessary headers...
 
25
 */
 
26
 
 
27
#include "cgi-private.h"
 
28
#include <errno.h>
 
29
 
 
30
 
 
31
/*
 
32
 * Local functions...
 
33
 */
 
34
 
 
35
static void     do_printer_op(http_t *http, const char *printer, ipp_op_t op,
 
36
                              const char *title);
 
37
static void     show_all_printers(http_t *http, const char *username);
 
38
static void     show_printer(http_t *http, const char *printer);
 
39
 
 
40
 
 
41
/*
 
42
 * 'main()' - Main entry for CGI.
 
43
 */
 
44
 
 
45
int                                     /* O - Exit status */
 
46
main(int  argc,                         /* I - Number of command-line arguments */
 
47
     char *argv[])                      /* I - Command-line arguments */
 
48
{
 
49
  const char    *printer;               /* Printer name */
 
50
  const char    *user;                  /* Username */
 
51
  http_t        *http;                  /* Connection to the server */
 
52
  ipp_t         *request,               /* IPP request */
 
53
                *response;              /* IPP response */
 
54
  ipp_attribute_t *attr;                /* IPP attribute */
 
55
  const char    *op;                    /* Operation to perform, if any */
 
56
  static const char *def_attrs[] =      /* Attributes for default printer */
 
57
                {
 
58
                  "printer-name",
 
59
                  "printer-uri-supported"
 
60
                };
 
61
 
 
62
 
 
63
 /*
 
64
  * Get any form variables...
 
65
  */
 
66
 
 
67
  cgiInitialize();
 
68
 
 
69
  op = cgiGetVariable("OP");
 
70
 
 
71
 /*
 
72
  * Set the web interface section...
 
73
  */
 
74
 
 
75
  cgiSetVariable("SECTION", "printers");
 
76
  cgiSetVariable("REFRESH_PAGE", "");
 
77
 
 
78
 /*
 
79
  * See if we are displaying a printer or all printers...
 
80
  */
 
81
 
 
82
  if ((printer = getenv("PATH_INFO")) != NULL)
 
83
  {
 
84
    printer ++;
 
85
 
 
86
    if (!*printer)
 
87
      printer = NULL;
 
88
 
 
89
    if (printer)
 
90
      cgiSetVariable("PRINTER_NAME", printer);
 
91
  }
 
92
 
 
93
 /*
 
94
  * See who is logged in...
 
95
  */
 
96
 
 
97
  user = getenv("REMOTE_USER");
 
98
 
 
99
 /*
 
100
  * Connect to the HTTP server...
 
101
  */
 
102
 
 
103
  http = httpConnectEncrypt(cupsServer(), ippPort(), cupsEncryption());
 
104
 
 
105
 /*
 
106
  * Get the default printer...
 
107
  */
 
108
 
 
109
  if (!op || !cgiIsPOST())
 
110
  {
 
111
   /*
 
112
    * Get the default destination...
 
113
    */
 
114
 
 
115
    request = ippNewRequest(CUPS_GET_DEFAULT);
 
116
 
 
117
    ippAddStrings(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD,
 
118
                  "requested-attributes",
 
119
                  sizeof(def_attrs) / sizeof(def_attrs[0]), NULL, def_attrs);
 
120
 
 
121
    if ((response = cupsDoRequest(http, request, "/")) != NULL)
 
122
    {
 
123
      if ((attr = ippFindAttribute(response, "printer-name", IPP_TAG_NAME)) != NULL)
 
124
        cgiSetVariable("DEFAULT_NAME", attr->values[0].string.text);
 
125
 
 
126
      if ((attr = ippFindAttribute(response, "printer-uri-supported", IPP_TAG_URI)) != NULL)
 
127
      {
 
128
        char    url[HTTP_MAX_URI];      /* New URL */
 
129
 
 
130
 
 
131
        cgiSetVariable("DEFAULT_URI",
 
132
                       cgiRewriteURL(attr->values[0].string.text,
 
133
                                     url, sizeof(url), NULL));
 
134
      }
 
135
 
 
136
      ippDelete(response);
 
137
    }
 
138
 
 
139
   /*
 
140
    * See if we need to show a list of printers or the status of a
 
141
    * single printer...
 
142
    */
 
143
 
 
144
    if (!printer)
 
145
      show_all_printers(http, user);
 
146
    else
 
147
      show_printer(http, printer);
 
148
  }
 
149
  else if (printer)
 
150
  {
 
151
    if (!*op)
 
152
    {
 
153
      const char *server_port = getenv("SERVER_PORT");
 
154
                                        /* Port number string */
 
155
      int       port = atoi(server_port ? server_port : "0");
 
156
                                        /* Port number */
 
157
      char      uri[1024];              /* URL */
 
158
 
 
159
      httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri),
 
160
                       getenv("HTTPS") ? "https" : "http", NULL,
 
161
                       getenv("SERVER_NAME"), port, "/printers/%s", printer);
 
162
 
 
163
      printf("Location: %s\n\n", uri);
 
164
    }
 
165
    else if (!strcmp(op, "start-printer"))
 
166
      do_printer_op(http, printer, IPP_RESUME_PRINTER,
 
167
                    cgiText(_("Resume Printer")));
 
168
    else if (!strcmp(op, "stop-printer"))
 
169
      do_printer_op(http, printer, IPP_PAUSE_PRINTER,
 
170
                    cgiText(_("Pause Printer")));
 
171
    else if (!strcmp(op, "accept-jobs"))
 
172
      do_printer_op(http, printer, CUPS_ACCEPT_JOBS, cgiText(_("Accept Jobs")));
 
173
    else if (!strcmp(op, "reject-jobs"))
 
174
      do_printer_op(http, printer, CUPS_REJECT_JOBS, cgiText(_("Reject Jobs")));
 
175
    else if (!strcmp(op, "purge-jobs"))
 
176
      do_printer_op(http, printer, IPP_PURGE_JOBS, cgiText(_("Purge Jobs")));
 
177
    else if (!_cups_strcasecmp(op, "print-self-test-page"))
 
178
      cgiPrintCommand(http, printer, "PrintSelfTestPage",
 
179
                      cgiText(_("Print Self-Test Page")));
 
180
    else if (!_cups_strcasecmp(op, "clean-print-heads"))
 
181
      cgiPrintCommand(http, printer, "Clean all",
 
182
                      cgiText(_("Clean Print Heads")));
 
183
    else if (!_cups_strcasecmp(op, "print-test-page"))
 
184
      cgiPrintTestPage(http, printer);
 
185
    else if (!_cups_strcasecmp(op, "move-jobs"))
 
186
      cgiMoveJobs(http, printer, 0);
 
187
    else
 
188
    {
 
189
     /*
 
190
      * Unknown/bad operation...
 
191
      */
 
192
 
 
193
      cgiStartHTML(printer);
 
194
      cgiCopyTemplateLang("error-op.tmpl");
 
195
      cgiEndHTML();
 
196
    }
 
197
  }
 
198
  else
 
199
  {
 
200
   /*
 
201
    * Unknown/bad operation...
 
202
    */
 
203
 
 
204
    cgiStartHTML(cgiText(_("Printers")));
 
205
    cgiCopyTemplateLang("error-op.tmpl");
 
206
    cgiEndHTML();
 
207
  }
 
208
 
 
209
 /*
 
210
  * Close the HTTP server connection...
 
211
  */
 
212
 
 
213
  httpClose(http);
 
214
 
 
215
 /*
 
216
  * Return with no errors...
 
217
  */
 
218
 
 
219
  return (0);
 
220
}
 
221
 
 
222
 
 
223
/*
 
224
 * 'do_printer_op()' - Do a printer operation.
 
225
 */
 
226
 
 
227
static void
 
228
do_printer_op(http_t      *http,        /* I - HTTP connection */
 
229
              const char  *printer,     /* I - Printer name */
 
230
              ipp_op_t    op,           /* I - Operation to perform */
 
231
              const char  *title)       /* I - Title of page */
 
232
{
 
233
  ipp_t         *request;               /* IPP request */
 
234
  char          uri[HTTP_MAX_URI],      /* Printer URI */
 
235
                resource[HTTP_MAX_URI]; /* Path for request */
 
236
 
 
237
 
 
238
 /*
 
239
  * Build a printer request, which requires the following
 
240
  * attributes:
 
241
  *
 
242
  *    attributes-charset
 
243
  *    attributes-natural-language
 
244
  *    printer-uri
 
245
  */
 
246
 
 
247
  request = ippNewRequest(op);
 
248
 
 
249
  httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp", NULL,
 
250
                   "localhost", 0, "/printers/%s", printer);
 
251
  ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri",
 
252
               NULL, uri);
 
253
 
 
254
 /*
 
255
  * Do the request and get back a response...
 
256
  */
 
257
 
 
258
  snprintf(resource, sizeof(resource), "/printers/%s", printer);
 
259
  ippDelete(cupsDoRequest(http, request, resource));
 
260
 
 
261
  if (cupsLastError() == IPP_NOT_AUTHORIZED)
 
262
  {
 
263
    puts("Status: 401\n");
 
264
    exit(0);
 
265
  }
 
266
  else if (cupsLastError() > IPP_OK_CONFLICT)
 
267
  {
 
268
    cgiStartHTML(title);
 
269
    cgiShowIPPError(_("Unable to do maintenance command"));
 
270
  }
 
271
  else
 
272
  {
 
273
   /*
 
274
    * Redirect successful updates back to the printer page...
 
275
    */
 
276
 
 
277
    char        url[1024],              /* Printer/class URL */
 
278
                refresh[1024];          /* Refresh URL */
 
279
 
 
280
 
 
281
    cgiRewriteURL(uri, url, sizeof(url), NULL);
 
282
    cgiFormEncode(uri, url, sizeof(uri));
 
283
    snprintf(refresh, sizeof(refresh), "5;URL=%s", uri);
 
284
    cgiSetVariable("refresh_page", refresh);
 
285
 
 
286
    cgiStartHTML(title);
 
287
 
 
288
    if (op == IPP_PAUSE_PRINTER)
 
289
      cgiCopyTemplateLang("printer-stop.tmpl");
 
290
    else if (op == IPP_RESUME_PRINTER)
 
291
      cgiCopyTemplateLang("printer-start.tmpl");
 
292
    else if (op == CUPS_ACCEPT_JOBS)
 
293
      cgiCopyTemplateLang("printer-accept.tmpl");
 
294
    else if (op == CUPS_REJECT_JOBS)
 
295
      cgiCopyTemplateLang("printer-reject.tmpl");
 
296
    else if (op == IPP_PURGE_JOBS)
 
297
      cgiCopyTemplateLang("printer-purge.tmpl");
 
298
  }
 
299
 
 
300
  cgiEndHTML();
 
301
}
 
302
 
 
303
 
 
304
/*
 
305
 * 'show_all_printers()' - Show all printers...
 
306
 */
 
307
 
 
308
static void
 
309
show_all_printers(http_t     *http,     /* I - Connection to server */
 
310
                  const char *user)     /* I - Username */
 
311
{
 
312
  int                   i;              /* Looping var */
 
313
  ipp_t                 *request,       /* IPP request */
 
314
                        *response;      /* IPP response */
 
315
  cups_array_t          *printers;      /* Array of printer objects */
 
316
  ipp_attribute_t       *printer;       /* Printer object */
 
317
  int                   ascending,      /* Order of printers (0 = descending) */
 
318
                        first,          /* First printer to show */
 
319
                        count;          /* Number of printers */
 
320
  const char            *var;           /* Form variable */
 
321
  void                  *search;        /* Search data */
 
322
  char                  val[1024];      /* Form variable */
 
323
 
 
324
 
 
325
  fprintf(stderr, "DEBUG: show_all_printers(http=%p, user=\"%s\")\n",
 
326
          http, user ? user : "(null)");
 
327
 
 
328
 /*
 
329
  * Show the standard header...
 
330
  */
 
331
 
 
332
  cgiStartHTML(cgiText(_("Printers")));
 
333
 
 
334
 /*
 
335
  * Build a CUPS_GET_PRINTERS request, which requires the following
 
336
  * attributes:
 
337
  *
 
338
  *    attributes-charset
 
339
  *    attributes-natural-language
 
340
  *    printer-type
 
341
  *    printer-type-mask
 
342
  *    requesting-user-name
 
343
  */
 
344
 
 
345
  request = ippNewRequest(CUPS_GET_PRINTERS);
 
346
 
 
347
  ippAddInteger(request, IPP_TAG_OPERATION, IPP_TAG_ENUM,
 
348
                "printer-type", 0);
 
349
  ippAddInteger(request, IPP_TAG_OPERATION, IPP_TAG_ENUM,
 
350
                "printer-type-mask", CUPS_PRINTER_CLASS);
 
351
 
 
352
  if (user)
 
353
    ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME,
 
354
                 "requesting-user-name", NULL, user);
 
355
 
 
356
  cgiGetAttributes(request, "printers.tmpl");
 
357
 
 
358
 /*
 
359
  * Do the request and get back a response...
 
360
  */
 
361
 
 
362
  if ((response = cupsDoRequest(http, request, "/")) != NULL)
 
363
  {
 
364
   /*
 
365
    * Get a list of matching job objects.
 
366
    */
 
367
 
 
368
    if ((var = cgiGetVariable("QUERY")) != NULL &&
 
369
        !cgiGetVariable("CLEAR"))
 
370
      search = cgiCompileSearch(var);
 
371
    else
 
372
      search = NULL;
 
373
 
 
374
    printers  = cgiGetIPPObjects(response, search);
 
375
    count     = cupsArrayCount(printers);
 
376
 
 
377
    if (search)
 
378
      cgiFreeSearch(search);
 
379
 
 
380
   /*
 
381
    * Figure out which printers to display...
 
382
    */
 
383
 
 
384
    if ((var = cgiGetVariable("FIRST")) != NULL)
 
385
      first = atoi(var);
 
386
    else
 
387
      first = 0;
 
388
 
 
389
    if (first >= count)
 
390
      first = count - CUPS_PAGE_MAX;
 
391
 
 
392
    first = (first / CUPS_PAGE_MAX) * CUPS_PAGE_MAX;
 
393
 
 
394
    if (first < 0)
 
395
      first = 0;
 
396
 
 
397
    sprintf(val, "%d", count);
 
398
    cgiSetVariable("TOTAL", val);
 
399
 
 
400
    if ((var = cgiGetVariable("ORDER")) != NULL && *var)
 
401
      ascending = !_cups_strcasecmp(var, "asc");
 
402
    else
 
403
      ascending = 1;
 
404
 
 
405
    if (ascending)
 
406
    {
 
407
      for (i = 0, printer = (ipp_attribute_t *)cupsArrayIndex(printers, first);
 
408
           i < CUPS_PAGE_MAX && printer;
 
409
           i ++, printer = (ipp_attribute_t *)cupsArrayNext(printers))
 
410
        cgiSetIPPObjectVars(printer, NULL, i);
 
411
    }
 
412
    else
 
413
    {
 
414
      for (i = 0, printer = (ipp_attribute_t *)cupsArrayIndex(printers, count - first - 1);
 
415
           i < CUPS_PAGE_MAX && printer;
 
416
           i ++, printer = (ipp_attribute_t *)cupsArrayPrev(printers))
 
417
        cgiSetIPPObjectVars(printer, NULL, i);
 
418
    }
 
419
 
 
420
   /*
 
421
    * Save navigation URLs...
 
422
    */
 
423
 
 
424
    cgiSetVariable("THISURL", "/printers/");
 
425
 
 
426
    if (first > 0)
 
427
    {
 
428
      sprintf(val, "%d", first - CUPS_PAGE_MAX);
 
429
      cgiSetVariable("PREV", val);
 
430
    }
 
431
 
 
432
    if ((first + CUPS_PAGE_MAX) < count)
 
433
    {
 
434
      sprintf(val, "%d", first + CUPS_PAGE_MAX);
 
435
      cgiSetVariable("NEXT", val);
 
436
    }
 
437
 
 
438
   /*
 
439
    * Then show everything...
 
440
    */
 
441
 
 
442
    cgiCopyTemplateLang("search.tmpl");
 
443
 
 
444
    cgiCopyTemplateLang("printers-header.tmpl");
 
445
 
 
446
    if (count > CUPS_PAGE_MAX)
 
447
      cgiCopyTemplateLang("pager.tmpl");
 
448
 
 
449
    cgiCopyTemplateLang("printers.tmpl");
 
450
 
 
451
    if (count > CUPS_PAGE_MAX)
 
452
      cgiCopyTemplateLang("pager.tmpl");
 
453
 
 
454
   /*
 
455
    * Delete the response...
 
456
    */
 
457
 
 
458
    cupsArrayDelete(printers);
 
459
    ippDelete(response);
 
460
  }
 
461
  else
 
462
  {
 
463
   /*
 
464
    * Show the error...
 
465
    */
 
466
 
 
467
    cgiShowIPPError(_("Unable to get printer list"));
 
468
  }
 
469
 
 
470
   cgiEndHTML();
 
471
}
 
472
 
 
473
 
 
474
/*
 
475
 * 'show_printer()' - Show a single printer.
 
476
 */
 
477
 
 
478
static void
 
479
show_printer(http_t     *http,          /* I - Connection to server */
 
480
             const char *printer)       /* I - Name of printer */
 
481
{
 
482
  ipp_t         *request,               /* IPP request */
 
483
                *response;              /* IPP response */
 
484
  ipp_attribute_t *attr;                /* IPP attribute */
 
485
  char          uri[HTTP_MAX_URI];      /* Printer URI */
 
486
  char          refresh[1024];          /* Refresh URL */
 
487
 
 
488
 
 
489
  fprintf(stderr, "DEBUG: show_printer(http=%p, printer=\"%s\")\n",
 
490
          http, printer ? printer : "(null)");
 
491
 
 
492
 /*
 
493
  * Build an IPP_GET_PRINTER_ATTRIBUTES request, which requires the following
 
494
  * attributes:
 
495
  *
 
496
  *    attributes-charset
 
497
  *    attributes-natural-language
 
498
  *    printer-uri
 
499
  */
 
500
 
 
501
  request = ippNewRequest(IPP_GET_PRINTER_ATTRIBUTES);
 
502
 
 
503
  httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp", NULL,
 
504
                   "localhost", 0, "/printers/%s", printer);
 
505
  ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL,
 
506
               uri);
 
507
 
 
508
  cgiGetAttributes(request, "printer.tmpl");
 
509
 
 
510
 /*
 
511
  * Do the request and get back a response...
 
512
  */
 
513
 
 
514
  if ((response = cupsDoRequest(http, request, "/")) != NULL)
 
515
  {
 
516
   /*
 
517
    * Got the result; set the CGI variables and check the status of a
 
518
    * single-queue request...
 
519
    */
 
520
 
 
521
    cgiSetIPPVars(response, NULL, NULL, NULL, 0);
 
522
 
 
523
    if (printer && (attr = ippFindAttribute(response, "printer-state",
 
524
                                            IPP_TAG_ENUM)) != NULL &&
 
525
        attr->values[0].integer == IPP_PRINTER_PROCESSING)
 
526
    {
 
527
     /*
 
528
      * Printer is processing - automatically refresh the page until we
 
529
      * are done printing...
 
530
      */
 
531
 
 
532
      cgiFormEncode(uri, printer, sizeof(uri));
 
533
      snprintf(refresh, sizeof(refresh), "10;URL=/printers/%s", uri);
 
534
      cgiSetVariable("refresh_page", refresh);
 
535
    }
 
536
 
 
537
   /*
 
538
    * Delete the response...
 
539
    */
 
540
 
 
541
    ippDelete(response);
 
542
 
 
543
   /*
 
544
    * Show the standard header...
 
545
    */
 
546
 
 
547
    cgiStartHTML(printer);
 
548
 
 
549
   /*
 
550
    * Show the printer status...
 
551
    */
 
552
 
 
553
    cgiCopyTemplateLang("printer.tmpl");
 
554
 
 
555
   /*
 
556
    * Show jobs for the specified printer...
 
557
    */
 
558
 
 
559
    cgiCopyTemplateLang("printer-jobs-header.tmpl");
 
560
    cgiShowJobs(http, printer);
 
561
  }
 
562
  else
 
563
  {
 
564
   /*
 
565
    * Show the IPP error...
 
566
    */
 
567
 
 
568
    cgiStartHTML(printer);
 
569
    cgiShowIPPError(_("Unable to get printer status"));
 
570
  }
 
571
 
 
572
   cgiEndHTML();
 
573
}
 
574
 
 
575
 
 
576
/*
 
577
 * End of "$Id: printers.c 10996 2013-05-29 11:51:34Z msweet $".
 
578
 */