summaryrefslogtreecommitdiff
path: root/scheduler/ipp.c
diff options
context:
space:
mode:
Diffstat (limited to 'scheduler/ipp.c')
-rw-r--r--scheduler/ipp.c505
1 files changed, 280 insertions, 225 deletions
diff --git a/scheduler/ipp.c b/scheduler/ipp.c
index 543eb84ec..7ed169a44 100644
--- a/scheduler/ipp.c
+++ b/scheduler/ipp.c
@@ -1,5 +1,5 @@
/*
- * "$Id: ipp.c 181 2006-06-22 20:01:18Z jlovell $"
+ * "$Id: ipp.c 5686 2006-06-21 21:02:56Z mike $"
*
* IPP routines for the Common UNIX Printing System (CUPS) scheduler.
*
@@ -126,7 +126,8 @@ static void accept_jobs(cupsd_client_t *con, ipp_attribute_t *uri);
static void add_class(cupsd_client_t *con, ipp_attribute_t *uri);
static int add_file(cupsd_client_t *con, cupsd_job_t *job,
mime_type_t *filetype, int compression);
-static cupsd_job_t *add_job(cupsd_client_t *con, cupsd_printer_t *printer,
+static cupsd_job_t *add_job(cupsd_client_t *con, ipp_attribute_t *uri,
+ cupsd_printer_t **dprinter,
mime_type_t *filetype);
static void add_job_state_reasons(cupsd_client_t *con, cupsd_job_t *job);
static void add_job_subscriptions(cupsd_client_t *con, cupsd_job_t *job);
@@ -699,6 +700,12 @@ accept_jobs(cupsd_client_t *con, /* I - Client connection */
{
http_status_t status; /* Policy status */
cups_ptype_t dtype; /* Destination type (printer or class) */
+ char method[HTTP_MAX_URI], /* Method portion of URI */
+ username[HTTP_MAX_URI], /* Username portion of URI */
+ host[HTTP_MAX_URI], /* Host portion of URI */
+ resource[HTTP_MAX_URI]; /* Resource portion of URI */
+ int port; /* Port portion of URI */
+ const char *name; /* Printer name */
cupsd_printer_t *printer; /* Printer data */
@@ -709,7 +716,11 @@ accept_jobs(cupsd_client_t *con, /* I - Client connection */
* Is the destination valid?
*/
- if (!cupsdValidateDest(uri->values[0].string.text, &dtype, &printer))
+ httpSeparateURI(HTTP_URI_CODING_ALL, uri->values[0].string.text, method,
+ sizeof(method), username, sizeof(username), host,
+ sizeof(host), &port, resource, sizeof(resource));
+
+ if ((name = cupsdValidateDest(host, resource, &dtype, &printer)) == NULL)
{
/*
* Bad URI...
@@ -740,19 +751,12 @@ accept_jobs(cupsd_client_t *con, /* I - Client connection */
cupsdAddPrinterHistory(printer);
if (dtype & CUPS_PRINTER_CLASS)
- {
cupsdSaveAllClasses();
-
- cupsdLogMessage(CUPSD_LOG_INFO, "Class \"%s\" now accepting jobs (\"%s\").",
- printer->name, get_username(con));
- }
else
- {
cupsdSaveAllPrinters();
- cupsdLogMessage(CUPSD_LOG_INFO, "Printer \"%s\" now accepting jobs (\"%s\").",
- printer->name, get_username(con));
- }
+ cupsdLogMessage(CUPSD_LOG_INFO, "Printer \"%s\" now accepting jobs (\"%s\").", name,
+ get_username(con));
/*
* Everything was ok, so return OK status...
@@ -780,6 +784,7 @@ add_class(cupsd_client_t *con, /* I - Client connection */
cupsd_printer_t *pclass, /* Class */
*member; /* Member printer/class */
cups_ptype_t dtype; /* Destination type */
+ const char *dest; /* Printer or class name */
ipp_attribute_t *attr; /* Printer attribute */
int modify; /* Non-zero if we just modified */
char newname[IPP_MAX_NAME]; /* New class name */
@@ -998,7 +1003,11 @@ add_class(cupsd_client_t *con, /* I - Client connection */
* Search for the printer or class URI...
*/
- if (!cupsdValidateDest(attr->values[i].string.text, &dtype, &member))
+ httpSeparateURI(HTTP_URI_CODING_ALL, attr->values[i].string.text, method,
+ sizeof(method), username, sizeof(username), host,
+ sizeof(host), &port, resource, sizeof(resource));
+
+ if ((dest = cupsdValidateDest(host, resource, &dtype, &member)) == NULL)
{
/*
* Bad URI...
@@ -1135,24 +1144,54 @@ add_file(cupsd_client_t *con, /* I - Connection to client */
static cupsd_job_t * /* O - Job object */
add_job(cupsd_client_t *con, /* I - Client connection */
- cupsd_printer_t *printer, /* I - Destination printer */
+ ipp_attribute_t *uri, /* I - printer-uri */
+ cupsd_printer_t **dprinter, /* I - Destination printer */
mime_type_t *filetype) /* I - First print file type, if any */
{
http_status_t status; /* Policy status */
ipp_attribute_t *attr; /* Current attribute */
+ const char *dest; /* Destination */
+ cups_ptype_t dtype; /* Destination type (printer or class) */
const char *val; /* Default option value */
int priority; /* Job priority */
char *title; /* Job name/title */
cupsd_job_t *job; /* Current job */
- char job_uri[HTTP_MAX_URI]; /* Job URI */
+ char job_uri[HTTP_MAX_URI], /* Job URI */
+ method[HTTP_MAX_URI], /* Method portion of URI */
+ username[HTTP_MAX_URI], /* Username portion of URI */
+ host[HTTP_MAX_URI], /* Host portion of URI */
+ resource[HTTP_MAX_URI]; /* Resource portion of URI */
+ int port; /* Port portion of URI */
+ cupsd_printer_t *printer; /* Printer data */
int kbytes; /* Size of print file */
int i; /* Looping var */
int lowerpagerange; /* Page range bound */
- cupsdLogMessage(CUPSD_LOG_DEBUG2, "add_job(%p[%d], %p(%s), %p(%s/%s))",
- con, con->http.fd, printer, printer->name,
- filetype, filetype->super, filetype->type);
+ cupsdLogMessage(CUPSD_LOG_DEBUG2, "add_job(%p[%d], %s)", con,
+ con->http.fd, uri->values[0].string.text);
+
+ /*
+ * Is the destination valid?
+ */
+
+ httpSeparateURI(HTTP_URI_CODING_ALL, uri->values[0].string.text, method,
+ sizeof(method), username, sizeof(username), host,
+ sizeof(host), &port, resource, sizeof(resource));
+
+ if ((dest = cupsdValidateDest(host, resource, &dtype, &printer)) == NULL)
+ {
+ /*
+ * Bad URI...
+ */
+
+ send_ipp_status(con, IPP_NOT_FOUND,
+ _("The printer or class was not found."));
+ return (NULL);
+ }
+
+ if (dprinter)
+ *dprinter = printer;
/*
* Check remote printing to non-shared printer...
@@ -1190,7 +1229,7 @@ add_job(cupsd_client_t *con, /* I - Client connection */
{
send_ipp_status(con, IPP_NOT_ACCEPTING,
_("Destination \"%s\" is not accepting jobs."),
- printer->name);
+ dest);
return (NULL);
}
@@ -1257,7 +1296,7 @@ add_job(cupsd_client_t *con, /* I - Client connection */
if (MaxJobs && cupsArrayCount(Jobs) >= MaxJobs)
cupsdCleanJobs();
- if (MaxJobs && cupsArrayCount(Jobs) >= MaxJobs)
+ if (cupsArrayCount(Jobs) >= MaxJobs && MaxJobs)
{
send_ipp_status(con, IPP_NOT_POSSIBLE,
_("Too many active jobs."));
@@ -1299,13 +1338,11 @@ add_job(cupsd_client_t *con, /* I - Client connection */
if ((job = cupsdAddJob(priority, printer->name)) == NULL)
{
send_ipp_status(con, IPP_INTERNAL_ERROR,
- _("Unable to add job for destination \"%s\"!"),
- printer->name);
+ _("Unable to add job for destination \"%s\"!"), dest);
return (NULL);
}
- job->dtype = printer->type & (CUPS_PRINTER_CLASS | CUPS_PRINTER_IMPLICIT |
- CUPS_PRINTER_REMOTE);
+ job->dtype = dtype;
job->attrs = con->request;
con->request = NULL;
@@ -2730,10 +2767,11 @@ cancel_all_jobs(cupsd_client_t *con, /* I - Client connection */
ipp_attribute_t *uri) /* I - Job or Printer URI */
{
http_status_t status; /* Policy status */
+ const char *dest; /* Destination */
cups_ptype_t dtype; /* Destination type */
- char scheme[HTTP_MAX_URI], /* Scheme portion of URI */
+ char method[HTTP_MAX_URI], /* Method portion of URI */
userpass[HTTP_MAX_URI], /* Username portion of URI */
- hostname[HTTP_MAX_URI], /* Host portion of URI */
+ host[HTTP_MAX_URI], /* Host portion of URI */
resource[HTTP_MAX_URI]; /* Resource portion of URI */
int port; /* Port portion of URI */
ipp_attribute_t *attr; /* Attribute in request */
@@ -2792,17 +2830,16 @@ cancel_all_jobs(cupsd_client_t *con, /* I - Client connection */
* And if the destination is valid...
*/
- if (!cupsdValidateDest(uri->values[0].string.text, &dtype, &printer))
+ httpSeparateURI(HTTP_URI_CODING_ALL, uri->values[0].string.text, method,
+ sizeof(method), userpass, sizeof(userpass), host,
+ sizeof(host), &port, resource, sizeof(resource));
+
+ if ((dest = cupsdValidateDest(host, resource, &dtype, &printer)) == NULL)
{
/*
* Bad URI?
*/
- httpSeparateURI(HTTP_URI_CODING_ALL, uri->values[0].string.text,
- scheme, sizeof(scheme), userpass, sizeof(userpass),
- hostname, sizeof(hostname), &port,
- resource, sizeof(resource));
-
if ((!strncmp(resource, "/printers/", 10) && resource[10]) ||
(!strncmp(resource, "/classes/", 9) && resource[9]))
{
@@ -2810,6 +2847,13 @@ cancel_all_jobs(cupsd_client_t *con, /* I - Client connection */
_("The printer or class was not found."));
return;
}
+ else if (strcmp(resource, "/printers/"))
+ {
+ send_ipp_status(con, IPP_NOT_FOUND,
+ _("The printer-uri \"%s\" is not valid."),
+ uri->values[0].string.text);
+ return;
+ }
/*
* Check policy...
@@ -2836,8 +2880,7 @@ cancel_all_jobs(cupsd_client_t *con, /* I - Client connection */
* Check policy...
*/
- if ((status = cupsdCheckPolicy(printer->op_policy_ptr, con,
- NULL)) != HTTP_OK)
+ if ((status = cupsdCheckPolicy(printer->op_policy_ptr, con, NULL)) != HTTP_OK)
{
send_http_error(con, status);
return;
@@ -2847,11 +2890,10 @@ cancel_all_jobs(cupsd_client_t *con, /* I - Client connection */
* Cancel all of the jobs on the named printer...
*/
- cupsdCancelJobs(printer->name, username, purge);
+ cupsdCancelJobs(dest, username, purge);
cupsdLogMessage(CUPSD_LOG_INFO, "All jobs on \"%s\" were %s by \"%s\".",
- printer->name, purge ? "purged" : "cancelled",
- get_username(con));
+ dest, purge ? "purged" : "cancelled", get_username(con));
}
con->response->request.status.status_code = IPP_OK;
@@ -2868,12 +2910,13 @@ cancel_job(cupsd_client_t *con, /* I - Client connection */
{
ipp_attribute_t *attr; /* Current attribute */
int jobid; /* Job ID */
- char scheme[HTTP_MAX_URI], /* Scheme portion of URI */
+ char method[HTTP_MAX_URI], /* Method portion of URI */
username[HTTP_MAX_URI], /* Username portion of URI */
host[HTTP_MAX_URI], /* Host portion of URI */
resource[HTTP_MAX_URI]; /* Resource portion of URI */
int port; /* Port portion of URI */
cupsd_job_t *job; /* Job information */
+ const char *dest; /* Destination */
cups_ptype_t dtype; /* Destination type (printer or class) */
cupsd_printer_t *printer; /* Printer data */
@@ -2905,7 +2948,11 @@ cancel_job(cupsd_client_t *con, /* I - Client connection */
* Find the current job on the specified printer...
*/
- if (!cupsdValidateDest(uri->values[0].string.text, &dtype, &printer))
+ httpSeparateURI(HTTP_URI_CODING_ALL, uri->values[0].string.text, method,
+ sizeof(method), username, sizeof(username), host,
+ sizeof(host), &port, resource, sizeof(resource));
+
+ if ((dest = cupsdValidateDest(host, resource, &dtype, &printer)) == NULL)
{
/*
* Bad URI...
@@ -2932,7 +2979,7 @@ cancel_job(cupsd_client_t *con, /* I - Client connection */
job;
job = (cupsd_job_t *)cupsArrayNext(ActiveJobs))
if (job->state_value <= IPP_JOB_PROCESSING &&
- !strcasecmp(job->dest, printer->name))
+ !strcasecmp(job->dest, dest))
break;
if (job)
@@ -2940,7 +2987,7 @@ cancel_job(cupsd_client_t *con, /* I - Client connection */
else
{
send_ipp_status(con, IPP_NOT_POSSIBLE, _("No active jobs on %s!"),
- printer->name);
+ dest);
return;
}
}
@@ -2952,8 +2999,8 @@ cancel_job(cupsd_client_t *con, /* I - Client connection */
* Got a job URI; parse it to get the job ID...
*/
- httpSeparateURI(HTTP_URI_CODING_ALL, uri->values[0].string.text, scheme,
- sizeof(scheme), username, sizeof(username), host,
+ httpSeparateURI(HTTP_URI_CODING_ALL, uri->values[0].string.text, method,
+ sizeof(method), username, sizeof(username), host,
sizeof(host), &port, resource, sizeof(resource));
if (strncmp(resource, "/jobs/", 6))
@@ -4412,33 +4459,17 @@ static void
create_job(cupsd_client_t *con, /* I - Client connection */
ipp_attribute_t *uri) /* I - Printer URI */
{
- cupsd_printer_t *printer; /* Printer */
- cupsd_job_t *job; /* New job */
+ cupsd_job_t *job; /* New job */
cupsdLogMessage(CUPSD_LOG_DEBUG2, "create_job(%p[%d], %s)", con,
con->http.fd, uri->values[0].string.text);
/*
- * Is the destination valid?
- */
-
- if (!cupsdValidateDest(uri->values[0].string.text, NULL, &printer))
- {
- /*
- * Bad URI...
- */
-
- send_ipp_status(con, IPP_NOT_FOUND,
- _("The printer or class was not found."));
- return;
- }
-
- /*
* Create the job object...
*/
- if ((job = add_job(con, printer, NULL)) == NULL)
+ if ((job = add_job(con, uri, NULL, NULL)) == NULL)
return;
/*
@@ -4709,8 +4740,7 @@ create_subscription(
dtype = CUPS_PRINTER_CLASS;
printer = NULL;
}
- else if ((dest = cupsdValidateDest(uri->values[0].string.text, &dtype,
- &printer)) == NULL)
+ else if ((dest = cupsdValidateDest(host, resource, &dtype, &printer)) == NULL)
{
/*
* Bad URI...
@@ -4727,8 +4757,7 @@ create_subscription(
if (printer)
{
- if ((status = cupsdCheckPolicy(printer->op_policy_ptr, con,
- NULL)) != HTTP_OK)
+ if ((status = cupsdCheckPolicy(printer->op_policy_ptr, con, NULL)) != HTTP_OK)
{
send_http_error(con, status);
return;
@@ -4976,7 +5005,13 @@ delete_printer(cupsd_client_t *con, /* I - Client connection */
ipp_attribute_t *uri) /* I - URI of printer or class */
{
http_status_t status; /* Policy status */
+ const char *dest; /* Destination */
cups_ptype_t dtype; /* Destination type (printer or class) */
+ char method[HTTP_MAX_URI], /* Method portion of URI */
+ username[HTTP_MAX_URI], /* Username portion of URI */
+ host[HTTP_MAX_URI], /* Host portion of URI */
+ resource[HTTP_MAX_URI]; /* Resource portion of URI */
+ int port; /* Port portion of URI */
cupsd_printer_t *printer; /* Printer/class */
char filename[1024]; /* Script/PPD filename */
@@ -4988,7 +5023,11 @@ delete_printer(cupsd_client_t *con, /* I - Client connection */
* Do we have a valid URI?
*/
- if (!cupsdValidateDest(uri->values[0].string.text, &dtype, &printer))
+ httpSeparateURI(HTTP_URI_CODING_ALL, uri->values[0].string.text, method,
+ sizeof(method), username, sizeof(username), host,
+ sizeof(host), &port, resource, sizeof(resource));
+
+ if ((dest = cupsdValidateDest(host, resource, &dtype, &printer)) == NULL)
{
/*
* Bad URI...
@@ -5013,7 +5052,7 @@ delete_printer(cupsd_client_t *con, /* I - Client connection */
* Remove old jobs...
*/
- cupsdCancelJobs(printer->name, NULL, 1);
+ cupsdCancelJobs(dest, NULL, 1);
/*
* Remove old subscriptions and send a "deleted printer" event...
@@ -5022,7 +5061,7 @@ delete_printer(cupsd_client_t *con, /* I - Client connection */
cupsdAddEvent(CUPSD_EVENT_PRINTER_DELETED, printer, NULL,
"%s \"%s\" deleted by \"%s\".",
(dtype & CUPS_PRINTER_CLASS) ? "Class" : "Printer",
- printer->name, get_username(con));
+ dest, get_username(con));
cupsdExpireSubscriptions(printer, NULL);
@@ -5030,26 +5069,24 @@ delete_printer(cupsd_client_t *con, /* I - Client connection */
* Remove any old PPD or script files...
*/
- snprintf(filename, sizeof(filename), "%s/interfaces/%s", ServerRoot,
- printer->name);
+ snprintf(filename, sizeof(filename), "%s/interfaces/%s", ServerRoot, dest);
unlink(filename);
- snprintf(filename, sizeof(filename), "%s/ppd/%s.ppd", ServerRoot,
- printer->name);
+ snprintf(filename, sizeof(filename), "%s/ppd/%s.ppd", ServerRoot, dest);
unlink(filename);
if (dtype & CUPS_PRINTER_CLASS)
{
- cupsdLogMessage(CUPSD_LOG_INFO, "Class \"%s\" deleted by \"%s\".",
- printer->name, get_username(con));
+ cupsdLogMessage(CUPSD_LOG_INFO, "Class \"%s\" deleted by \"%s\".", dest,
+ get_username(con));
cupsdDeletePrinter(printer, 0);
cupsdSaveAllClasses();
}
else
{
- cupsdLogMessage(CUPSD_LOG_INFO, "Printer \"%s\" deleted by \"%s\".",
- printer->name, get_username(con));
+ cupsdLogMessage(CUPSD_LOG_INFO, "Printer \"%s\" deleted by \"%s\".", dest,
+ get_username(con));
cupsdDeletePrinter(printer, 0);
cupsdSaveAllPrinters();
@@ -5292,7 +5329,7 @@ get_jobs(cupsd_client_t *con, /* I - Client connection */
const char *dest; /* Destination */
cups_ptype_t dtype; /* Destination type (printer or class) */
cups_ptype_t dmask; /* Destination type mask */
- char scheme[HTTP_MAX_URI], /* Scheme portion of URI */
+ char method[HTTP_MAX_URI], /* Method portion of URI */
username[HTTP_MAX_URI], /* Username portion of URI */
host[HTTP_MAX_URI], /* Host portion of URI */
resource[HTTP_MAX_URI]; /* Resource portion of URI */
@@ -5314,8 +5351,8 @@ get_jobs(cupsd_client_t *con, /* I - Client connection */
* Is the destination valid?
*/
- httpSeparateURI(HTTP_URI_CODING_ALL, uri->values[0].string.text, scheme,
- sizeof(scheme), username, sizeof(username), host,
+ httpSeparateURI(HTTP_URI_CODING_ALL, uri->values[0].string.text, method,
+ sizeof(method), username, sizeof(username), host,
sizeof(host), &port, resource, sizeof(resource));
if (!strcmp(resource, "/") ||
@@ -5340,8 +5377,7 @@ get_jobs(cupsd_client_t *con, /* I - Client connection */
dmask = CUPS_PRINTER_CLASS;
printer = NULL;
}
- else if ((dest = cupsdValidateDest(uri->values[0].string.text, &dtype,
- &printer)) == NULL)
+ else if ((dest = cupsdValidateDest(host, resource, &dtype, &printer)) == NULL)
{
/*
* Bad URI...
@@ -5360,8 +5396,7 @@ get_jobs(cupsd_client_t *con, /* I - Client connection */
if (printer)
{
- if ((status = cupsdCheckPolicy(printer->op_policy_ptr, con,
- NULL)) != HTTP_OK)
+ if ((status = cupsdCheckPolicy(printer->op_policy_ptr, con, NULL)) != HTTP_OK)
{
send_http_error(con, status);
return;
@@ -5697,7 +5732,17 @@ get_printer_attrs(cupsd_client_t *con, /* I - Client connection */
ipp_attribute_t *uri) /* I - Printer URI */
{
http_status_t status; /* Policy status */
+ const char *dest; /* Destination */
cups_ptype_t dtype; /* Destination type (printer or class) */
+ char method[HTTP_MAX_URI],
+ /* Method portion of URI */
+ username[HTTP_MAX_URI],
+ /* Username portion of URI */
+ host[HTTP_MAX_URI],
+ /* Host portion of URI */
+ resource[HTTP_MAX_URI];
+ /* Resource portion of URI */
+ int port; /* Port portion of URI */
cupsd_printer_t *printer; /* Printer/class */
cups_array_t *ra; /* Requested attributes array */
@@ -5709,7 +5754,11 @@ get_printer_attrs(cupsd_client_t *con, /* I - Client connection */
* Is the destination valid?
*/
- if (!cupsdValidateDest(uri->values[0].string.text, &dtype, &printer))
+ httpSeparateURI(HTTP_URI_CODING_ALL, uri->values[0].string.text, method,
+ sizeof(method), username, sizeof(username), host,
+ sizeof(host), &port, resource, sizeof(resource));
+
+ if ((dest = cupsdValidateDest(host, resource, &dtype, &printer)) == NULL)
{
/*
* Bad URI...
@@ -5972,8 +6021,8 @@ get_subscriptions(cupsd_client_t *con, /* I - Client connection */
cups_array_t *ra; /* Requested attributes array */
ipp_attribute_t *attr; /* Attribute */
cups_ptype_t dtype; /* Destination type (printer or class) */
- char scheme[HTTP_MAX_URI],
- /* Scheme portion of URI */
+ char method[HTTP_MAX_URI],
+ /* Method portion of URI */
username[HTTP_MAX_URI],
/* Username portion of URI */
host[HTTP_MAX_URI],
@@ -5993,8 +6042,8 @@ get_subscriptions(cupsd_client_t *con, /* I - Client connection */
* Is the destination valid?
*/
- httpSeparateURI(HTTP_URI_CODING_ALL, uri->values[0].string.text, scheme,
- sizeof(scheme), username, sizeof(username), host,
+ httpSeparateURI(HTTP_URI_CODING_ALL, uri->values[0].string.text, method,
+ sizeof(method), username, sizeof(username), host,
sizeof(host), &port, resource, sizeof(resource));
if (!strcmp(resource, "/") ||
@@ -6017,7 +6066,7 @@ get_subscriptions(cupsd_client_t *con, /* I - Client connection */
return;
}
}
- else if (!cupsdValidateDest(uri->values[0].string.text, &dtype, &printer))
+ else if (!cupsdValidateDest(host, resource, &dtype, &printer))
{
/*
* Bad URI...
@@ -6276,7 +6325,7 @@ move_job(cupsd_client_t *con, /* I - Client connection */
*dest; /* Destination */
cups_ptype_t stype, /* Source type (printer or class) */
dtype; /* Destination type (printer or class) */
- char scheme[HTTP_MAX_URI], /* Scheme portion of URI */
+ char method[HTTP_MAX_URI], /* Method portion of URI */
username[HTTP_MAX_URI], /* Username portion of URI */
host[HTTP_MAX_URI], /* Host portion of URI */
resource[HTTP_MAX_URI]; /* Resource portion of URI */
@@ -6304,8 +6353,11 @@ move_job(cupsd_client_t *con, /* I - Client connection */
return;
}
- if ((dest = cupsdValidateDest(attr->values[0].string.text, &dtype,
- &dprinter)) == NULL)
+ httpSeparateURI(HTTP_URI_CODING_ALL, attr->values[0].string.text, method,
+ sizeof(method), username, sizeof(username), host,
+ sizeof(host), &port, resource, sizeof(resource));
+
+ if ((dest = cupsdValidateDest(host, resource, &dtype, &dprinter)) == NULL)
{
/*
* Bad URI...
@@ -6320,8 +6372,7 @@ move_job(cupsd_client_t *con, /* I - Client connection */
* Check policy...
*/
- if ((status = cupsdCheckPolicy(dprinter->op_policy_ptr, con,
- NULL)) != HTTP_OK)
+ if ((status = cupsdCheckPolicy(dprinter->op_policy_ptr, con, NULL)) != HTTP_OK)
{
send_http_error(con, status);
return;
@@ -6331,8 +6382,8 @@ move_job(cupsd_client_t *con, /* I - Client connection */
* See if we have a job URI or a printer URI...
*/
- httpSeparateURI(HTTP_URI_CODING_ALL, uri->values[0].string.text, scheme,
- sizeof(scheme), username, sizeof(username), host,
+ httpSeparateURI(HTTP_URI_CODING_ALL, uri->values[0].string.text, method,
+ sizeof(method), username, sizeof(username), host,
sizeof(host), &port, resource, sizeof(resource));
if (!strcmp(uri->name, "printer-uri"))
@@ -6348,8 +6399,7 @@ move_job(cupsd_client_t *con, /* I - Client connection */
* Move all jobs...
*/
- if ((src = cupsdValidateDest(uri->values[0].string.text, &stype,
- &sprinter)) == NULL)
+ if ((src = cupsdValidateDest(host, resource, &stype, &sprinter)) == NULL)
{
/*
* Bad URI...
@@ -6647,7 +6697,6 @@ print_job(cupsd_client_t *con, /* I - Client connection */
{
ipp_attribute_t *attr; /* Current attribute */
ipp_attribute_t *format; /* Document-format attribute */
- const char *default_format; /* document-format-default value */
cupsd_job_t *job; /* New job */
char filename[1024]; /* Job filename */
mime_type_t *filetype; /* Type of file */
@@ -6705,21 +6754,6 @@ print_job(cupsd_client_t *con, /* I - Client connection */
}
/*
- * Is the destination valid?
- */
-
- if (!cupsdValidateDest(uri->values[0].string.text, NULL, &printer))
- {
- /*
- * Bad URI...
- */
-
- send_ipp_status(con, IPP_NOT_FOUND,
- _("The printer or class was not found."));
- return;
- }
-
- /*
* Is it a format we support?
*/
@@ -6730,8 +6764,7 @@ print_job(cupsd_client_t *con, /* I - Client connection */
* Grab format from client...
*/
- if (sscanf(format->values[0].string.text, "%15[^/]/%31[^;]", super,
- type) != 2)
+ if (sscanf(format->values[0].string.text, "%15[^/]/%31[^;]", super, type) != 2)
{
send_ipp_status(con, IPP_BAD_REQUEST,
_("Could not scan type \"%s\"!"),
@@ -6739,26 +6772,10 @@ print_job(cupsd_client_t *con, /* I - Client connection */
return;
}
}
- else if ((default_format = cupsGetOption("document-format",
- printer->num_options,
- printer->options)) != NULL)
- {
- /*
- * Use default document format...
- */
-
- if (sscanf(default_format, "%15[^/]/%31[^;]", super, type) != 2)
- {
- send_ipp_status(con, IPP_BAD_REQUEST,
- _("Could not scan type \"%s\"!"),
- default_format);
- return;
- }
- }
else
{
/*
- * Auto-type it!
+ * No document format attribute? Auto-type it!
*/
strcpy(super, "application");
@@ -6781,35 +6798,32 @@ print_job(cupsd_client_t *con, /* I - Client connection */
doc_name ? doc_name->values[0].string.text : NULL,
&compression);
- if (!filetype)
- filetype = mimeType(MimeDatabase, super, type);
- }
- else
- filetype = mimeType(MimeDatabase, super, type);
-
- if (filetype &&
- (!format ||
- (!strcmp(super, "application") && !strcmp(type, "octet-stream"))))
- {
- /*
- * Replace the document-format attribute value with the auto-typed or
- * default one.
- */
+ if (filetype)
+ {
+ /*
+ * Replace the document-format attribute value with the auto-typed one.
+ */
- snprintf(mimetype, sizeof(mimetype), "%s/%s", filetype->super,
- filetype->type);
+ snprintf(mimetype, sizeof(mimetype), "%s/%s", filetype->super,
+ filetype->type);
- if (format)
- {
- _cupsStrFree(format->values[0].string.text);
+ if (format)
+ {
+ _cupsStrFree(format->values[0].string.text);
- format->values[0].string.text = _cupsStrAlloc(mimetype);
+ format->values[0].string.text = _cupsStrAlloc(mimetype);
+ }
+ else
+ ippAddString(con->request, IPP_TAG_JOB, IPP_TAG_MIMETYPE,
+ "document-format", NULL, mimetype);
}
else
- ippAddString(con->request, IPP_TAG_JOB, IPP_TAG_MIMETYPE,
- "document-format", NULL, mimetype);
+ filetype = mimeType(MimeDatabase, super, type);
}
- else if (!filetype)
+ else
+ filetype = mimeType(MimeDatabase, super, type);
+
+ if (!filetype)
{
send_ipp_status(con, IPP_DOCUMENT_FORMAT,
_("Unsupported format \'%s/%s\'!"), super, type);
@@ -6838,7 +6852,7 @@ print_job(cupsd_client_t *con, /* I - Client connection */
* Create the job object...
*/
- if ((job = add_job(con, printer, filetype)) == NULL)
+ if ((job = add_job(con, uri, &printer, filetype)) == NULL)
return;
/*
@@ -7103,6 +7117,12 @@ reject_jobs(cupsd_client_t *con, /* I - Client connection */
{
http_status_t status; /* Policy status */
cups_ptype_t dtype; /* Destination type (printer or class) */
+ char method[HTTP_MAX_URI], /* Method portion of URI */
+ username[HTTP_MAX_URI], /* Username portion of URI */
+ host[HTTP_MAX_URI], /* Host portion of URI */
+ resource[HTTP_MAX_URI]; /* Resource portion of URI */
+ int port; /* Port portion of URI */
+ const char *name; /* Printer name */
cupsd_printer_t *printer; /* Printer data */
ipp_attribute_t *attr; /* printer-state-message text */
@@ -7114,7 +7134,11 @@ reject_jobs(cupsd_client_t *con, /* I - Client connection */
* Is the destination valid?
*/
- if (!cupsdValidateDest(uri->values[0].string.text, &dtype, &printer))
+ httpSeparateURI(HTTP_URI_CODING_ALL, uri->values[0].string.text, method,
+ sizeof(method), username, sizeof(username), host,
+ sizeof(host), &port, resource, sizeof(resource));
+
+ if ((name = cupsdValidateDest(host, resource, &dtype, &printer)) == NULL)
{
/*
* Bad URI...
@@ -7155,14 +7179,14 @@ reject_jobs(cupsd_client_t *con, /* I - Client connection */
cupsdSaveAllClasses();
cupsdLogMessage(CUPSD_LOG_INFO, "Class \"%s\" rejecting jobs (\"%s\").",
- printer->name, get_username(con));
+ name, get_username(con));
}
else
{
cupsdSaveAllPrinters();
cupsdLogMessage(CUPSD_LOG_INFO, "Printer \"%s\" rejecting jobs (\"%s\").",
- printer->name, get_username(con));
+ name, get_username(con));
}
/*
@@ -7618,7 +7642,6 @@ send_document(cupsd_client_t *con, /* I - Client connection */
{
ipp_attribute_t *attr; /* Current attribute */
ipp_attribute_t *format; /* Document-format attribute */
- const char *default_format;/* document-format-default value */
int jobid; /* Job ID number */
cupsd_job_t *job; /* Current job */
char job_uri[HTTP_MAX_URI],
@@ -7777,22 +7800,6 @@ send_document(cupsd_client_t *con, /* I - Client connection */
return;
}
}
- else if ((default_format = cupsGetOption("document-format",
- printer->num_options,
- printer->options)) != NULL)
- {
- /*
- * Use default document format...
- */
-
- if (sscanf(default_format, "%15[^/]/%31[^;]", super, type) != 2)
- {
- send_ipp_status(con, IPP_BAD_REQUEST,
- _("Could not scan type \"%s\"!"),
- default_format);
- return;
- }
- }
else
{
/*
@@ -7819,35 +7826,31 @@ send_document(cupsd_client_t *con, /* I - Client connection */
doc_name ? doc_name->values[0].string.text : NULL,
&compression);
- if (!filetype)
- filetype = mimeType(MimeDatabase, super, type);
- }
- else
- filetype = mimeType(MimeDatabase, super, type);
-
- if (filetype &&
- (!format ||
- (!strcmp(super, "application") && !strcmp(type, "octet-stream"))))
- {
- /*
- * Replace the document-format attribute value with the auto-typed or
- * default one.
- */
-
- snprintf(mimetype, sizeof(mimetype), "%s/%s", filetype->super,
- filetype->type);
-
- if (format)
+ if (filetype)
{
- _cupsStrFree(format->values[0].string.text);
+ /*
+ * Replace the document-format attribute value with the auto-typed one.
+ */
- format->values[0].string.text = _cupsStrAlloc(mimetype);
+ snprintf(mimetype, sizeof(mimetype), "%s/%s", filetype->super,
+ filetype->type);
+
+ if (format)
+ {
+ _cupsStrFree(format->values[0].string.text);
+ format->values[0].string.text = _cupsStrAlloc(mimetype);
+ }
+ else
+ ippAddString(con->request, IPP_TAG_JOB, IPP_TAG_MIMETYPE,
+ "document-format", NULL, mimetype);
}
else
- ippAddString(con->request, IPP_TAG_JOB, IPP_TAG_MIMETYPE,
- "document-format", NULL, mimetype);
+ filetype = mimeType(MimeDatabase, super, type);
}
- else if (!filetype)
+ else
+ filetype = mimeType(MimeDatabase, super, type);
+
+ if (!filetype)
{
send_ipp_status(con, IPP_DOCUMENT_FORMAT,
_("Unsupported format \'%s/%s\'!"), super, type);
@@ -8087,6 +8090,16 @@ set_default(cupsd_client_t *con, /* I - Client connection */
{
http_status_t status; /* Policy status */
cups_ptype_t dtype; /* Destination type (printer or class) */
+ char method[HTTP_MAX_URI],
+ /* Method portion of URI */
+ username[HTTP_MAX_URI],
+ /* Username portion of URI */
+ host[HTTP_MAX_URI],
+ /* Host portion of URI */
+ resource[HTTP_MAX_URI];
+ /* Resource portion of URI */
+ int port; /* Port portion of URI */
+ const char *name; /* Printer name */
cupsd_printer_t *printer; /* Printer */
@@ -8097,7 +8110,11 @@ set_default(cupsd_client_t *con, /* I - Client connection */
* Is the destination valid?
*/
- if (!cupsdValidateDest(uri->values[0].string.text, &dtype, &printer))
+ httpSeparateURI(HTTP_URI_CODING_ALL, uri->values[0].string.text, method,
+ sizeof(method), username, sizeof(username), host,
+ sizeof(host), &port, resource, sizeof(resource));
+
+ if ((name = cupsdValidateDest(host, resource, &dtype, &printer)) == NULL)
{
/*
* Bad URI...
@@ -8130,8 +8147,8 @@ set_default(cupsd_client_t *con, /* I - Client connection */
cupsdWritePrintcap();
cupsdLogMessage(CUPSD_LOG_INFO,
- "Default destination set to \"%s\" by \"%s\".",
- printer->name, get_username(con));
+ "Default destination set to \"%s\" by \"%s\".", name,
+ get_username(con));
/*
* Everything was ok, so return OK status...
@@ -8633,7 +8650,8 @@ set_printer_defaults(
attr->values[0].string.text);
cupsdSetString(&printer->error_policy, attr->values[0].string.text);
}
- else if (!strcmp(attr->name, "notify-lease-duration-default") ||
+ else if (!strcmp(attr->name, "document-format-default") ||
+ !strcmp(attr->name, "notify-lease-duration-default") ||
!strcmp(attr->name, "notify-events-default"))
continue;
@@ -8736,6 +8754,16 @@ start_printer(cupsd_client_t *con, /* I - Client connection */
{
http_status_t status; /* Policy status */
cups_ptype_t dtype; /* Destination type (printer or class) */
+ char method[HTTP_MAX_URI],
+ /* Method portion of URI */
+ username[HTTP_MAX_URI],
+ /* Username portion of URI */
+ host[HTTP_MAX_URI],
+ /* Host portion of URI */
+ resource[HTTP_MAX_URI];
+ /* Resource portion of URI */
+ int port; /* Port portion of URI */
+ const char *name; /* Printer name */
cupsd_printer_t *printer; /* Printer data */
@@ -8746,7 +8774,11 @@ start_printer(cupsd_client_t *con, /* I - Client connection */
* Is the destination valid?
*/
- if (!cupsdValidateDest(uri->values[0].string.text, &dtype, &printer))
+ httpSeparateURI(HTTP_URI_CODING_ALL, uri->values[0].string.text, method,
+ sizeof(method), username, sizeof(username), host,
+ sizeof(host), &port, resource, sizeof(resource));
+
+ if ((name = cupsdValidateDest(host, resource, &dtype, &printer)) == NULL)
{
/*
* Bad URI...
@@ -8777,19 +8809,17 @@ start_printer(cupsd_client_t *con, /* I - Client connection */
if (dtype & CUPS_PRINTER_CLASS)
{
- cupsdLogMessage(CUPSD_LOG_INFO, "Class \"%s\" started by \"%s\".",
- printer->name, get_username(con));
+ cupsdLogMessage(CUPSD_LOG_INFO, "Class \"%s\" started by \"%s\".", name,
+ get_username(con));
cupsdAddEvent(CUPSD_EVENT_PRINTER_MODIFIED, printer, NULL,
- "Class \"%s\" started by \"%s\".", printer->name,
- get_username(con));
+ "Class \"%s\" started by \"%s\".", name, get_username(con));
}
else
{
- cupsdLogMessage(CUPSD_LOG_INFO, "Printer \"%s\" started by \"%s\".",
- printer->name, get_username(con));
+ cupsdLogMessage(CUPSD_LOG_INFO, "Printer \"%s\" started by \"%s\".", name,
+ get_username(con));
cupsdAddEvent(CUPSD_EVENT_PRINTER_MODIFIED, printer, NULL,
- "Printer \"%s\" started by \"%s\".", printer->name,
- get_username(con));
+ "Printer \"%s\" started by \"%s\".", name, get_username(con));
}
cupsdCheckJobs();
@@ -8812,6 +8842,16 @@ stop_printer(cupsd_client_t *con, /* I - Client connection */
{
http_status_t status; /* Policy status */
cups_ptype_t dtype; /* Destination type (printer or class) */
+ char method[HTTP_MAX_URI],
+ /* Method portion of URI */
+ username[HTTP_MAX_URI],
+ /* Username portion of URI */
+ host[HTTP_MAX_URI],
+ /* Host portion of URI */
+ resource[HTTP_MAX_URI];
+ /* Resource portion of URI */
+ int port; /* Port portion of URI */
+ const char *name; /* Printer name */
cupsd_printer_t *printer; /* Printer data */
ipp_attribute_t *attr; /* printer-state-message attribute */
@@ -8823,7 +8863,11 @@ stop_printer(cupsd_client_t *con, /* I - Client connection */
* Is the destination valid?
*/
- if (!cupsdValidateDest(uri->values[0].string.text, &dtype, &printer))
+ httpSeparateURI(HTTP_URI_CODING_ALL, uri->values[0].string.text, method,
+ sizeof(method), username, sizeof(username), host,
+ sizeof(host), &port, resource, sizeof(resource));
+
+ if ((name = cupsdValidateDest(host, resource, &dtype, &printer)) == NULL)
{
/*
* Bad URI...
@@ -8861,19 +8905,17 @@ stop_printer(cupsd_client_t *con, /* I - Client connection */
if (dtype & CUPS_PRINTER_CLASS)
{
- cupsdLogMessage(CUPSD_LOG_INFO, "Class \"%s\" stopped by \"%s\".",
- printer->name, get_username(con));
+ cupsdLogMessage(CUPSD_LOG_INFO, "Class \"%s\" stopped by \"%s\".", name,
+ get_username(con));
cupsdAddEvent(CUPSD_EVENT_PRINTER_MODIFIED, printer, NULL,
- "Class \"%s\" stopped by \"%s\".", printer->name,
- get_username(con));
+ "Class \"%s\" stopped by \"%s\".", name, get_username(con));
}
else
{
- cupsdLogMessage(CUPSD_LOG_INFO, "Printer \"%s\" stopped by \"%s\".",
- printer->name, get_username(con));
+ cupsdLogMessage(CUPSD_LOG_INFO, "Printer \"%s\" stopped by \"%s\".", name,
+ get_username(con));
cupsdAddEvent(CUPSD_EVENT_PRINTER_MODIFIED, printer, NULL,
- "Printer \"%s\" stopped by \"%s\".", printer->name,
- get_username(con));
+ "Printer \"%s\" stopped by \"%s\".", name, get_username(con));
}
/*
@@ -9000,6 +9042,15 @@ validate_job(cupsd_client_t *con, /* I - Client connection */
ipp_attribute_t *attr; /* Current attribute */
ipp_attribute_t *format; /* Document-format attribute */
cups_ptype_t dtype; /* Destination type (printer or class) */
+ char method[HTTP_MAX_URI],
+ /* Method portion of URI */
+ username[HTTP_MAX_URI],
+ /* Username portion of URI */
+ host[HTTP_MAX_URI],
+ /* Host portion of URI */
+ resource[HTTP_MAX_URI];
+ /* Resource portion of URI */
+ int port; /* Port portion of URI */
char super[MIME_MAX_SUPER],
/* Supertype of file */
type[MIME_MAX_TYPE];
@@ -9059,7 +9110,11 @@ validate_job(cupsd_client_t *con, /* I - Client connection */
* Is the destination valid?
*/
- if (!cupsdValidateDest(uri->values[0].string.text, &dtype, &printer))
+ httpSeparateURI(HTTP_URI_CODING_ALL, uri->values[0].string.text, method,
+ sizeof(method), username, sizeof(username), host,
+ sizeof(host), &port, resource, sizeof(resource));
+
+ if (cupsdValidateDest(host, resource, &dtype, &printer) == NULL)
{
/*
* Bad URI...
@@ -9159,5 +9214,5 @@ validate_user(cupsd_job_t *job, /* I - Job */
/*
- * End of "$Id: ipp.c 181 2006-06-22 20:01:18Z jlovell $".
+ * End of "$Id: ipp.c 5686 2006-06-21 21:02:56Z mike $".
*/