1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
|
/*
* Print job definitions for the CUPS scheduler.
*
* Copyright 2007-2015 by Apple Inc.
* Copyright 1997-2007 by Easy Software Products, all rights reserved.
*
* Licensed under Apache License v2.0. See the file "LICENSE" for more information.
*/
/*
* Constants...
*/
typedef enum cupsd_jobaction_e /**** Actions for state changes ****/
{
CUPSD_JOB_DEFAULT, /* Use default action */
CUPSD_JOB_FORCE, /* Force the change */
CUPSD_JOB_PURGE /* Force the change and purge */
} cupsd_jobaction_t;
/*
* Job request structure...
*/
struct cupsd_job_s /**** Job request ****/
{
int id, /* Job ID */
priority, /* Job priority */
dirty; /* Do we need to write the "c" file? */
ipp_jstate_t state_value; /* Cached job-state */
int pending_timeout;/* Non-zero if the job was created and
* waiting on files */
char *username; /* Printing user */
char *dest; /* Destination printer or class */
char *name; /* Job name/title */
int koctets; /* job-k-octets */
cups_ptype_t dtype; /* Destination type */
cupsd_printer_t *printer; /* Printer this job is assigned to */
int num_files; /* Number of files in job */
mime_type_t **filetypes; /* File types */
int *compressions; /* Compression status of each file */
ipp_attribute_t *impressions, /* job-impressions-completed */
*sheets; /* job-media-sheets-completed */
time_t access_time, /* Last access time */
cancel_time, /* When to cancel/send SIGTERM */
creation_time, /* When job was created */
completed_time, /* When job was completed (0 if not) */
file_time, /* Job file retain time */
history_time, /* Job history retain time */
hold_until, /* Hold expiration date/time */
kill_time; /* When to send SIGKILL */
ipp_attribute_t *state; /* Job state */
ipp_attribute_t *reasons; /* Job state reasons */
ipp_attribute_t *job_sheets; /* Job sheets (NULL if none) */
ipp_attribute_t *printer_message,
/* job-printer-state-message */
*printer_reasons;
/* job-printer-state-reasons */
int current_file; /* Current file in job */
ipp_t *attrs; /* Job attributes */
int print_pipes[2], /* Print data pipes */
back_pipes[2], /* Backchannel pipes */
side_pipes[2], /* Sidechannel pipes */
status_pipes[2];/* Status pipes */
cupsd_statbuf_t *status_buffer; /* Status buffer for this job */
int status_level; /* Highest log level in a status
* message */
int cost; /* Filtering cost */
int pending_cost; /* Waiting for FilterLimit */
int filters[MAX_FILTERS + 1];
/* Filter process IDs, 0 terminated */
int backend; /* Backend process ID */
int status; /* Status code from filters */
int tries; /* Number of tries for this job */
int completed; /* cups-waiting-for-job-completed seen */
int retry_as_raster;/* Need to retry the job as raster */
char *auth_env[3], /* AUTH_xxx environment variables,
* if any */
*auth_uid; /* AUTH_UID environment variable */
void *profile, /* Security profile for filters */
*bprofile; /* Security profile for backend */
cups_array_t *history; /* Debug log history */
int progress; /* Printing progress */
int num_keywords; /* Number of PPD keywords */
cups_option_t *keywords; /* PPD keywords */
};
typedef struct cupsd_joblog_s /**** Job log message ****/
{
time_t time; /* Time of message */
char message[1]; /* Message string */
} cupsd_joblog_t;
/*
* Globals...
*/
VAR int JobHistory VALUE(INT_MAX);
/* Preserve job history? */
VAR int JobFiles VALUE(86400);
/* Preserve job files? */
VAR time_t JobHistoryUpdate VALUE(0);
/* Time for next job history update */
VAR int MaxJobs VALUE(0),
/* Max number of jobs */
MaxActiveJobs VALUE(0),
/* Max number of active jobs */
MaxHoldTime VALUE(0),
/* Max time for indefinite hold */
MaxJobsPerUser VALUE(0),
/* Max jobs per user */
MaxJobsPerPrinter VALUE(0),
/* Max jobs per printer */
MaxJobTime VALUE(3 * 60 * 60);
/* Max time for a job */
VAR int JobAutoPurge VALUE(0);
/* Automatically purge jobs */
VAR cups_array_t *Jobs VALUE(NULL),
/* List of current jobs */
*ActiveJobs VALUE(NULL),
/* List of active jobs */
*PrintingJobs VALUE(NULL);
/* List of jobs that are printing */
VAR int NextJobId VALUE(1);
/* Next job ID to use */
VAR int JobKillDelay VALUE(DEFAULT_TIMEOUT),
/* Delay before killing jobs */
JobRetryLimit VALUE(5),
/* Max number of tries */
JobRetryInterval VALUE(300);
/* Seconds between retries */
/*
* Prototypes...
*/
extern cupsd_job_t *cupsdAddJob(int priority, const char *dest);
extern void cupsdCancelJobs(const char *dest, const char *username,
int purge);
extern void cupsdCheckJobs(void);
extern void cupsdCleanJobs(void);
extern void cupsdContinueJob(cupsd_job_t *job);
extern void cupsdDeleteJob(cupsd_job_t *job,
cupsd_jobaction_t action);
extern cupsd_job_t *cupsdFindJob(int id);
extern void cupsdFreeAllJobs(void);
extern cups_array_t *cupsdGetCompletedJobs(cupsd_printer_t *p);
extern int cupsdGetPrinterJobCount(const char *dest);
extern int cupsdGetUserJobCount(const char *username);
extern void cupsdLoadAllJobs(void);
extern int cupsdLoadJob(cupsd_job_t *job);
extern void cupsdMoveJob(cupsd_job_t *job, cupsd_printer_t *p);
extern void cupsdReleaseJob(cupsd_job_t *job);
extern void cupsdRestartJob(cupsd_job_t *job);
extern void cupsdSaveAllJobs(void);
extern void cupsdSaveJob(cupsd_job_t *job);
extern void cupsdSetJobHoldUntil(cupsd_job_t *job,
const char *when, int update);
extern void cupsdSetJobPriority(cupsd_job_t *job, int priority);
extern void cupsdSetJobState(cupsd_job_t *job,
ipp_jstate_t newstate,
cupsd_jobaction_t action,
const char *message, ...)
__attribute__((__format__(__printf__,
4, 5)));
extern void cupsdStopAllJobs(cupsd_jobaction_t action,
int kill_delay);
extern int cupsdTimeoutJob(cupsd_job_t *job);
extern void cupsdUnloadCompletedJobs(void);
extern void cupsdUpdateJobs(void);
|