/*
- * "$Id: printers.c 6889 2007-08-29 22:23:35Z mike $"
+ * Printer status CGI for CUPS.
*
- * Printer status CGI for the Common UNIX Printing System (CUPS).
+ * Copyright 2007-2016 by Apple Inc.
+ * Copyright 1997-2006 by Easy Software Products.
*
- * Copyright 2007-2008 by Apple Inc.
- * Copyright 1997-2006 by Easy Software Products.
- *
- * These coded instructions, statements, and computer programs are the
- * 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:
- *
- * main() - Main entry for CGI.
- * print_command() - Send a print command to the printer.
- * show_all_printers() - Show all printers...
- * show_printer() - Show a single printer.
+ * Licensed under Apache License v2.0. See the file "LICENSE" for more information.
*/
/*
* Local functions...
*/
-void print_command(http_t *http, const char *printer, const char *command);
-void show_all_printers(http_t *http, const char *username);
-void show_printer(http_t *http, const char *printer);
+static void do_printer_op(http_t *http, const char *printer, ipp_op_t op,
+ const char *title);
+static void show_all_printers(http_t *http, const char *username);
+static void show_printer(http_t *http, const char *printer);
/*
*/
int /* O - Exit status */
-main(int argc, /* I - Number of command-line arguments */
- char *argv[]) /* I - Command-line arguments */
+main(void)
{
const char *printer; /* Printer name */
const char *user; /* Username */
*/
cgiSetVariable("SECTION", "printers");
+ cgiSetVariable("REFRESH_PAGE", "");
/*
* See if we are displaying a printer or all printers...
if (!*printer)
printer = NULL;
+
+ if (printer)
+ cgiSetVariable("PRINTER_NAME", printer);
}
/*
else
show_printer(http, printer);
}
- else if (!strcasecmp(op, "print-self-test-page") && printer)
- print_command(http, printer, "PrintSelfTestPage");
- else if (!strcasecmp(op, "clean-print-heads") && printer)
- print_command(http, printer, "Clean all");
- else if (!strcasecmp(op, "print-test-page") && printer)
- cgiPrintTestPage(http, printer);
- else if (!strcasecmp(op, "move-jobs") && printer)
- cgiMoveJobs(http, printer, 0);
+ else if (printer)
+ {
+ if (!*op)
+ {
+ const char *server_port = getenv("SERVER_PORT");
+ /* Port number string */
+ int port = atoi(server_port ? server_port : "0");
+ /* Port number */
+ char uri[1024]; /* URL */
+
+ httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri),
+ getenv("HTTPS") ? "https" : "http", NULL,
+ getenv("SERVER_NAME"), port, "/printers/%s", printer);
+
+ printf("Location: %s\n\n", uri);
+ }
+ else if (!strcmp(op, "start-printer"))
+ do_printer_op(http, printer, IPP_RESUME_PRINTER,
+ cgiText(_("Resume Printer")));
+ else if (!strcmp(op, "stop-printer"))
+ do_printer_op(http, printer, IPP_PAUSE_PRINTER,
+ cgiText(_("Pause Printer")));
+ else if (!strcmp(op, "accept-jobs"))
+ do_printer_op(http, printer, CUPS_ACCEPT_JOBS, cgiText(_("Accept Jobs")));
+ else if (!strcmp(op, "reject-jobs"))
+ do_printer_op(http, printer, CUPS_REJECT_JOBS, cgiText(_("Reject Jobs")));
+ else if (!strcmp(op, "cancel-jobs"))
+ do_printer_op(http, printer, IPP_OP_CANCEL_JOBS, cgiText(_("Cancel Jobs")));
+ else if (!_cups_strcasecmp(op, "print-self-test-page"))
+ cgiPrintCommand(http, printer, "PrintSelfTestPage",
+ cgiText(_("Print Self-Test Page")));
+ else if (!_cups_strcasecmp(op, "clean-print-heads"))
+ cgiPrintCommand(http, printer, "Clean all",
+ cgiText(_("Clean Print Heads")));
+ else if (!_cups_strcasecmp(op, "print-test-page"))
+ cgiPrintTestPage(http, printer);
+ else if (!_cups_strcasecmp(op, "move-jobs"))
+ cgiMoveJobs(http, printer, 0);
+ else
+ {
+ /*
+ * Unknown/bad operation...
+ */
+
+ cgiStartHTML(printer);
+ cgiCopyTemplateLang("error-op.tmpl");
+ cgiEndHTML();
+ }
+ }
else
{
/*
* Unknown/bad operation...
*/
- if (printer)
- cgiStartHTML(printer);
- else
- cgiStartHTML(cgiText(_("Printers")));
-
+ cgiStartHTML(cgiText(_("Printers")));
cgiCopyTemplateLang("error-op.tmpl");
cgiEndHTML();
}
/*
- * 'print_command()' - Send a print command to the printer.
+ * 'do_printer_op()' - Do a printer operation.
*/
-void
-print_command(http_t *http, /* I - Connection to server */
- const char *printer, /* I - Printer */
- const char *command) /* I - Command to send */
+static void
+do_printer_op(http_t *http, /* I - HTTP connection */
+ const char *printer, /* I - Printer name */
+ ipp_op_t op, /* I - Operation to perform */
+ const char *title) /* I - Title of page */
{
- cups_file_t *fp; /* File pointer */
- char filename[1024]; /* Temporary file */
- ipp_t *request, /* IPP request */
- *response; /* IPP response */
+ ipp_t *request; /* IPP request */
char uri[HTTP_MAX_URI], /* Printer URI */
- resource[1024], /* POST resource path */
- refresh[1024]; /* Refresh URL */
- const char *user; /* Username */
-
-
- /*
- * See who is logged in...
- */
-
- if ((user = getenv("REMOTE_USER")) == NULL)
- user = "guest";
-
- /*
- * Create the CUPS command file to print...
- */
-
- if ((fp = cupsTempFile2(filename, sizeof(filename))) == NULL)
- {
- cgiStartHTML(cgiText(_("Printer Maintenance")));
- cgiSetVariable("MESSAGE", _("Unable to create temporary file:"));
- cgiSetVariable("ERROR", strerror(errno));
- cgiCopyTemplateLang("error.tmpl");
- cgiEndHTML();
- return;
- }
-
- cupsFilePuts(fp, "#CUPS-COMMAND\n");
- cupsFilePrintf(fp, "%s\n", command);
- cupsFileClose(fp);
-
- /*
- * Point to the printer...
- */
+ resource[HTTP_MAX_URI]; /* Path for request */
- snprintf(resource, sizeof(resource), "/printers/%s", printer);
-
- httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp", NULL,
- "localhost", ippPort(), "/printers/%s", printer);
/*
- * Build an IPP_PRINT_JOB request, which requires the following
+ * Build a printer request, which requires the following
* attributes:
*
* attributes-charset
* attributes-natural-language
* printer-uri
- * requesting-user-name
- * document-format
*/
- request = ippNewRequest(IPP_PRINT_JOB);
+ request = ippNewRequest(op);
+ httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp", NULL,
+ "localhost", 0, "/printers/%s", printer);
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri",
NULL, uri);
- ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME,
- "requesting-user-name", NULL, user);
-
- ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "job-name",
- NULL, "Printer Maintenance");
-
- ippAddString(request, IPP_TAG_JOB, IPP_TAG_MIMETYPE, "document-format",
- NULL, "application/postscript");
-
/*
* Do the request and get back a response...
*/
- if ((response = cupsDoFileRequest(http, request, resource,
- filename)) != NULL)
- {
- cgiSetIPPVars(response, NULL, NULL, NULL, 0);
+ snprintf(resource, sizeof(resource), "/printers/%s", printer);
+ ippDelete(cupsDoRequest(http, request, resource));
- ippDelete(response);
+ if (cupsLastError() == IPP_NOT_AUTHORIZED)
+ {
+ puts("Status: 401\n");
+ exit(0);
}
-
- unlink(filename);
-
- if (cupsLastError() <= IPP_OK_CONFLICT)
+ else if (cupsLastError() > IPP_OK_CONFLICT)
+ {
+ cgiStartHTML(title);
+ cgiShowIPPError(_("Unable to do maintenance command"));
+ }
+ else
{
/*
- * Automatically reload the printer status page...
+ * Redirect successful updates back to the printer page...
*/
- cgiFormEncode(uri, resource, sizeof(uri));
- snprintf(refresh, sizeof(refresh), "2;URL=%s", uri);
- cgiSetVariable("refresh_page", refresh);
- }
- else if (cupsLastError() == IPP_NOT_AUTHORIZED)
- {
- puts("Status: 401\n");
- exit(0);
- }
+ char url[1024], /* Printer/class URL */
+ refresh[1024]; /* Refresh URL */
- cgiStartHTML(cgiText(_("Printer Maintenance")));
- if (cupsLastError() > IPP_OK_CONFLICT)
- cgiShowIPPError(_("Unable to send maintenance job:"));
- else
- {
- cgiSetVariable("PRINTER_NAME", printer);
+ cgiRewriteURL(uri, url, sizeof(url), NULL);
+ cgiFormEncode(uri, url, sizeof(uri));
+ snprintf(refresh, sizeof(refresh), "5;URL=%s", uri);
+ cgiSetVariable("refresh_page", refresh);
- cgiCopyTemplateLang("maintenance.tmpl");
+ cgiStartHTML(title);
+
+ if (op == IPP_PAUSE_PRINTER)
+ cgiCopyTemplateLang("printer-stop.tmpl");
+ else if (op == IPP_RESUME_PRINTER)
+ cgiCopyTemplateLang("printer-start.tmpl");
+ else if (op == CUPS_ACCEPT_JOBS)
+ cgiCopyTemplateLang("printer-accept.tmpl");
+ else if (op == CUPS_REJECT_JOBS)
+ cgiCopyTemplateLang("printer-reject.tmpl");
+ else if (op == IPP_OP_CANCEL_JOBS)
+ cgiCopyTemplateLang("printer-cancel-jobs.tmpl");
}
cgiEndHTML();
* 'show_all_printers()' - Show all printers...
*/
-void
+static void
show_all_printers(http_t *http, /* I - Connection to server */
const char *user) /* I - Username */
{
ipp_t *request, /* IPP request */
*response; /* IPP response */
cups_array_t *printers; /* Array of printer objects */
- ipp_attribute_t *printer, /* Printer object */
- *attr; /* Current attribute */
- int ascending, /* Order of printers (0 = descending) */
- first, /* First printer to show */
+ ipp_attribute_t *printer; /* Printer object */
+ int first, /* First printer to show */
count; /* Number of printers */
const char *var; /* Form variable */
void *search; /* Search data */
sprintf(val, "%d", count);
cgiSetVariable("TOTAL", val);
- if ((var = cgiGetVariable("ORDER")) != NULL)
- ascending = !strcasecmp(var, "asc");
- else
- ascending = 1;
-
- if (ascending)
- {
- for (i = 0, printer = (ipp_attribute_t *)cupsArrayIndex(printers, first);
- i < CUPS_PAGE_MAX && printer;
- i ++, printer = (ipp_attribute_t *)cupsArrayNext(printers))
- {
- cgiSetIPPObjectVars(printer, NULL, i);
-
- cgiSetArray("cupscommand", i, "0");
-
- for (attr = printer; attr; attr = attr->next)
- if (attr->group_tag != IPP_TAG_PRINTER || !attr->name)
- break;
- else if (!strcmp(attr->name, "printer-type"))
- {
- if (attr->values[0].integer & CUPS_PRINTER_COMMANDS)
- cgiSetArray("cupscommand", i, "1");
- break;
- }
- }
- }
- else
- {
- for (i = 0, printer = (ipp_attribute_t *)cupsArrayIndex(printers, count - first - 1);
- i < CUPS_PAGE_MAX && printer;
- i ++, printer = (ipp_attribute_t *)cupsArrayPrev(printers))
- {
- cgiSetIPPObjectVars(printer, NULL, i);
-
- cgiSetArray("cupscommand", i, "0");
-
- for (attr = printer; attr; attr = attr->next)
- if (attr->group_tag == IPP_TAG_ZERO || !attr->name)
- break;
- else if (!strcmp(attr->name, "printer-type"))
- {
- if (attr->values[0].integer & CUPS_PRINTER_COMMANDS)
- cgiSetArray("cupscommand", i, "1");
- break;
- }
- }
- }
+ for (i = 0, printer = (ipp_attribute_t *)cupsArrayIndex(printers, first);
+ i < CUPS_PAGE_MAX && printer;
+ i ++, printer = (ipp_attribute_t *)cupsArrayNext(printers))
+ cgiSetIPPObjectVars(printer, NULL, i);
/*
* Save navigation URLs...
cgiSetVariable("NEXT", val);
}
+ if (count > CUPS_PAGE_MAX)
+ {
+ snprintf(val, sizeof(val), "%d", CUPS_PAGE_MAX * (count / CUPS_PAGE_MAX));
+ cgiSetVariable("LAST", val);
+ }
+
/*
* Then show everything...
*/
cgiCopyTemplateLang("printers-header.tmpl");
- if (count > 0)
+ if (count > CUPS_PAGE_MAX)
cgiCopyTemplateLang("pager.tmpl");
cgiCopyTemplateLang("printers.tmpl");
- if (count > 0)
+ if (count > CUPS_PAGE_MAX)
cgiCopyTemplateLang("pager.tmpl");
/*
* Show the error...
*/
- cgiShowIPPError(_("Unable to get printer list:"));
+ cgiShowIPPError(_("Unable to get printer list"));
}
cgiEndHTML();
* 'show_printer()' - Show a single printer.
*/
-void
+static void
show_printer(http_t *http, /* I - Connection to server */
const char *printer) /* I - Name of printer */
{
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL,
uri);
- cgiGetAttributes(request, "printers.tmpl");
+ cgiGetAttributes(request, "printer.tmpl");
/*
* Do the request and get back a response...
cgiSetIPPVars(response, NULL, NULL, NULL, 0);
- if ((attr = ippFindAttribute(response, "printer-type",
- IPP_TAG_ENUM)) != NULL)
- {
- cgiSetVariable("cupscommand",
- (attr->values[0].integer & CUPS_PRINTER_COMMANDS) ?
- "1" : "0");
- }
-
if (printer && (attr = ippFindAttribute(response, "printer-state",
IPP_TAG_ENUM)) != NULL &&
attr->values[0].integer == IPP_PRINTER_PROCESSING)
* Show the printer status...
*/
- cgiSetVariable("_SINGLE_DEST", "1");
- cgiCopyTemplateLang("printers.tmpl");
+ cgiCopyTemplateLang("printer.tmpl");
/*
* Show jobs for the specified printer...
*/
cgiStartHTML(printer);
- cgiShowIPPError(_("Unable to get printer status:"));
+ cgiShowIPPError(_("Unable to get printer status"));
}
cgiEndHTML();
}
-
-
-/*
- * End of "$Id: printers.c 6889 2007-08-29 22:23:35Z mike $".
- */