]>
git.ipfire.org Git - thirdparty/cups.git/blob - scheduler/quotas.c
2 * Quota routines for the CUPS scheduler.
4 * Copyright 2007-2011 by Apple Inc.
5 * Copyright 1997-2007 by Easy Software Products.
7 * Licensed under Apache License v2.0. See the file "LICENSE" for more information.
11 * Include necessary headers...
21 static cupsd_quota_t
*add_quota(cupsd_printer_t
*p
, const char *username
);
22 static int compare_quotas(const cupsd_quota_t
*q1
,
23 const cupsd_quota_t
*q2
);
27 * 'cupsdFindQuota()' - Find a quota record.
30 cupsd_quota_t
* /* O - Quota data */
32 cupsd_printer_t
*p
, /* I - Printer */
33 const char *username
) /* I - User */
35 cupsd_quota_t
*q
, /* Quota data pointer */
36 match
; /* Search data */
37 char *ptr
; /* Pointer into username */
43 strlcpy(match
.username
, username
, sizeof(match
.username
));
44 if ((ptr
= strchr(match
.username
, '@')) != NULL
)
45 *ptr
= '\0'; /* Strip @domain/@KDC */
47 if ((q
= (cupsd_quota_t
*)cupsArrayFind(p
->quotas
, &match
)) != NULL
)
50 return (add_quota(p
, username
));
55 * 'cupsdFreeQuotas()' - Free quotas for a printer.
59 cupsdFreeQuotas(cupsd_printer_t
*p
) /* I - Printer */
61 cupsd_quota_t
*q
; /* Current quota record */
67 for (q
= (cupsd_quota_t
*)cupsArrayFirst(p
->quotas
);
69 q
= (cupsd_quota_t
*)cupsArrayNext(p
->quotas
))
72 cupsArrayDelete(p
->quotas
);
79 * 'cupsdUpdateQuota()' - Update quota data for the specified printer and user.
82 cupsd_quota_t
* /* O - Quota data */
84 cupsd_printer_t
*p
, /* I - Printer */
85 const char *username
, /* I - User */
86 int pages
, /* I - Number of pages */
87 int k
) /* I - Number of kilobytes */
89 cupsd_quota_t
*q
; /* Quota data */
90 cupsd_job_t
*job
; /* Current job */
91 time_t curtime
; /* Current time */
92 ipp_attribute_t
*attr
; /* Job attribute */
98 if (!p
->k_limit
&& !p
->page_limit
)
101 if ((q
= cupsdFindQuota(p
, username
)) == NULL
)
104 cupsdLogMessage(CUPSD_LOG_DEBUG
,
105 "cupsdUpdateQuota: p=%s username=%s pages=%d k=%d",
106 p
->name
, username
, pages
, k
);
108 curtime
= time(NULL
);
110 if (curtime
< q
->next_update
)
112 q
->page_count
+= pages
;
119 curtime
-= p
->quota_period
;
127 for (job
= (cupsd_job_t
*)cupsArrayFirst(Jobs
);
129 job
= (cupsd_job_t
*)cupsArrayNext(Jobs
))
132 * We only care about the current printer/class and user...
135 if (_cups_strcasecmp(job
->dest
, p
->name
) != 0 ||
136 _cups_strcasecmp(job
->username
, q
->username
) != 0)
140 * Make sure attributes are loaded; we always call cupsdLoadJob() to ensure
141 * the access_time member is updated so the job isn't unloaded right away...
144 if (!cupsdLoadJob(job
))
147 if ((attr
= ippFindAttribute(job
->attrs
, "time-at-completion",
148 IPP_TAG_INTEGER
)) == NULL
)
149 if ((attr
= ippFindAttribute(job
->attrs
, "time-at-processing",
150 IPP_TAG_INTEGER
)) == NULL
)
151 attr
= ippFindAttribute(job
->attrs
, "time-at-creation",
154 if (attr
->values
[0].integer
< curtime
)
157 * This job is too old to count towards the quota, ignore it...
160 if (JobAutoPurge
&& !job
->printer
&& job
->state_value
> IPP_JOB_STOPPED
)
161 cupsdDeleteJob(job
, CUPSD_JOB_PURGE
);
166 if (q
->next_update
== 0)
167 q
->next_update
= attr
->values
[0].integer
+ p
->quota_period
;
169 if ((attr
= ippFindAttribute(job
->attrs
, "job-media-sheets-completed",
170 IPP_TAG_INTEGER
)) != NULL
)
171 q
->page_count
+= attr
->values
[0].integer
;
173 if ((attr
= ippFindAttribute(job
->attrs
, "job-k-octets",
174 IPP_TAG_INTEGER
)) != NULL
)
175 q
->k_count
+= attr
->values
[0].integer
;
183 * 'add_quota()' - Add a quota record for this printer and user.
186 static cupsd_quota_t
* /* O - Quota data */
187 add_quota(cupsd_printer_t
*p
, /* I - Printer */
188 const char *username
) /* I - User */
190 cupsd_quota_t
*q
; /* New quota data */
191 char *ptr
; /* Pointer into username */
198 p
->quotas
= cupsArrayNew((cups_array_func_t
)compare_quotas
, NULL
);
203 if ((q
= calloc(1, sizeof(cupsd_quota_t
))) == NULL
)
206 strlcpy(q
->username
, username
, sizeof(q
->username
));
207 if ((ptr
= strchr(q
->username
, '@')) != NULL
)
208 *ptr
= '\0'; /* Strip @domain/@KDC */
210 cupsArrayAdd(p
->quotas
, q
);
217 * 'compare_quotas()' - Compare two quota records...
220 static int /* O - Result of comparison */
221 compare_quotas(const cupsd_quota_t
*q1
, /* I - First quota record */
222 const cupsd_quota_t
*q2
) /* I - Second quota record */
224 return (_cups_strcasecmp(q1
->username
, q2
->username
));