#
-# "$Id: cups.list,v 1.33 1999/12/15 21:16:02 mike Exp $"
+# "$Id: cups.list,v 1.34 2000/01/03 17:19:45 mike Exp $"
#
# ESP Package Manager (EPM) file list for the Common UNIX Printing
# System (CUPS).
%vendor Easy Software Products
%license LICENSE.cups
%readme README.cups
-%version 1.0.3
+%version 1.1b1
%incompat printpro
%system all
i 0555 root sys cups cups.sh
#
-# End of "$Id: cups.list,v 1.33 1999/12/15 21:16:02 mike Exp $".
+# End of "$Id: cups.list,v 1.34 2000/01/03 17:19:45 mike Exp $".
#
/*
- * "$Id: ipp.c,v 1.28 1999/12/29 02:15:40 mike Exp $"
+ * "$Id: ipp.c,v 1.29 2000/01/03 17:19:46 mike Exp $"
*
* Internet Printing Protocol support functions for the Common UNIX
* Printing System (CUPS).
* ippRead() - Read data for an IPP request.
* ippTimeToDate() - Convert from UNIX time to RFC 1903 format.
* ippWrite() - Write data for an IPP request.
- * add_attr() - Add a new attribute to the request.
+ * _ipp_add_attr() - Add a new attribute to the request.
* ipp_read() - Semi-blocking read on a HTTP connection...
*/
* Local functions...
*/
-static ipp_attribute_t *add_attr(ipp_t *ipp, int num_values);
-static int ipp_read(http_t *http, unsigned char *buffer, int length);
+static int ipp_read(http_t *http, unsigned char *buffer, int length);
/*
if (ipp == NULL || name == NULL)
return (NULL);
- if ((attr = add_attr(ipp, 1)) == NULL)
+ if ((attr = _ipp_add_attr(ipp, 1)) == NULL)
return (NULL);
attr->name = strdup(name);
if (ipp == NULL || name == NULL)
return (NULL);
- if ((attr = add_attr(ipp, num_values)) == NULL)
+ if ((attr = _ipp_add_attr(ipp, num_values)) == NULL)
return (NULL);
attr->name = strdup(name);
if (ipp == NULL || name == NULL || value == NULL)
return (NULL);
- if ((attr = add_attr(ipp, 1)) == NULL)
+ if ((attr = _ipp_add_attr(ipp, 1)) == NULL)
return (NULL);
attr->name = strdup(name);
if (ipp == NULL || name == NULL)
return (NULL);
- if ((attr = add_attr(ipp, 1)) == NULL)
+ if ((attr = _ipp_add_attr(ipp, 1)) == NULL)
return (NULL);
attr->name = strdup(name);
if (ipp == NULL || name == NULL)
return (NULL);
- if ((attr = add_attr(ipp, num_values)) == NULL)
+ if ((attr = _ipp_add_attr(ipp, num_values)) == NULL)
return (NULL);
attr->name = strdup(name);
if (ipp == NULL || name == NULL)
return (NULL);
- if ((attr = add_attr(ipp, 1)) == NULL)
+ if ((attr = _ipp_add_attr(ipp, 1)) == NULL)
return (NULL);
attr->name = strdup(name);
if (ipp == NULL || name == NULL)
return (NULL);
- if ((attr = add_attr(ipp, num_values)) == NULL)
+ if ((attr = _ipp_add_attr(ipp, num_values)) == NULL)
return (NULL);
attr->name = strdup(name);
if (ipp == NULL || name == NULL)
return (NULL);
- if ((attr = add_attr(ipp, 1)) == NULL)
+ if ((attr = _ipp_add_attr(ipp, 1)) == NULL)
return (NULL);
attr->name = strdup(name);
if (ipp == NULL || name == NULL)
return (NULL);
- if ((attr = add_attr(ipp, num_values)) == NULL)
+ if ((attr = _ipp_add_attr(ipp, num_values)) == NULL)
return (NULL);
attr->name = strdup(name);
if (ipp == NULL || name == NULL)
return (NULL);
- if ((attr = add_attr(ipp, 1)) == NULL)
+ if ((attr = _ipp_add_attr(ipp, 1)) == NULL)
return (NULL);
attr->name = strdup(name);
if (ipp == NULL || name == NULL)
return (NULL);
- if ((attr = add_attr(ipp, num_values)) == NULL)
+ if ((attr = _ipp_add_attr(ipp, num_values)) == NULL)
return (NULL);
attr->name = strdup(name);
if (ipp == NULL)
return (NULL);
- if ((attr = add_attr(ipp, 0)) == NULL)
+ if ((attr = _ipp_add_attr(ipp, 0)) == NULL)
return (NULL);
attr->group_tag = IPP_TAG_ZERO;
buffer[n] = '\0';
DEBUG_printf(("ippRead: name = \'%s\'\n", buffer));
- attr = ipp->current = add_attr(ipp, IPP_MAX_VALUES);
+ attr = ipp->current = _ipp_add_attr(ipp, IPP_MAX_VALUES);
attr->group_tag = ipp->curtag;
attr->value_tag = tag;
DEBUG_printf(("ippWrite: writing string = %d, \'%s\'\n", n,
attr->values[i].string.text));
- if ((sizeof(buffer) - (bufptr - buffer)) < (n + 2)
+ if ((sizeof(buffer) - (bufptr - buffer)) < (n + 2))
{
if (httpWrite(http, (char *)buffer, bufptr - buffer) < 0)
{
n = strlen(attr->values[i].string.charset);
- if ((sizeof(buffer) - (bufptr - buffer)) < (n + 2)
+ if ((sizeof(buffer) - (bufptr - buffer)) < (n + 2))
{
if (httpWrite(http, (char *)buffer, bufptr - buffer) < 0)
{
n = strlen(attr->values[i].string.text);
- if ((sizeof(buffer) - (bufptr - buffer)) < (n + 2)
+ if ((sizeof(buffer) - (bufptr - buffer)) < (n + 2))
{
if (httpWrite(http, (char *)buffer, bufptr - buffer) < 0)
{
/*
- * 'add_attr()' - Add a new attribute to the request.
+ * '_ipp_add_attr()' - Add a new attribute to the request.
*/
-static ipp_attribute_t * /* O - New attribute */
-add_attr(ipp_t *ipp, /* I - IPP request */
- int num_values) /* I - Number of values */
+ipp_attribute_t * /* O - New attribute */
+_ipp_add_attr(ipp_t *ipp, /* I - IPP request */
+ int num_values) /* I - Number of values */
{
- ipp_attribute_t *attr; /* New attribute */
+ ipp_attribute_t *attr; /* New attribute */
- DEBUG_printf(("add_attr(%08x, %d)\n", ipp, num_values));
+ DEBUG_printf(("_ipp_add_attr(%08x, %d)\n", ipp, num_values));
if (ipp == NULL || num_values < 0)
return (NULL);
/*
- * End of "$Id: ipp.c,v 1.28 1999/12/29 02:15:40 mike Exp $".
+ * End of "$Id: ipp.c,v 1.29 2000/01/03 17:19:46 mike Exp $".
*/
/*
- * "$Id: ipp.h,v 1.20 1999/12/29 02:15:40 mike Exp $"
+ * "$Id: ipp.h,v 1.21 2000/01/03 17:19:46 mike Exp $"
*
* Internet Printing Protocol definitions for the Common UNIX Printing
* System (CUPS).
IPP_JOB_HELD,
IPP_JOB_PROCESSING,
IPP_JOB_STOPPED,
- IPP_JOB_CANCELED,
+ IPP_JOB_CANCELLED,
IPP_JOB_ABORTED,
IPP_JOB_COMPLETED
} ipp_jstate_t;
CUPS_ACCEPT_JOBS,
CUPS_REJECT_JOBS,
CUPS_SET_DEFAULT,
+ CUPS_GET_BANNERS,
CUPS_GET_DEVICES,
CUPS_GET_PPDS
} ipp_op_t;
extern ipp_state_t ippWrite(http_t *http, ipp_t *ipp);
extern int ippPort(void);
+extern ipp_attribute_t *_ipp_add_attr(ipp_t *, int);
+
+
/*
* C++ magic...
*/
#endif /* !_CUPS_IPP_H_ */
/*
- * End of "$Id: ipp.h,v 1.20 1999/12/29 02:15:40 mike Exp $".
+ * End of "$Id: ipp.h,v 1.21 2000/01/03 17:19:46 mike Exp $".
*/
pageWidth 36 mul % Center of page
pageWidth 19 mul % Bottom of page
2 copy moveto % Position text
- (Printed Using ESP Print Pro v4.0.1) CENTER % Show text centered
+ (Printed Using ESP Print Pro v4.0.3) CENTER % Show text centered
pageWidth 3 mul sub % Move down...
2 copy moveto % Position text
grestore
showpage
%
-% End of "$Id: testprint.ps,v 1.5 1999/11/05 15:06:02 mike Exp $".
+% End of "$Id: testprint.ps,v 1.6 2000/01/03 17:19:46 mike Exp $".
%
%%EOF
/*
- * "$Id: conf.c,v 1.36 1999/12/29 02:15:41 mike Exp $"
+ * "$Id: conf.c,v 1.37 2000/01/03 17:19:49 mike Exp $"
*
* Configuration routines for the Common UNIX Printing System (CUPS).
*
strcpy(ServerRoot, CUPS_SERVERROOT);
strcpy(ServerBin, CUPS_SERVERBIN);
strcpy(RequestRoot, CUPS_REQUESTS);
- strcpy(DocumentRoot, CUPS_DOCDIR);
- strcpy(AccessLog, "logs/access_log");
- strcpy(ErrorLog, "logs/error_log");
+ strcpy(DocumentRoot, CUPS_DOCROOT);
+ strcpy(AccessLog, CUPS_LOGDIR "/access_log");
+ strcpy(ErrorLog, CUPS_LOGDIR "/error_log");
+ strcpy(PageLog, CUPS_LOGDIR "/page_log");
if ((language = DEFAULT_LANGUAGE) == NULL)
language = "en";
* Check for queued jobs...
*/
- LoadJobs();
CheckJobs();
return (1);
/*
- * End of "$Id: conf.c,v 1.36 1999/12/29 02:15:41 mike Exp $".
+ * End of "$Id: conf.c,v 1.37 2000/01/03 17:19:49 mike Exp $".
*/
/*
- * "$Id: conf.h,v 1.17 1999/12/29 02:15:41 mike Exp $"
+ * "$Id: conf.h,v 1.18 2000/01/03 17:19:49 mike Exp $"
*
* Configuration file definitions for the Common UNIX Printing System (CUPS)
* scheduler.
* Globals...
*/
-VAR char ConfigurationFile[256] VALUE(CUPS_SERVERROOT "/conf/cupsd.conf"),
+VAR char ConfigurationFile[256] VALUE(CUPS_SERVERROOT "/cupsd.conf"),
/* Configuration file to use */
ServerName[256] VALUE(""),
/* FQDN for server */
/* Root directory for binaries */
RequestRoot[1024] VALUE(CUPS_REQUESTS),
/* Directory for request files */
- DocumentRoot[1024] VALUE(CUPS_DATADIR "/doc"),
+ DocumentRoot[1024] VALUE(CUPS_DOCROOT),
/* Root directory for documents */
SystemGroup[32],
/* System group name */
- AccessLog[1024] VALUE("logs/access_log"),
+ AccessLog[1024] VALUE(CUPS_LOGDIR "/access_log"),
/* Access log filename */
- ErrorLog[1024] VALUE("logs/error_log"),
+ ErrorLog[1024] VALUE(CUPS_LOGDIR "/error_log"),
/* Error log filename */
- PageLog[1024] VALUE("logs/page_log"),
+ PageLog[1024] VALUE(CUPS_LOGDIR "/page_log"),
/* Page log filename */
DefaultLanguage[32] VALUE("C"),
/* Default language encoding */
/*
- * End of "$Id: conf.h,v 1.17 1999/12/29 02:15:41 mike Exp $".
+ * End of "$Id: conf.h,v 1.18 2000/01/03 17:19:49 mike Exp $".
*/
/*
- * "$Id: ipp.c,v 1.38 1999/12/29 02:15:41 mike Exp $"
+ * "$Id: ipp.c,v 1.39 2000/01/03 17:19:49 mike Exp $"
*
* IPP routines for the Common UNIX Printing System (CUPS) scheduler.
*
get_jobs(client_t *con, /* I - Client connection */
ipp_attribute_t *uri) /* I - Printer URI */
{
+ int i; /* Looping var */
ipp_attribute_t *attr; /* Current attribute */
char *dest; /* Destination */
cups_ptype_t dtype; /* Destination type (printer or class) */
/* Job URI... */
printer_uri[HTTP_MAX_URI];
/* Printer URI... */
+ char filename[1024]; /* Job filename */
struct stat filestats; /* Print file information */
+ size_t jobsize; /* Total job sizes */
DEBUG_printf(("get_jobs(%08x, %08x)\n", con, uri));
ippAddString(con->response, IPP_TAG_JOB, IPP_TAG_NAME, "job-name",
NULL, job->title);
- stat(job->filename, &filestats);
+ for (i = 0, jobsize = 0; i < job->num_files; i ++)
+ {
+ sprintf(filename, "%s/d%05d-%03d", RequestRoot, job->id, i + 1);
+ stat(filename, &filestats);
+ jobsize += filestats.st_size;
+ }
+
ippAddInteger(con->response, IPP_TAG_JOB, IPP_TAG_INTEGER,
- "job-k-octets", (filestats.st_size + 1023) / 1024);
+ "job-k-octets", (jobsize + 1023) / 1024);
ippAddString(con->response, IPP_TAG_JOB, IPP_TAG_URI,
"job-more-info", NULL, job_uri);
get_job_attrs(client_t *con, /* I - Client connection */
ipp_attribute_t *uri) /* I - Job URI */
{
+ int i; /* Looping var */
ipp_attribute_t *attr; /* Current attribute */
int jobid; /* Job ID */
job_t *job; /* Current job */
/* Job URI... */
printer_uri[HTTP_MAX_URI];
/* Printer URI... */
+ char filename[1024]; /* Job filename */
struct stat filestats; /* Print file information */
+ size_t jobsize; /* Total job sizes */
DEBUG_printf(("get_job_attrs(%08x, %08x)\n", con, uri));
ippAddInteger(con->response, IPP_TAG_JOB, IPP_TAG_INTEGER, "job-id", job->id);
ippAddString(con->response, IPP_TAG_JOB, IPP_TAG_NAME, "job-name",
- NULL, job->title);
+ NULL, job->title);
+
+ for (i = 0, jobsize = 0; i < job->num_files; i ++)
+ {
+ sprintf(filename, "%s/d%05d-%03d", RequestRoot, job->id, i + 1);
+ stat(filename, &filestats);
+ jobsize += filestats.st_size;
+ }
- stat(job->filename, &filestats);
ippAddInteger(con->response, IPP_TAG_JOB, IPP_TAG_INTEGER,
- "job-k-octets", (filestats.st_size + 1023) / 1024);
+ "job-k-octets", (jobsize + 1023) / 1024);
ippAddString(con->response, IPP_TAG_JOB, IPP_TAG_URI,
"job-more-info", NULL, job_uri);
job->attrs = con->request;
con->request = NULL;
- if ((filetypes = (mimetype_t **)malloc(sizeof(mimetype_t *))) == NULL)
+ if ((job->filetypes = (mime_type_t **)malloc(sizeof(mime_type_t *))) == NULL)
{
CancelJob(job->id);
LogMessage(LOG_ERROR, "print_job: unable to allocate memory for file types!");
return;
}
- job->filetypes = filetypes;
- job->filetypes[job->num_files] = filetype;
+ job->filetypes[0] = filetype;
+ job->num_files = 1;
- job->num_files ++;
sprintf(filename, "%s/d%05d-%03d", RequestRoot, job->id, job->num_files);
rename(con->filename, filename);
send_document(client_t *con, /* I - Client connection */
ipp_attribute_t *uri) /* I - Printer URI */
{
+ int i; /* Looping var */
ipp_attribute_t *attr; /* Current attribute */
ipp_attribute_t *format; /* Document-format attribute */
- char *dest; /* Destination */
- cups_ptype_t dtype; /* Destination type (printer or class) */
- int priority; /* Job priority */
- char *title; /* Job name/title */
int jobid; /* Job ID number */
job_t *job; /* Current job */
char job_uri[HTTP_MAX_URI],
mimetype[MIME_MAX_SUPER + MIME_MAX_TYPE + 2];
/* Textual name of mime type */
printer_t *printer; /* Printer data */
+ struct passwd *user; /* User info */
+ struct group *group; /* System group info */
+ char filename[1024]; /* Job filename */
DEBUG_printf(("send_document(%08x, %08x)\n", con, uri));
*/
if (job->num_files == 0)
- filetypes = (mimetype_t **)malloc(sizeof(mimetype_t *));
+ filetypes = (mime_type_t **)malloc(sizeof(mime_type_t *));
else
- filetypes = (mimetype_t **)realloc(job->filetypes,
+ filetypes = (mime_type_t **)realloc(job->filetypes,
(job->num_files + 1) *
- sizeof(mimetype_t));
+ sizeof(mime_type_t));
if (filetypes == NULL)
{
sprintf(filename, "%s/d%05d-%03d", RequestRoot, job->id, job->num_files);
rename(con->filename, filename);
- strncpy(job->title, title, sizeof(job->title) - 1);
-
con->filename[0] = '\0';
LogMessage(LOG_INFO, "File queued in job #%d by \'%s\'.", job->id,
if ((format = ippFindAttribute(con->request, "document-format", IPP_TAG_MIMETYPE)) == NULL)
{
- LogError(LOG_ERROR, "validate_job: missing document-format attribute!");
+ LogMessage(LOG_ERROR, "validate_job: missing document-format attribute!");
send_ipp_error(con, IPP_BAD_REQUEST);
return;
}
/*
- * End of "$Id: ipp.c,v 1.38 1999/12/29 02:15:41 mike Exp $".
+ * End of "$Id: ipp.c,v 1.39 2000/01/03 17:19:49 mike Exp $".
*/
/*
- * "$Id: job.c,v 1.44 1999/12/29 02:15:42 mike Exp $"
+ * "$Id: job.c,v 1.45 2000/01/03 17:19:49 mike Exp $"
*
* Job management routines for the Common UNIX Printing System (CUPS).
*
* Local functions...
*/
-static ipp_state_t ipp_read_file(const char *filename, ipp_t *request);
-static ipp_state_t ipp_write_file(const char *filename, ipp_t *request);
-static int start_process(const char *command, const char *argv[],
- const char *envp[], int in, int out, int err);
+static ipp_state_t ipp_read_file(const char *filename, ipp_t *ipp);
+static ipp_state_t ipp_write_file(const char *filename, ipp_t *ipp);
+static int start_process(const char *command, char *argv[],
+ char *envp[], int in, int out, int err);
/*
* files...
*/
+ current->current_file = 0;
+
if (!JobHistory || !JobFiles)
for (i = 1; i <= current->num_files; i ++)
{
int statusfds[2], /* Pipes used between the filters and scheduler */
filterfds[2][2];/* Pipes used between the filters */
char *argv[8], /* Filter command-line arguments */
+ filename[1024], /* Job filename */
command[1024], /* Full path to filter/backend command */
jobid[255], /* Job ID string */
title[IPP_MAX_NAME],
* Local jobs get filtered...
*/
- filters = mimeFilter(MimeDatabase, current->filetype,
+ filters = mimeFilter(MimeDatabase, current->filetypes[current->current_file],
printer->filetype, &num_filters);
if (num_filters == 0)
* printing interface to be used by CUPS.
*/
+ current->current_file ++;
+
sprintf(jobid, "%d", current->id);
+ sprintf(filename, "%s/d%05d-%03d", RequestRoot, current->id,
+ current->current_file);
argv[0] = printer->name;
argv[1] = jobid;
argv[3] = title;
argv[4] = copies;
argv[5] = options;
- argv[6] = current->filename;
+ argv[6] = filename;
argv[7] = NULL;
DEBUG_printf(("StartJob: args = \'%s\',\'%s\',\'%s\',\'%s\',\'%s\',\'%s\',\'%s\'\n",
sprintf(charset, "CHARSET=%s", attr->values[0].string.text);
}
- sprintf(content_type, "CONTENT_TYPE=%s/%s", current->filetype->super,
- current->filetype->type);
+ sprintf(content_type, "CONTENT_TYPE=%s/%s",
+ current->filetypes[current->current_file]->super,
+ current->filetypes[current->current_file]->type);
sprintf(device_uri, "DEVICE_URI=%s", printer->device_uri);
sprintf(ppd, "PPD=%s/ppd/%s.ppd", ServerRoot, printer->name);
sprintf(printer_name, "PRINTER=%s", printer->name);
filterfds[i & 1][1]));
pid = start_process(command, argv, envp, filterfds[!(i & 1)][0],
- filterfds[i & 1][1], statusfds[1]);
+ filterfds[i & 1][1], statusfds[1]);
close(filterfds[!(i & 1)][0]);
close(filterfds[!(i & 1)][1]);
filterfds[i & 1][1]));
pid = start_process(command, argv, envp, filterfds[!(i & 1)][0],
- filterfds[i & 1][1], statusfds[1]);
+ filterfds[i & 1][1], statusfds[1]);
close(filterfds[!(i & 1)][0]);
close(filterfds[!(i & 1)][1]);
{
DEBUG_puts("StopJob: job state is \'processing\'.");
- if (current->status)
+ if (current->status > 0)
SetPrinterState(current->printer, IPP_PRINTER_STOPPED);
- else if (current->printer->state == IPP_PRINTER_BUSY)
+ else
SetPrinterState(current->printer, IPP_PRINTER_IDLE);
+ DEBUG_printf(("StopJob: printer state is %d\n", current->printer->state));
+
current->state = IPP_JOB_STOPPED;
current->printer->job = NULL;
current->printer = NULL;
StopJob(job->id);
job->state = IPP_JOB_PENDING;
+ job->current_file --;
}
else if (job->status > 0)
{
* Filter had errors; cancel it...
*/
- CancelJob(job->id);
+ if (job->current_file < job->num_files)
+ StartJob(job->id, job->printer);
+ else
+ {
+ CancelJob(job->id);
- if (JobHistory)
- job->state = IPP_JOB_ABORTED;
+ if (JobHistory)
+ job->state = IPP_JOB_ABORTED;
- CheckJobs();
+ CheckJobs();
+ }
}
else
{
* Job printed successfully; cancel it...
*/
- job->printer->state_message[0] = '\0';
-
- CancelJob(job->id);
+ if (job->current_file < job->num_files)
+ StartJob(job->id, job->printer);
+ else
+ {
+ CancelJob(job->id);
- if (JobHistory)
- job->state = IPP_JOB_COMPLETED;
+ if (JobHistory)
+ job->state = IPP_JOB_COMPLETED;
- CheckJobs();
+ CheckJobs();
+ }
}
}
}
static ipp_state_t /* O - State */
ipp_read_file(const char *filename, /* I - File to read from */
- ipp_t *request) /* I - Request to read into */
+ ipp_t *ipp) /* I - Request to read into */
{
int fd; /* File descriptor for file */
int n; /* Length of data */
* Open the file if possible...
*/
- if (filename == NULL || request == NULL)
+ if (filename == NULL || ipp == NULL)
return (IPP_ERROR);
if ((fd = open(filename, O_RDONLY)) == -1)
buffer[n] = '\0';
DEBUG_printf(("ippRead: name = \'%s\'\n", buffer));
- attr = ipp->current = add_attr(ipp, IPP_MAX_VALUES);
+ attr = ipp->current = _ipp_add_attr(ipp, IPP_MAX_VALUES);
attr->group_tag = ipp->curtag;
attr->value_tag = tag;
static ipp_state_t /* O - State */
ipp_write_file(const char *filename, /* I - File to write to */
- ipp_t *request) /* I - Request to write */
+ ipp_t *ipp) /* I - Request to write */
{
int fd; /* File descriptor */
int i; /* Looping var */
* Open the file if possible...
*/
- if (filename == NULL || request == NULL)
+ if (filename == NULL || ipp == NULL)
return (IPP_ERROR);
- if ((fd = open(filename, O_WRONLY | O_CREATE | O_TRUNC, 0640)) == -1)
+ if ((fd = open(filename, O_WRONLY | O_CREAT | O_TRUNC, 0640)) == -1)
return (IPP_ERROR);
fchmod(fd, 0640);
static int /* O - Process ID or 0 */
start_process(const char *command, /* I - Full path to command */
- const char *argv[], /* I - Command-line arguments */
- const char *envp[], /* I - Environment */
+ char *argv[], /* I - Command-line arguments */
+ char *envp[], /* I - Environment */
int infd, /* I - Standard input file descriptor */
int outfd, /* I - Standard output file descriptor */
int errfd) /* I - Standard error file descriptor */
/*
- * End of "$Id: job.c,v 1.44 1999/12/29 02:15:42 mike Exp $".
+ * End of "$Id: job.c,v 1.45 2000/01/03 17:19:49 mike Exp $".
*/