/opensource.apple.com/source/cups/cups-86/scheduler/quotas.c
C | 287 lines | 189 code | 60 blank | 38 comment | 14 complexity | e5f49048b6cea4ddab61ed13593b31af MD5 | raw file
Possible License(s): MPL-2.0-no-copyleft-exception, GPL-2.0, BSD-3-Clause, GPL-3.0, MPL-2.0, LGPL-2.0, LGPL-2.1, CC-BY-SA-3.0, IPL-1.0, ISC, AGPL-1.0, AGPL-3.0, JSON, Apache-2.0, 0BSD
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
- "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
- <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
- <head>
- <title>quotas.c</title>
- <style type="text/css">
- .enscript-comment { font-style: italic; color: rgb(178,34,34); }
- .enscript-function-name { font-weight: bold; color: rgb(0,0,255); }
- .enscript-variable-name { font-weight: bold; color: rgb(184,134,11); }
- .enscript-keyword { font-weight: bold; color: rgb(160,32,240); }
- .enscript-reference { font-weight: bold; color: rgb(95,158,160); }
- .enscript-string { font-weight: bold; color: rgb(188,143,143); }
- .enscript-builtin { font-weight: bold; color: rgb(218,112,214); }
- .enscript-type { font-weight: bold; color: rgb(34,139,34); }
- .enscript-highlight { text-decoration: underline; color: 0; }
- </style>
- </head>
- <body id="top">
- <h1 style="margin:8px;" id="f1">quotas.c <span style="font-weight: normal; font-size: 0.5em;">[<a href="?txt">plain text</a>]</span></h1>
- <hr/>
- <div></div>
- <pre>
- <span class="enscript-comment">/*
- * "$Id: quotas.c,v 1.7 2005/01/04 22:10:46 jlovell Exp $"
- *
- * Quota routines for the Common UNIX Printing System (CUPS).
- *
- * Copyright 1997-2005 by Easy Software Products.
- *
- * These coded instructions, statements, and computer programs are the
- * property of Easy Software Products and are protected by Federal
- * copyright law. Distribution and use rights are outlined in the file
- * "LICENSE.txt" which should have been included with this file. If this
- * file is missing or damaged please contact Easy Software Products
- * at:
- *
- * Attn: CUPS Licensing Information
- * Easy Software Products
- * 44141 Airport View Drive, Suite 204
- * Hollywood, Maryland 20636 USA
- *
- * Voice: (301) 373-9600
- * EMail: <a href="mailto:cups-info@cups.org">cups-info@cups.org</a>
- * WWW: <a href="http://www.cups.org">http://www.cups.org</a>
- *
- * Contents:
- *
- * AddQuota() - Add a quota record for this printer and user.
- * FindQuota() - Find a quota record.
- * FreeQuotas() - Free quotas for a printer.
- * UpdateQuota() - Update quota data for the specified printer and user.
- * quota_compare() - Compare two quota records...
- */</span>
- <span class="enscript-comment">/*
- * Include necessary headers...
- */</span>
- #<span class="enscript-reference">include</span> <span class="enscript-string">"cupsd.h"</span>
- #<span class="enscript-reference">ifdef</span> <span class="enscript-variable-name">__APPLE__</span>
- #<span class="enscript-reference">ifdef</span> <span class="enscript-variable-name">HAVE_DLFCN_H</span>
- <span class="enscript-type">typedef</span> <span class="enscript-function-name">int</span> (*PSQUpdateQuotaProcPtr)(<span class="enscript-type">const</span> <span class="enscript-type">char</span> *printer, <span class="enscript-type">const</span> <span class="enscript-type">char</span> *info,
- <span class="enscript-type">const</span> <span class="enscript-type">char</span> *user, <span class="enscript-type">int</span> nPages, <span class="enscript-type">int</span> options);
- <span class="enscript-comment">/* External global symbols */</span>
- <span class="enscript-type">extern</span> <span class="enscript-type">void</span> *PSQUpdateQuotaProc;
- #<span class="enscript-reference">endif</span> <span class="enscript-comment">/* HAVE_DLFCN_H */</span>
- #<span class="enscript-reference">endif</span> <span class="enscript-comment">/* __APPLE__ */</span>
- <span class="enscript-comment">/*
- * Local functions...
- */</span>
- <span class="enscript-type">static</span> <span class="enscript-type">int</span> quota_compare(<span class="enscript-type">const</span> quota_t *q1, <span class="enscript-type">const</span> quota_t *q2);
- <span class="enscript-comment">/*
- * 'AddQuota()' - Add a quota record for this printer and user.
- */</span>
- quota_t * <span class="enscript-comment">/* O - Quota data */</span>
- <span class="enscript-function-name">AddQuota</span>(printer_t *p, <span class="enscript-comment">/* I - Printer */</span>
- <span class="enscript-type">const</span> <span class="enscript-type">char</span> *username) <span class="enscript-comment">/* I - User */</span>
- {
- quota_t *q; <span class="enscript-comment">/* New quota data */</span>
- <span class="enscript-keyword">if</span> (!p || !username)
- <span class="enscript-keyword">return</span> (NULL);
- <span class="enscript-keyword">if</span> (p->num_quotas == 0)
- q = malloc(<span class="enscript-keyword">sizeof</span>(quota_t));
- <span class="enscript-keyword">else</span>
- q = realloc(p->quotas, <span class="enscript-keyword">sizeof</span>(quota_t) * (p->num_quotas + 1));
- <span class="enscript-keyword">if</span> (!q)
- <span class="enscript-keyword">return</span> (NULL);
- p->quotas = q;
- q += p->num_quotas;
- p->num_quotas ++;
- memset(q, 0, <span class="enscript-keyword">sizeof</span>(quota_t));
- strlcpy(q->username, username, <span class="enscript-keyword">sizeof</span>(q->username));
- <span class="enscript-keyword">if</span> (p->num_quotas > 1)
- qsort(p->quotas, p->num_quotas, <span class="enscript-keyword">sizeof</span>(quota_t),
- (<span class="enscript-type">int</span> (*)(<span class="enscript-type">const</span> <span class="enscript-type">void</span> *, <span class="enscript-type">const</span> <span class="enscript-type">void</span> *))quota_compare);
- <span class="enscript-keyword">return</span> (FindQuota(p, username));
- }
- <span class="enscript-comment">/*
- * 'FindQuota()' - Find a quota record.
- */</span>
- quota_t * <span class="enscript-comment">/* O - Quota data */</span>
- <span class="enscript-function-name">FindQuota</span>(printer_t *p, <span class="enscript-comment">/* I - Printer */</span>
- <span class="enscript-type">const</span> <span class="enscript-type">char</span> *username) <span class="enscript-comment">/* I - User */</span>
- {
- quota_t *q, <span class="enscript-comment">/* Quota data pointer */</span>
- match; <span class="enscript-comment">/* Search data */</span>
- <span class="enscript-keyword">if</span> (!p || !username)
- <span class="enscript-keyword">return</span> (NULL);
- <span class="enscript-keyword">if</span> (p->num_quotas == 0)
- q = NULL;
- <span class="enscript-keyword">else</span>
- {
- strlcpy(match.username, username, <span class="enscript-keyword">sizeof</span>(match.username));
- q = bsearch(&match, p->quotas, p->num_quotas, <span class="enscript-keyword">sizeof</span>(quota_t),
- (<span class="enscript-type">int</span>(*)(<span class="enscript-type">const</span> <span class="enscript-type">void</span> *, <span class="enscript-type">const</span> <span class="enscript-type">void</span> *))quota_compare);
- }
- <span class="enscript-keyword">if</span> (q)
- <span class="enscript-keyword">return</span> (q);
- <span class="enscript-keyword">else</span>
- <span class="enscript-keyword">return</span> (AddQuota(p, username));
- }
- <span class="enscript-comment">/*
- * 'FreeQuotas()' - Free quotas for a printer.
- */</span>
- <span class="enscript-type">void</span>
- <span class="enscript-function-name">FreeQuotas</span>(printer_t *p) <span class="enscript-comment">/* I - Printer */</span>
- {
- <span class="enscript-keyword">if</span> (!p)
- <span class="enscript-keyword">return</span>;
- <span class="enscript-keyword">if</span> (p->num_quotas)
- free(p->quotas);
- p->num_quotas = 0;
- p->quotas = NULL;
- }
- <span class="enscript-comment">/*
- * 'UpdateQuota()' - Update quota data for the specified printer and user.
- */</span>
- quota_t * <span class="enscript-comment">/* O - Quota data */</span>
- <span class="enscript-function-name">UpdateQuota</span>(printer_t *p, <span class="enscript-comment">/* I - Printer */</span>
- <span class="enscript-type">const</span> <span class="enscript-type">char</span> *username, <span class="enscript-comment">/* I - User */</span>
- <span class="enscript-type">int</span> pages, <span class="enscript-comment">/* I - Number of pages */</span>
- <span class="enscript-type">int</span> k) <span class="enscript-comment">/* I - Number of kilobytes */</span>
- {
- quota_t *q; <span class="enscript-comment">/* Quota data */</span>
- job_t *job, <span class="enscript-comment">/* Current job */</span>
- *next; <span class="enscript-comment">/* Next job */</span>
- time_t curtime; <span class="enscript-comment">/* Current time */</span>
- ipp_attribute_t *attr; <span class="enscript-comment">/* Job attribute */</span>
- <span class="enscript-keyword">if</span> (!p || !username)
- <span class="enscript-keyword">return</span> (NULL);
- <span class="enscript-keyword">if</span> (!p->k_limit && !p->page_limit)
- <span class="enscript-keyword">return</span> (NULL);
- <span class="enscript-keyword">if</span> ((q = FindQuota(p, username)) == NULL)
- <span class="enscript-keyword">return</span> (NULL);
- LogMessage(L_DEBUG, <span class="enscript-string">"UpdateQuota: p=%s username=%s pages=%d k=%d"</span>,
- p->name, username, pages, k);
- #<span class="enscript-reference">ifdef</span> <span class="enscript-variable-name">__APPLE__</span>
- #<span class="enscript-reference">ifdef</span> <span class="enscript-variable-name">HAVE_DLFCN_H</span>
- <span class="enscript-comment">/*
- * Use Apple PrintService quota enforcement if installed (X Server only)
- */</span>
- <span class="enscript-keyword">if</span> (PSQUpdateQuotaProc)
- {
- q->page_count = ((PSQUpdateQuotaProcPtr) PSQUpdateQuotaProc)(p->name,
- p->info, username, pages, 0);
- <span class="enscript-keyword">return</span> (q);
- }
- #<span class="enscript-reference">endif</span> <span class="enscript-comment">/* HAVE_DLFCN_H */</span>
- #<span class="enscript-reference">endif</span> <span class="enscript-comment">/* __APPLE__ */</span>
- curtime = time(NULL);
- <span class="enscript-keyword">if</span> (curtime < q->next_update)
- {
- q->page_count += pages;
- q->k_count += k;
- <span class="enscript-keyword">return</span> (q);
- }
- <span class="enscript-keyword">if</span> (p->quota_period)
- curtime -= p->quota_period;
- <span class="enscript-keyword">else</span>
- curtime = 0;
- q->next_update = 0;
- q->page_count = 0;
- q->k_count = 0;
- <span class="enscript-keyword">for</span> (job = Jobs; job; job = next)
- {
- next = job->next;
- <span class="enscript-keyword">if</span> (strcasecmp(job->dest, p->name) != 0 ||
- strcasecmp(job->username, q->username) != 0)
- <span class="enscript-keyword">continue</span>;
- <span class="enscript-keyword">if</span> ((attr = ippFindAttribute(job->attrs, <span class="enscript-string">"time-at-completion"</span>,
- IPP_TAG_INTEGER)) == NULL)
- <span class="enscript-keyword">if</span> ((attr = ippFindAttribute(job->attrs, <span class="enscript-string">"time-at-processing"</span>,
- IPP_TAG_INTEGER)) == NULL)
- attr = ippFindAttribute(job->attrs, <span class="enscript-string">"time-at-creation"</span>,
- IPP_TAG_INTEGER);
- <span class="enscript-keyword">if</span> (attr == NULL)
- <span class="enscript-keyword">break</span>;
- <span class="enscript-keyword">if</span> (attr->values[0].integer < curtime)
- {
- <span class="enscript-keyword">if</span> (JobAutoPurge)
- CancelJob(job->id, 1);
- <span class="enscript-keyword">continue</span>;
- }
- <span class="enscript-keyword">if</span> (q->next_update == 0)
- q->next_update = attr->values[0].integer + p->quota_period;
- <span class="enscript-keyword">if</span> ((attr = ippFindAttribute(job->attrs, <span class="enscript-string">"job-media-sheets-completed"</span>,
- IPP_TAG_INTEGER)) != NULL)
- q->page_count += attr->values[0].integer;
- <span class="enscript-keyword">if</span> ((attr = ippFindAttribute(job->attrs, <span class="enscript-string">"job-k-octets"</span>,
- IPP_TAG_INTEGER)) != NULL)
- q->k_count += attr->values[0].integer;
- }
- <span class="enscript-keyword">return</span> (q);
- }
- <span class="enscript-comment">/*
- * 'quota_compare()' - Compare two quota records...
- */</span>
- <span class="enscript-type">static</span> <span class="enscript-type">int</span> <span class="enscript-comment">/* O - Result of comparison */</span>
- <span class="enscript-function-name">quota_compare</span>(<span class="enscript-type">const</span> quota_t *q1, <span class="enscript-comment">/* I - First quota record */</span>
- <span class="enscript-type">const</span> quota_t *q2) <span class="enscript-comment">/* I - Second quota record */</span>
- {
- <span class="enscript-keyword">return</span> (strcasecmp(q1->username, q2->username));
- }
- <span class="enscript-comment">/*
- * End of "$Id: quotas.c,v 1.7 2005/01/04 22:10:46 jlovell Exp $".
- */</span>
- </pre>
- <hr />
- </body></html>