- Use dateTime attribute variants.
- Use CUPS_LLFMT and CUPS_LLCAST for printing and saving time_t values.
- Use strtoll to read time_t values.
- Update web interface to request and display dateTime values.
pairs for custom boolean, integer, and keyword attributes.
- Updated the default "cups.conf" policies to specify the Set-Printer-Attributes
operation as an administrative operation.
+- Updated CUPS to rely on the dateTime variants of various IPP attributes to
+ avoid Y2038 issues (Issue #1592)
- Deprecated the "page-border" Job Template attribute (Issue #1020)
- Removed the `cups-config` utility (use `pkg-config` instead)
- Fixed use-after-free in `cupsdAcceptClient()` when we log warning during error
switch (attr->value_tag)
{
+ case IPP_TAG_DATE :
+ _cupsStrDate(valptr, sizeof(value) - (size_t)(valptr - value), ippDateToTime(ippGetDate(attr, i)));
+ break;
+
case IPP_TAG_INTEGER :
case IPP_TAG_ENUM :
if (strncmp(name, "time_at_", 8) == 0)
/*
* PPD utilities for CUPS.
*
- * Copyright © 2020-2025 by OpenPrinting.
+ * Copyright © 2020-2026 by OpenPrinting.
* Copyright © 2007-2018 by Apple Inc.
* Copyright © 1997-2006 by Easy Software Products.
*
}
else
{
- DEBUG_printf("2cupsGetPPD3: Returning ok, filename=\"%s\", modtime=%ld.", buffer, (long)ppdinfo.st_mtime);
+ DEBUG_printf("2cupsGetPPD3: Returning ok, filename=\"%s\", modtime=" CUPS_LLFMT ".", buffer, CUPS_LLCAST ppdinfo.st_mtime);
*modtime = ppdinfo.st_mtime;
return (HTTP_STATUS_OK);
}
time(&curtime);
- DEBUG_printf("1cupsGetCredentialsTrust: curtime=%ld, notBefore=%ld, notAfter=%ld", (long)curtime, (long)openssl_get_date(cert, 0), (long)openssl_get_date(cert, 1));
+ DEBUG_printf("1cupsGetCredentialsTrust: curtime=" CUPS_LLFMT ", notBefore=" CUPS_LLFMT ", notAfter=" CUPS_LLFMT, CUPS_LLCAST curtime, CUPS_LLCAST openssl_get_date(cert, 0), CUPS_LLCAST openssl_get_date(cert, 1));
if ((curtime + 86400) < openssl_get_date(cert, 0) || curtime > openssl_get_date(cert, 1))
{
/*
* Printing utilities for CUPS.
*
- * Copyright © 2020-2025 by OpenPrinting.
+ * Copyright © 2020-2026 by OpenPrinting.
* Copyright © 2007-2018 by Apple Inc.
* Copyright © 1997-2006 by Easy Software Products.
*
_cups_globals_t *cg = _cupsGlobals(); /* Pointer to library globals */
static const char * const attrs[] = /* Requested attributes */
{
+ "date-time-at-completed",
+ "date-time-at-creation",
+ "date-time-at-processing",
"document-format",
"job-id",
"job-k-octets",
"job-originating-user-name",
"job-printer-uri",
"job-priority",
- "job-state",
- "time-at-completed",
- "time-at-creation",
- "time-at-processing"
+ "job-state"
};
else if (!strcmp(attr->name, "job-k-octets") &&
attr->value_tag == IPP_TAG_INTEGER)
size = attr->values[0].integer;
- else if (!strcmp(attr->name, "time-at-completed") &&
- attr->value_tag == IPP_TAG_INTEGER)
- completed_time = attr->values[0].integer;
- else if (!strcmp(attr->name, "time-at-creation") &&
- attr->value_tag == IPP_TAG_INTEGER)
- creation_time = attr->values[0].integer;
- else if (!strcmp(attr->name, "time-at-processing") &&
- attr->value_tag == IPP_TAG_INTEGER)
- processing_time = attr->values[0].integer;
+ else if (!strcmp(attr->name, "date-time-at-completed") && attr->value_tag == IPP_TAG_DATE)
+ completed_time = ippDateToTime(ippGetDate(attr, 0));
+ else if (!strcmp(attr->name, "date-time-at-creation") && attr->value_tag == IPP_TAG_DATE)
+ creation_time = ippDateToTime(ippGetDate(attr, 0));
+ else if (!strcmp(attr->name, "date-time-at-processing") && attr->value_tag == IPP_TAG_DATE)
+ processing_time = ippDateToTime(ippGetDate(attr, 0));
else if (!strcmp(attr->name, "job-printer-uri") &&
attr->value_tag == IPP_TAG_URI)
{
/*
* Printer class routines for the CUPS scheduler.
*
- * Copyright © 2020-2025 by OpenPrinting.
+ * Copyright © 2020-2026 by OpenPrinting.
* Copyright © 2007-2017 by Apple Inc.
* Copyright © 1997-2007 by Easy Software Products, all rights reserved.
*
*/
if (value)
- p->state_time = atoi(value);
+ p->state_time = strtoll(value, NULL, 10);
}
else if (!_cups_strcasecmp(line, "Accepting"))
{
else
cupsFilePuts(fp, "State Idle\n");
- cupsFilePrintf(fp, "StateTime %d\n", (int)pclass->state_time);
+ cupsFilePrintf(fp, "StateTime " CUPS_LLFMT "\n", CUPS_LLCAST pclass->state_time);
if (pclass->accepting)
cupsFilePuts(fp, "Accepting Yes\n");
curtime = time(NULL);
- cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdCheckJobs: %d active jobs, sleeping=%d, ac-power=%d, reload=%d, curtime=%ld", cupsArrayCount(ActiveJobs), Sleeping, ACPower, NeedReload, (long)curtime);
+ cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdCheckJobs: %d active jobs, sleeping=%d, ac-power=%d, reload=%d, curtime=" CUPS_LLFMT, cupsArrayCount(ActiveJobs), Sleeping, ACPower, NeedReload, CUPS_LLCAST curtime);
for (job = (cupsd_job_t *)cupsArrayFirst(ActiveJobs);
job;
job = (cupsd_job_t *)cupsArrayNext(ActiveJobs))
{
- cupsdLogMessage(CUPSD_LOG_DEBUG2,
- "cupsdCheckJobs: Job %d - dest=\"%s\", printer=%p, "
- "state=%d, cancel_time=%ld, hold_until=%ld, kill_time=%ld, "
- "pending_cost=%d, pending_timeout=%ld", job->id, job->dest,
- (void *)job->printer, job->state_value, (long)job->cancel_time,
- (long)job->hold_until, (long)job->kill_time,
- job->pending_cost, (long)job->pending_timeout);
+ cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdCheckJobs: Job %d - dest=\"%s\", printer=%p, state=%d, cancel_time=" CUPS_LLFMT ", hold_until=" CUPS_LLFMT ", kill_time=" CUPS_LLFMT ", pending_cost=%d, pending_timeout=" CUPS_LLFMT, job->id, job->dest,(void *)job->printer, job->state_value, CUPS_LLCAST job->cancel_time, CUPS_LLCAST job->hold_until, CUPS_LLCAST job->kill_time, job->pending_cost, CUPS_LLCAST job->pending_timeout);
/*
* Kill jobs if they are unresponsive...
curtime = time(NULL);
JobHistoryUpdate = 0;
- cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdCleanJobs: curtime=%d", (int)curtime);
+ cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdCleanJobs: curtime=" CUPS_LLFMT, CUPS_LLCAST curtime);
for (job = (cupsd_job_t *)cupsArrayFirst(Jobs);
job;
job = (cupsd_job_t *)cupsArrayNext(Jobs))
{
- cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdCleanJobs: Job %d, state=%d, printer=%p, history_time=%d, file_time=%d, num_files=%d", job->id, (int)job->state_value, (void *)job->printer, (int)job->history_time, (int)job->file_time, (int)job->num_files);
+ cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdCleanJobs: Job %d, state=%d, printer=%p, history_time=" CUPS_LLFMT ", file_time=" CUPS_LLFMT ", num_files=%d", job->id, (int)job->state_value, (void *)job->printer, CUPS_LLCAST job->history_time, CUPS_LLCAST job->file_time, (int)job->num_files);
if ((job->history_time && job->history_time < JobHistoryUpdate) || !JobHistoryUpdate)
JobHistoryUpdate = job->history_time;
goto error;
}
- if ((attr = ippFindAttribute(job->attrs, "time-at-creation", IPP_TAG_INTEGER)) == NULL)
+ if ((attr = ippFindAttribute(job->attrs, "date-time-at-creation", IPP_TAG_DATE)) == NULL)
{
cupsdLogJob(job, CUPSD_LOG_ERROR,
"Missing or bad time-at-creation attribute in control file.");
goto error;
}
- job->creation_time = attr->values[0].integer;
- job->state_value = (ipp_jstate_t)job->state->values[0].integer;
- job->file_time = 0;
- job->history_time = 0;
+ job->creation_time = ippDateToTime(ippGetDate(attr, 0));
+ job->state_value = (ipp_jstate_t)job->state->values[0].integer;
+ job->file_time = 0;
+ job->history_time = 0;
- if (job->state_value >= IPP_JSTATE_CANCELED && (attr = ippFindAttribute(job->attrs, "time-at-completed", IPP_TAG_INTEGER)) != NULL)
+ if (job->state_value >= IPP_JSTATE_CANCELED && (attr = ippFindAttribute(job->attrs, "date-time-at-completed", IPP_TAG_DATE)) != NULL)
{
- job->completed_time = attr->values[0].integer;
+ job->completed_time = ippDateToTime(ippGetDate(attr, 0));
if (JobHistory < INT_MAX)
job->history_time = job->completed_time + JobHistory;
else
job->file_time = INT_MAX;
- cupsdLogJob(job, CUPSD_LOG_DEBUG2, "cupsdLoadJob: job->file_time=%ld, time-at-completed=%ld, JobFiles=%d", (long)job->file_time, (long)attr->values[0].integer, JobFiles);
+ cupsdLogJob(job, CUPSD_LOG_DEBUG2, "cupsdLoadJob: job->file_time=" CUPS_LLFMT ", time-at-completed=" CUPS_LLFMT ", JobFiles=%d", CUPS_LLCAST job->file_time, CUPS_LLCAST attr->values[0].integer, JobFiles);
if (job->file_time < JobHistoryUpdate || !JobHistoryUpdate)
JobHistoryUpdate = job->file_time;
cupsFilePrintf(fp, "<Job %d>\n", job->id);
cupsFilePrintf(fp, "State %d\n", job->state_value);
- cupsFilePrintf(fp, "Created %ld\n", (long)job->creation_time);
+ cupsFilePrintf(fp, "Created " CUPS_LLFMT "\n", CUPS_LLCAST job->creation_time);
if (job->completed_time)
- cupsFilePrintf(fp, "Completed %ld\n", (long)job->completed_time);
+ cupsFilePrintf(fp, "Completed " CUPS_LLFMT "\n", CUPS_LLCAST job->completed_time);
cupsFilePrintf(fp, "Priority %d\n", job->priority);
if (job->hold_until)
- cupsFilePrintf(fp, "HoldUntil %ld\n", (long)job->hold_until);
+ cupsFilePrintf(fp, "HoldUntil " CUPS_LLFMT "\n", CUPS_LLCAST job->hold_until);
cupsFilePrintf(fp, "Username %s\n", job->username);
if (job->name)
cupsFilePutConf(fp, "Name", job->name);
job->hold_until += 24 * 60 * 60;
}
- cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdSetJobHoldUntil: hold_until=%d",
- (int)job->hold_until);
+ cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdSetJobHoldUntil: hold_until=" CUPS_LLFMT,
+ CUPS_LLCAST job->hold_until);
}
job = (cupsd_job_t *)cupsArrayNext(Jobs))
{
if (job->state_value >= IPP_JSTATE_CANCELED &&
- (attr = ippFindAttribute(job->attrs, "time-at-completed",
- IPP_TAG_INTEGER)) != NULL)
+ (attr = ippFindAttribute(job->attrs, "date-time-at-completed",
+ IPP_TAG_DATE)) != NULL)
{
/*
* Update history/file expiration times...
*/
- job->completed_time = attr->values[0].integer;
+ job->completed_time = ippDateToTime(ippGetDate(attr, 0));
if (JobHistory < INT_MAX)
job->history_time = job->completed_time + JobHistory;
else
job->file_time = INT_MAX;
- cupsdLogJob(job, CUPSD_LOG_DEBUG2, "cupsdUpdateJobs: job->file_time=%ld, time-at-completed=%ld, JobFiles=%d", (long)job->file_time, (long)attr->values[0].integer, JobFiles);
+ cupsdLogJob(job, CUPSD_LOG_DEBUG2, "cupsdUpdateJobs: job->file_time=" CUPS_LLFMT ", time-at-completed=" CUPS_LLFMT ", JobFiles=%d", CUPS_LLCAST job->file_time, CUPS_LLCAST job->completed_time, JobFiles);
if (job->file_time < JobHistoryUpdate || !JobHistoryUpdate)
JobHistoryUpdate = job->file_time;
}
}
- cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdUpdateJobs: JobHistoryUpdate=%ld",
- (long)JobHistoryUpdate);
+ cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdUpdateJobs: JobHistoryUpdate=" CUPS_LLFMT, CUPS_LLCAST JobHistoryUpdate);
}
}
else if (!_cups_strcasecmp(line, "Created"))
{
- job->creation_time = strtol(value, NULL, 10);
+ job->creation_time = (time_t)strtoll(value, NULL, 10);
}
else if (!_cups_strcasecmp(line, "Completed"))
{
- job->completed_time = strtol(value, NULL, 10);
+ job->completed_time = (time_t)strtoll(value, NULL, 10);
}
else if (!_cups_strcasecmp(line, "HoldUntil"))
{
- job->hold_until = strtol(value, NULL, 10);
+ job->hold_until = (time_t)strtoll(value, NULL, 10);
}
else if (!_cups_strcasecmp(line, "Priority"))
{
*/
if (value)
- p->state_time = (time_t)strtol(value, NULL, 10);
+ p->state_time = (time_t)strtoll(value, NULL, 10);
}
else if (!_cups_strcasecmp(line, "ConfigTime"))
{
*/
if (value)
- p->config_time = (time_t)strtol(value, NULL, 10);
+ p->config_time = (time_t)strtoll(value, NULL, 10);
}
else if (!_cups_strcasecmp(line, "Accepting"))
{
cupsdSetPrinterAttrs(p);
if (!strcmp(value, "marker-change-time"))
- p->marker_time = (time_t)strtol(valueptr, NULL, 10);
+ p->marker_time = (time_t)strtoll(valueptr, NULL, 10);
else
cupsdSetPrinterAttr(p, value, valueptr);
}
else
cupsFilePuts(fp, "State Idle\n");
- cupsFilePrintf(fp, "StateTime %d\n", (int)printer->state_time);
- cupsFilePrintf(fp, "ConfigTime %d\n", (int)printer->config_time);
+ cupsFilePrintf(fp, "StateTime " CUPS_LLFMT "\n", CUPS_LLCAST printer->state_time);
+ cupsFilePrintf(fp, "ConfigTime " CUPS_LLFMT "\n", CUPS_LLCAST printer->config_time);
for (j = 0; j < printer->num_reasons; j ++)
if (strcmp(printer->reasons[j], "connecting-to-device") &&
}
if (printer->marker_time)
- cupsFilePrintf(fp, "Attribute marker-change-time %ld\n",
- (long)printer->marker_time);
+ cupsFilePrintf(fp, "Attribute marker-change-time " CUPS_LLFMT "\n", CUPS_LLCAST printer->marker_time);
if (printer == DefaultPrinter)
cupsFilePuts(fp, "</DefaultPrinter>\n");
/*
* Subscription routines for the CUPS scheduler.
*
- * Copyright © 2020-2025 by OpenPrinting.
+ * Copyright © 2020-2026 by OpenPrinting.
* Copyright © 2007-2019 by Apple Inc.
* Copyright © 1997-2007 by Easy Software Products, all rights reserved.
*
*/
if (value && isdigit(*value & 255))
- sub->expire = atoi(value);
+ sub->expire = (time_t)strtoll(value, NULL, 10);
else
{
cupsdLogMessage(CUPSD_LOG_ERROR,
cupsFilePrintf(fp, "LeaseDuration %d\n", sub->lease);
cupsFilePrintf(fp, "Interval %d\n", sub->interval);
- cupsFilePrintf(fp, "ExpirationTime %ld\n", (long)sub->expire);
+ cupsFilePrintf(fp, "ExpirationTime " CUPS_LLFMT "\n", CUPS_LLCAST sub->expire);
cupsFilePrintf(fp, "NextEventId %d\n", sub->next_event_id);
cupsFilePuts(fp, "</Subscription>\n");
/*
* "lpstat" command for CUPS.
*
- * Copyright © 2020-2024 by OpenPrinting.
+ * Copyright © 2020-2026 by OpenPrinting.
* Copyright © 2007-2018 by Apple Inc.
* Copyright © 1997-2006 by Easy Software Products.
*
static const char *pattrs[] = /* Attributes we need for printers... */
{
"printer-name",
- "printer-state-change-time",
+ "printer-state-change-date-time",
"printer-state-message",
"printer-is-accepting-jobs"
};
if (!strcmp(attr->name, "printer-name") &&
attr->value_tag == IPP_TAG_NAME)
printer = attr->values[0].string.text;
- else if (!strcmp(attr->name, "printer-state-change-time") &&
- attr->value_tag == IPP_TAG_INTEGER)
- ptime = (time_t)attr->values[0].integer;
+ else if (!strcmp(attr->name, "printer-state-change-date-time") &&
+ attr->value_tag == IPP_TAG_DATE)
+ ptime = ippDateToTime(ippGetDate(attr, 0));
else if (!strcmp(attr->name, "printer-state-message") &&
attr->value_tag == IPP_TAG_TEXT)
message = attr->values[0].string.text;
date[255]; /* Date buffer */
static const char *jattrs[] = /* Attributes we need for jobs... */
{
+ "date-time-at-creation",
+ "date-time-at-completed",
"job-id",
"job-k-octets",
"job-name",
"job-originating-user-name",
"job-printer-state-message",
"job-printer-uri",
- "job-state-reasons",
- "time-at-creation",
- "time-at-completed"
+ "job-state-reasons"
};
!strcmp(which, "canceled") ||
!strcmp(which, "successful") ||
!strcmp(which, "completed"))
- time_at = "time-at-completed";
+ time_at = "date-time-at-completed";
else
- time_at = "time-at-creation";
+ time_at = "date-time-at-creation";
rank = -1;
else if (!strcmp(attr->name, "job-k-octets") &&
attr->value_tag == IPP_TAG_INTEGER)
size = attr->values[0].integer;
- else if (!strcmp(attr->name, time_at) && attr->value_tag == IPP_TAG_INTEGER)
- jobtime = attr->values[0].integer;
+ else if (!strcmp(attr->name, time_at) && attr->value_tag == IPP_TAG_DATE)
+ jobtime = ippDateToTime(ippGetDate(attr, 0));
else if (!strcmp(attr->name, "job-printer-state-message") &&
attr->value_tag == IPP_TAG_TEXT)
message = attr->values[0].string.text;
if (reasons)
{
char alerts[1024], /* Alerts string */
- *aptr; /* Pointer into alerts string */
+ *aptr; /* Pointer into alerts string */
for (i = 0, aptr = alerts; i < reasons->num_values; i ++)
{
"printer-state",
"printer-state-message",
"printer-state-reasons",
- "printer-state-change-time",
+ "printer-state-change-date-time",
"printer-type",
"printer-info",
"printer-location",
else if (!strcmp(attr->name, "printer-state-message") &&
attr->value_tag == IPP_TAG_TEXT)
message = attr->values[0].string.text;
- else if (!strcmp(attr->name, "printer-state-change-time") &&
- attr->value_tag == IPP_TAG_INTEGER)
- ptime = (time_t)attr->values[0].integer;
+ else if (!strcmp(attr->name, "printer-state-change-date-time") &&
+ attr->value_tag == IPP_TAG_DATE)
+ ptime = ippDateToTime(ippGetDate(attr, 0));
else if (!strcmp(attr->name, "printer-info") &&
attr->value_tag == IPP_TAG_TEXT)
description = attr->values[0].string.text;
<TD>{?job_originating_user_name=?Tilbageholdt:{job_originating_user_name}} </TD>
<TD>{job_k_octets}k </TD>
<TD>{job_impressions_completed=0?Ukendt:{?job_impressions_completed}} </TD>
-<TD>{job_state=3?afventer siden<BR>{?time_at_creation=?Ukendt:{time_at_creation}}:{job_state=4?tilbageholdt siden<BR>{?time_at_creation=?Ukendt:{time_at_creation}}:
-{job_state=5?behandler siden<BR>{?time_at_processing=?Ukendt:{time_at_processing}}:{job_state=6?stoppet:
-{job_state=7?annulleret ved<BR>{?time_at_completed=?Ukendt:{time_at_completed}}:{job_state=8?afbrudt:fuldtført ved<BR>{?time_at_completed=?Ukendt:{time_at_completed}}}}}}}} {job_printer_state_message?<BR>
+<TD>{job_state=3?afventer siden<BR>{?date_time_at_creation=?Ukendt:{date_time_at_creation}}:{job_state=4?tilbageholdt siden<BR>{?date_time_at_creation=?Ukendt:{date_time_at_creation}}:
+{job_state=5?behandler siden<BR>{?date_time_at_processing=?Ukendt:{date_time_at_processing}}:{job_state=6?stoppet:
+{job_state=7?annulleret ved<BR>{?date_time_at_completed=?Ukendt:{date_time_at_completed}}:{job_state=8?afbrudt:fuldtført ved<BR>{?date_time_at_completed=?Ukendt:{date_time_at_completed}}}}}}}} {job_printer_state_message?<BR>
<EM>"{job_printer_state_message}"</EM>:}</TD>
<TD>
{job_preserved>0?{job_state>5?
<TD>{?job_originating_user_name=?Zurückbehalten:{job_originating_user_name}} </TD>
<TD>{job_k_octets}k </TD>
<TD>{job_impressions_completed=0?Unbekannt:{?job_impressions_completed}} </TD>
-<TD>{job_state=3?unerledigt seit<BR>{?time_at_creation=?Unknown:{time_at_creation}}:{job_state=4?angehalten seit<BR>{?time_at_creation=?Unknown:{time_at_creation}}:
-{job_state=5?verarbeitet seit<BR>{?time_at_processing=?Unknown:{time_at_processing}}:{job_state=6?angehalten:
-{job_state=7?gelöscht am<BR>{?time_at_completed=?Unknown:{time_at_completed}}:{job_state=8?abgebrochen:beendet am<BR>{?time_at_completed=?Unknown:{time_at_completed}}}}}}}} {job_printer_state_message?<BR>
+<TD>{job_state=3?unerledigt seit<BR>{?date_time_at_creation=?Unknown:{date_time_at_creation}}:{job_state=4?angehalten seit<BR>{?date_time_at_creation=?Unknown:{date_time_at_creation}}:
+{job_state=5?verarbeitet seit<BR>{?date_time_at_processing=?Unknown:{date_time_at_processing}}:{job_state=6?angehalten:
+{job_state=7?gelöscht am<BR>{?date_time_at_completed=?Unknown:{date_time_at_completed}}:{job_state=8?abgebrochen:beendet am<BR>{?date_time_at_completed=?Unknown:{date_time_at_completed}}}}}}}} {job_printer_state_message?<BR>
<EM>"{job_printer_state_message}"</EM>:}</TD>
<TD>
{job_preserved>0?{job_state>5?
<TD>{?job_originating_user_name=?Retenido:{job_originating_user_name}} </TD>
<TD>{job_k_octets}k </TD>
<TD>{job_impressions_completed=0?Desconocido:{?job_impressions_completed}} </TD>
-<TD>{job_state=3?pendiente desde<BR>{?time_at_creation=?Unknown:{time_at_creation}}:{job_state=4?retenido desde<BR>{?time_at_creation=?Unknown:{time_at_creation}}:
-{job_state=5?en proceso desde<BR>{?time_at_processing=?Unknown:{time_at_processing}}:{job_state=6?parado:
-{job_state=7?cancelado el<BR>{?time_at_completed=?Unknown:{time_at_completed}}:{job_state=8?interrumpido:completado el<BR>{?time_at_completed=?Unknown:{time_at_completed}}}}}}}} {job_printer_state_message?<BR>
+<TD>{job_state=3?pendiente desde<BR>{?date_time_at_creation=?Unknown:{date_time_at_creation}}:{job_state=4?retenido desde<BR>{?date_time_at_creation=?Unknown:{date_time_at_creation}}:
+{job_state=5?en proceso desde<BR>{?date_time_at_processing=?Unknown:{date_time_at_processing}}:{job_state=6?parado:
+{job_state=7?cancelado el<BR>{?date_time_at_completed=?Unknown:{date_time_at_completed}}:{job_state=8?interrumpido:completado el<BR>{?date_time_at_completed=?Unknown:{date_time_at_completed}}}}}}}} {job_printer_state_message?<BR>
<EM>"{job_printer_state_message}"</EM>:}</TD>
<TD>
{job_preserved>0?{job_state>5?
<TD>{?job_originating_user_name=?Caché:{job_originating_user_name}} </TD>
<TD>{job_k_octets}k </TD>
<TD>{job_impressions_completed=0?Inconnu:{?job_impressions_completed}} </TD>
-<TD>{job_state=3?en attente depuis<BR>{?time_at_creation=?Inconnu:{time_at_creation}}:{job_state=4?retenu depuis le<BR>{?time_at_creation=?Inconnu:{time_at_creation}}:
-{job_state=5?en cours d'impression depuis<BR>{?time_at_processing=?Inconnu:{time_at_processing}}:{job_state=6?arrêté:
-{job_state=7?annulé depuis<BR>{?time_at_completed=?Inconnu:{time_at_completed}}:{job_state=8?annulé:terminé depuis<BR>{?time_at_completed=?Inconnu:{time_at_completed}}}}}}}} {job_printer_state_message?<BR>
+<TD>{job_state=3?en attente depuis<BR>{?date_time_at_creation=?Inconnu:{date_time_at_creation}}:{job_state=4?retenu depuis le<BR>{?date_time_at_creation=?Inconnu:{date_time_at_creation}}:
+{job_state=5?en cours d'impression depuis<BR>{?date_time_at_processing=?Inconnu:{date_time_at_processing}}:{job_state=6?arrêté:
+{job_state=7?annulé depuis<BR>{?date_time_at_completed=?Inconnu:{date_time_at_completed}}:{job_state=8?annulé:terminé depuis<BR>{?date_time_at_completed=?Inconnu:{date_time_at_completed}}}}}}}} {job_printer_state_message?<BR>
<EM>"{job_printer_state_message}"</EM>:}</TD>
<TD>
{job_preserved>0?{job_state>5?
<TD>{?job_originating_user_name=?隠匿:{job_originating_user_name}} </TD>
<TD>{job_k_octets}k </TD>
<TD>{job_impressions_completed=0?不明:{?job_impressions_completed}} </TD>
-<TD>{job_state=3?{?time_at_creation=?Unknown:{time_at_creation}}<BR>から保留中:{job_state=4?{?time_at_creation=?Unknown:{time_at_creation}}<BR>から保留中:
-{job_state=5?{?time_at_processing=?Unknown:{time_at_processing}}<BR>から処理中:{job_state=6?に停止:
-{job_state=7?{?time_at_completed=?Unknown:{time_at_completed}}<BR>にキャンセル:{job_state=8?に中断:{?time_at_completed=?Unknown:{time_at_completed}}<BR>に完了}}}}}} {job_printer_state_message?<BR>
+<TD>{job_state=3?{?date_time_at_creation=?Unknown:{date_time_at_creation}}<BR>から保留中:{job_state=4?{?date_time_at_creation=?Unknown:{date_time_at_creation}}<BR>から保留中:
+{job_state=5?{?date_time_at_processing=?Unknown:{date_time_at_processing}}<BR>から処理中:{job_state=6?に停止:
+{job_state=7?{?date_time_at_completed=?Unknown:{date_time_at_completed}}<BR>にキャンセル:{job_state=8?に中断:{?date_time_at_completed=?Unknown:{date_time_at_completed}}<BR>に完了}}}}}} {job_printer_state_message?<BR>
<EM>"{job_printer_state_message}"</EM>:}</TD>
<TD>
{job_preserved>0?{job_state>5?
<TD>{?job_originating_user_name=?Withheld:{job_originating_user_name}} </TD>
<TD>{job_k_octets}k </TD>
<TD>{job_impressions_completed=0?Unknown:{?job_impressions_completed}} </TD>
-<TD>{job_state=3?pending since<BR>{?time_at_creation=?Unknown:{time_at_creation}}:{job_state=4?held since<BR>{?time_at_creation=?Unknown:{time_at_creation}}:
-{job_state=5?processing since<BR>{?time_at_processing=?Unknown:{time_at_processing}}:{job_state=6?stopped:
-{job_state=7?canceled at<BR>{?time_at_completed=?Unknown:{time_at_completed}}:{job_state=8?aborted:completed at<BR>{?time_at_completed=?Unknown:{time_at_completed}}}}}}}} {job_printer_state_message?<BR>
+<TD>{job_state=3?pending since<BR>{?date_time_at_creation=?Unknown:{date_time_at_creation}}:{job_state=4?held since<BR>{?date_time_at_creation=?Unknown:{date_time_at_creation}}:
+{job_state=5?processing since<BR>{?date_time_at_processing=?Unknown:{date_time_at_processing}}:{job_state=6?stopped:
+{job_state=7?canceled at<BR>{?date_time_at_completed=?Unknown:{date_time_at_completed}}:{job_state=8?aborted:completed at<BR>{?date_time_at_completed=?Unknown:{date_time_at_completed}}}}}}}} {job_printer_state_message?<BR>
<EM>"{job_printer_state_message}"</EM>:}</TD>
<TD>
{job_preserved>0?{job_state>5?
<TD>{?job_originating_user_name=?Nie podano:{job_originating_user_name}} </TD>
<TD>{job_k_octets}k </TD>
<TD>{job_impressions_completed=0?Niewiadoma:{?job_impressions_completed}} </TD>
-<TD>{job_state=3?czeka od<BR>{?time_at_creation=?Nieznany:{time_at_creation}}:{job_state=4?wstrzymany od<BR>{?time_at_creation=?Nieznany:{time_at_creation}}:
-{job_state=5?przetwarzany od<BR>{?time_at_processing=?Nieznany:{time_at_processing}}:{job_state=6?zatrzymany:
-{job_state=7?anulowany o<BR>{?time_at_completed=?Nieznany:{time_at_completed}}:{job_state=8?przerwany:zakończony o<BR>{?time_at_completed=?Nieznany:{time_at_completed}}}}}}}} {job_printer_state_message?<BR>
+<TD>{job_state=3?czeka od<BR>{?date_time_at_creation=?Nieznany:{date_time_at_creation}}:{job_state=4?wstrzymany od<BR>{?date_time_at_creation=?Nieznany:{date_time_at_creation}}:
+{job_state=5?przetwarzany od<BR>{?date_time_at_processing=?Nieznany:{date_time_at_processing}}:{job_state=6?zatrzymany:
+{job_state=7?anulowany o<BR>{?date_time_at_completed=?Nieznany:{date_time_at_completed}}:{job_state=8?przerwany:zakończony o<BR>{?date_time_at_completed=?Nieznany:{date_time_at_completed}}}}}}}} {job_printer_state_message?<BR>
<EM>"{job_printer_state_message}"</EM>:}</TD>
<TD>
{job_preserved>0?{job_state>5?
<TD>{?job_originating_user_name=?Retido:{job_originating_user_name}} </TD>
<TD>{job_k_octets}k </TD>
<TD>{job_impressions_completed=0?Desconhecido:{?job_impressions_completed}} </TD>
-<TD>{job_state=3?Pendente desde<BR>{?time_at_creation=?Unknown:{time_at_creation}}:{job_state=4?Retido desde<BR>{?time_at_creation=?Unknown:{time_at_creation}}:
-{job_state=5?Processando desde<BR>{?time_at_processing=?Unknown:{time_at_processing}}:{job_state=6?parado:
-{job_state=7?Cancelado em<BR>{?time_at_completed=?Unknown:{time_at_completed}}:{job_state=8?Abortado:Concluído em<BR>{?time_at_completed=?Unknown:{time_at_completed}}}}}}}} {job_printer_state_message?<BR>
+<TD>{job_state=3?Pendente desde<BR>{?date_time_at_creation=?Unknown:{date_time_at_creation}}:{job_state=4?Retido desde<BR>{?date_time_at_creation=?Unknown:{date_time_at_creation}}:
+{job_state=5?Processando desde<BR>{?date_time_at_processing=?Unknown:{date_time_at_processing}}:{job_state=6?parado:
+{job_state=7?Cancelado em<BR>{?date_time_at_completed=?Unknown:{date_time_at_completed}}:{job_state=8?Abortado:Concluído em<BR>{?date_time_at_completed=?Unknown:{date_time_at_completed}}}}}}}} {job_printer_state_message?<BR>
<EM>"{job_printer_state_message}"</EM>:}</TD>
<TD>
{job_preserved>0?{job_state>5?
<TD>{?job_originating_user_name=?Приостановлено пользователем:{job_originating_user_name}} </TD>
<TD>{job_k_octets}k </TD>
<TD>{job_impressions_completed=0?Неизвестно:{?job_impressions_completed}} </TD>
-<TD>{job_state=3?В очереди<BR>{?time_at_creation=?Unknown:{time_at_creation}}:{job_state=4?Приостановлено с<BR>{?time_at_creation=?Unknown:{time_at_creation}}:
-{job_state=5?Создано<BR>{?time_at_processing=?Unknown:{time_at_processing}}:{job_state=6?Остановлено:
-{job_state=7?Отменено<BR>{?time_at_completed=?Unknown:{time_at_completed}}:{job_state=8?Прервано:Завершено<BR>{?time_at_completed=?Unknown:{time_at_completed}}}}}}}} {job_printer_state_message?<BR>
+<TD>{job_state=3?В очереди<BR>{?date_time_at_creation=?Unknown:{date_time_at_creation}}:{job_state=4?Приостановлено с<BR>{?date_time_at_creation=?Unknown:{date_time_at_creation}}:
+{job_state=5?Создано<BR>{?date_time_at_processing=?Unknown:{date_time_at_processing}}:{job_state=6?Остановлено:
+{job_state=7?Отменено<BR>{?date_time_at_completed=?Unknown:{date_time_at_completed}}:{job_state=8?Прервано:Завершено<BR>{?date_time_at_completed=?Unknown:{date_time_at_completed}}}}}}}} {job_printer_state_message?<BR>
<EM>"{job_printer_state_message}"</EM>:}</TD>
<TD>
{job_preserved>0?{job_state>5?
<TD>{?job_originating_user_name=?Withheld:{job_originating_user_name}} </TD>
<TD>{job_k_octets}k </TD>
<TD>{job_impressions_completed=0?Unknown:{?job_impressions_completed}} </TD>
-<TD>{job_state=3?pending since<BR>{?time_at_creation=?Unknown:{time_at_creation}}:{job_state=4?held since<BR>{?time_at_creation=?Unknown:{time_at_creation}}:
-{job_state=5?processing since<BR>{?time_at_processing=?Unknown:{time_at_processing}}:{job_state=6?stopped:
-{job_state=7?canceled at<BR>{?time_at_completed=?Unknown:{time_at_completed}}:{job_state=8?aborted:completed at<BR>{?time_at_completed=?Unknown:{time_at_completed}}}}}}}} {job_printer_state_message?<BR>
+<TD>{job_state=3?pending since<BR>{?date_time_at_creation=?Unknown:{date_time_at_creation}}:{job_state=4?held since<BR>{?date_time_at_creation=?Unknown:{date_time_at_creation}}:
+{job_state=5?processing since<BR>{?date_time_at_processing=?Unknown:{date_time_at_processing}}:{job_state=6?stopped:
+{job_state=7?canceled at<BR>{?date_time_at_completed=?Unknown:{date_time_at_completed}}:{job_state=8?aborted:completed at<BR>{?date_time_at_completed=?Unknown:{date_time_at_completed}}}}}}}} {job_printer_state_message?<BR>
<EM>"{job_printer_state_message}"</EM>:}</TD>
<TD>
{job_preserved>0?{job_state>5?