PageRenderTime 47ms CodeModel.GetById 17ms RepoModel.GetById 1ms app.codeStats 0ms

/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
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
  2. "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
  3. <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
  4. <head>
  5. <title>quotas.c</title>
  6. <style type="text/css">
  7. .enscript-comment { font-style: italic; color: rgb(178,34,34); }
  8. .enscript-function-name { font-weight: bold; color: rgb(0,0,255); }
  9. .enscript-variable-name { font-weight: bold; color: rgb(184,134,11); }
  10. .enscript-keyword { font-weight: bold; color: rgb(160,32,240); }
  11. .enscript-reference { font-weight: bold; color: rgb(95,158,160); }
  12. .enscript-string { font-weight: bold; color: rgb(188,143,143); }
  13. .enscript-builtin { font-weight: bold; color: rgb(218,112,214); }
  14. .enscript-type { font-weight: bold; color: rgb(34,139,34); }
  15. .enscript-highlight { text-decoration: underline; color: 0; }
  16. </style>
  17. </head>
  18. <body id="top">
  19. <h1 style="margin:8px;" id="f1">quotas.c&nbsp;&nbsp;&nbsp;<span style="font-weight: normal; font-size: 0.5em;">[<a href="?txt">plain text</a>]</span></h1>
  20. <hr/>
  21. <div></div>
  22. <pre>
  23. <span class="enscript-comment">/*
  24. * &quot;$Id: quotas.c,v 1.7 2005/01/04 22:10:46 jlovell Exp $&quot;
  25. *
  26. * Quota routines for the Common UNIX Printing System (CUPS).
  27. *
  28. * Copyright 1997-2005 by Easy Software Products.
  29. *
  30. * These coded instructions, statements, and computer programs are the
  31. * property of Easy Software Products and are protected by Federal
  32. * copyright law. Distribution and use rights are outlined in the file
  33. * &quot;LICENSE.txt&quot; which should have been included with this file. If this
  34. * file is missing or damaged please contact Easy Software Products
  35. * at:
  36. *
  37. * Attn: CUPS Licensing Information
  38. * Easy Software Products
  39. * 44141 Airport View Drive, Suite 204
  40. * Hollywood, Maryland 20636 USA
  41. *
  42. * Voice: (301) 373-9600
  43. * EMail: <a href="mailto:cups-info@cups.org">cups-info@cups.org</a>
  44. * WWW: <a href="http://www.cups.org">http://www.cups.org</a>
  45. *
  46. * Contents:
  47. *
  48. * AddQuota() - Add a quota record for this printer and user.
  49. * FindQuota() - Find a quota record.
  50. * FreeQuotas() - Free quotas for a printer.
  51. * UpdateQuota() - Update quota data for the specified printer and user.
  52. * quota_compare() - Compare two quota records...
  53. */</span>
  54. <span class="enscript-comment">/*
  55. * Include necessary headers...
  56. */</span>
  57. #<span class="enscript-reference">include</span> <span class="enscript-string">&quot;cupsd.h&quot;</span>
  58. #<span class="enscript-reference">ifdef</span> <span class="enscript-variable-name">__APPLE__</span>
  59. #<span class="enscript-reference">ifdef</span> <span class="enscript-variable-name">HAVE_DLFCN_H</span>
  60. <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,
  61. <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);
  62. <span class="enscript-comment">/* External global symbols */</span>
  63. <span class="enscript-type">extern</span> <span class="enscript-type">void</span> *PSQUpdateQuotaProc;
  64. #<span class="enscript-reference">endif</span> <span class="enscript-comment">/* HAVE_DLFCN_H */</span>
  65. #<span class="enscript-reference">endif</span> <span class="enscript-comment">/* __APPLE__ */</span>
  66. <span class="enscript-comment">/*
  67. * Local functions...
  68. */</span>
  69. <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);
  70. <span class="enscript-comment">/*
  71. * 'AddQuota()' - Add a quota record for this printer and user.
  72. */</span>
  73. quota_t * <span class="enscript-comment">/* O - Quota data */</span>
  74. <span class="enscript-function-name">AddQuota</span>(printer_t *p, <span class="enscript-comment">/* I - Printer */</span>
  75. <span class="enscript-type">const</span> <span class="enscript-type">char</span> *username) <span class="enscript-comment">/* I - User */</span>
  76. {
  77. quota_t *q; <span class="enscript-comment">/* New quota data */</span>
  78. <span class="enscript-keyword">if</span> (!p || !username)
  79. <span class="enscript-keyword">return</span> (NULL);
  80. <span class="enscript-keyword">if</span> (p-&gt;num_quotas == 0)
  81. q = malloc(<span class="enscript-keyword">sizeof</span>(quota_t));
  82. <span class="enscript-keyword">else</span>
  83. q = realloc(p-&gt;quotas, <span class="enscript-keyword">sizeof</span>(quota_t) * (p-&gt;num_quotas + 1));
  84. <span class="enscript-keyword">if</span> (!q)
  85. <span class="enscript-keyword">return</span> (NULL);
  86. p-&gt;quotas = q;
  87. q += p-&gt;num_quotas;
  88. p-&gt;num_quotas ++;
  89. memset(q, 0, <span class="enscript-keyword">sizeof</span>(quota_t));
  90. strlcpy(q-&gt;username, username, <span class="enscript-keyword">sizeof</span>(q-&gt;username));
  91. <span class="enscript-keyword">if</span> (p-&gt;num_quotas &gt; 1)
  92. qsort(p-&gt;quotas, p-&gt;num_quotas, <span class="enscript-keyword">sizeof</span>(quota_t),
  93. (<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);
  94. <span class="enscript-keyword">return</span> (FindQuota(p, username));
  95. }
  96. <span class="enscript-comment">/*
  97. * 'FindQuota()' - Find a quota record.
  98. */</span>
  99. quota_t * <span class="enscript-comment">/* O - Quota data */</span>
  100. <span class="enscript-function-name">FindQuota</span>(printer_t *p, <span class="enscript-comment">/* I - Printer */</span>
  101. <span class="enscript-type">const</span> <span class="enscript-type">char</span> *username) <span class="enscript-comment">/* I - User */</span>
  102. {
  103. quota_t *q, <span class="enscript-comment">/* Quota data pointer */</span>
  104. match; <span class="enscript-comment">/* Search data */</span>
  105. <span class="enscript-keyword">if</span> (!p || !username)
  106. <span class="enscript-keyword">return</span> (NULL);
  107. <span class="enscript-keyword">if</span> (p-&gt;num_quotas == 0)
  108. q = NULL;
  109. <span class="enscript-keyword">else</span>
  110. {
  111. strlcpy(match.username, username, <span class="enscript-keyword">sizeof</span>(match.username));
  112. q = bsearch(&amp;match, p-&gt;quotas, p-&gt;num_quotas, <span class="enscript-keyword">sizeof</span>(quota_t),
  113. (<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);
  114. }
  115. <span class="enscript-keyword">if</span> (q)
  116. <span class="enscript-keyword">return</span> (q);
  117. <span class="enscript-keyword">else</span>
  118. <span class="enscript-keyword">return</span> (AddQuota(p, username));
  119. }
  120. <span class="enscript-comment">/*
  121. * 'FreeQuotas()' - Free quotas for a printer.
  122. */</span>
  123. <span class="enscript-type">void</span>
  124. <span class="enscript-function-name">FreeQuotas</span>(printer_t *p) <span class="enscript-comment">/* I - Printer */</span>
  125. {
  126. <span class="enscript-keyword">if</span> (!p)
  127. <span class="enscript-keyword">return</span>;
  128. <span class="enscript-keyword">if</span> (p-&gt;num_quotas)
  129. free(p-&gt;quotas);
  130. p-&gt;num_quotas = 0;
  131. p-&gt;quotas = NULL;
  132. }
  133. <span class="enscript-comment">/*
  134. * 'UpdateQuota()' - Update quota data for the specified printer and user.
  135. */</span>
  136. quota_t * <span class="enscript-comment">/* O - Quota data */</span>
  137. <span class="enscript-function-name">UpdateQuota</span>(printer_t *p, <span class="enscript-comment">/* I - Printer */</span>
  138. <span class="enscript-type">const</span> <span class="enscript-type">char</span> *username, <span class="enscript-comment">/* I - User */</span>
  139. <span class="enscript-type">int</span> pages, <span class="enscript-comment">/* I - Number of pages */</span>
  140. <span class="enscript-type">int</span> k) <span class="enscript-comment">/* I - Number of kilobytes */</span>
  141. {
  142. quota_t *q; <span class="enscript-comment">/* Quota data */</span>
  143. job_t *job, <span class="enscript-comment">/* Current job */</span>
  144. *next; <span class="enscript-comment">/* Next job */</span>
  145. time_t curtime; <span class="enscript-comment">/* Current time */</span>
  146. ipp_attribute_t *attr; <span class="enscript-comment">/* Job attribute */</span>
  147. <span class="enscript-keyword">if</span> (!p || !username)
  148. <span class="enscript-keyword">return</span> (NULL);
  149. <span class="enscript-keyword">if</span> (!p-&gt;k_limit &amp;&amp; !p-&gt;page_limit)
  150. <span class="enscript-keyword">return</span> (NULL);
  151. <span class="enscript-keyword">if</span> ((q = FindQuota(p, username)) == NULL)
  152. <span class="enscript-keyword">return</span> (NULL);
  153. LogMessage(L_DEBUG, <span class="enscript-string">&quot;UpdateQuota: p=%s username=%s pages=%d k=%d&quot;</span>,
  154. p-&gt;name, username, pages, k);
  155. #<span class="enscript-reference">ifdef</span> <span class="enscript-variable-name">__APPLE__</span>
  156. #<span class="enscript-reference">ifdef</span> <span class="enscript-variable-name">HAVE_DLFCN_H</span>
  157. <span class="enscript-comment">/*
  158. * Use Apple PrintService quota enforcement if installed (X Server only)
  159. */</span>
  160. <span class="enscript-keyword">if</span> (PSQUpdateQuotaProc)
  161. {
  162. q-&gt;page_count = ((PSQUpdateQuotaProcPtr) PSQUpdateQuotaProc)(p-&gt;name,
  163. p-&gt;info, username, pages, 0);
  164. <span class="enscript-keyword">return</span> (q);
  165. }
  166. #<span class="enscript-reference">endif</span> <span class="enscript-comment">/* HAVE_DLFCN_H */</span>
  167. #<span class="enscript-reference">endif</span> <span class="enscript-comment">/* __APPLE__ */</span>
  168. curtime = time(NULL);
  169. <span class="enscript-keyword">if</span> (curtime &lt; q-&gt;next_update)
  170. {
  171. q-&gt;page_count += pages;
  172. q-&gt;k_count += k;
  173. <span class="enscript-keyword">return</span> (q);
  174. }
  175. <span class="enscript-keyword">if</span> (p-&gt;quota_period)
  176. curtime -= p-&gt;quota_period;
  177. <span class="enscript-keyword">else</span>
  178. curtime = 0;
  179. q-&gt;next_update = 0;
  180. q-&gt;page_count = 0;
  181. q-&gt;k_count = 0;
  182. <span class="enscript-keyword">for</span> (job = Jobs; job; job = next)
  183. {
  184. next = job-&gt;next;
  185. <span class="enscript-keyword">if</span> (strcasecmp(job-&gt;dest, p-&gt;name) != 0 ||
  186. strcasecmp(job-&gt;username, q-&gt;username) != 0)
  187. <span class="enscript-keyword">continue</span>;
  188. <span class="enscript-keyword">if</span> ((attr = ippFindAttribute(job-&gt;attrs, <span class="enscript-string">&quot;time-at-completion&quot;</span>,
  189. IPP_TAG_INTEGER)) == NULL)
  190. <span class="enscript-keyword">if</span> ((attr = ippFindAttribute(job-&gt;attrs, <span class="enscript-string">&quot;time-at-processing&quot;</span>,
  191. IPP_TAG_INTEGER)) == NULL)
  192. attr = ippFindAttribute(job-&gt;attrs, <span class="enscript-string">&quot;time-at-creation&quot;</span>,
  193. IPP_TAG_INTEGER);
  194. <span class="enscript-keyword">if</span> (attr == NULL)
  195. <span class="enscript-keyword">break</span>;
  196. <span class="enscript-keyword">if</span> (attr-&gt;values[0].integer &lt; curtime)
  197. {
  198. <span class="enscript-keyword">if</span> (JobAutoPurge)
  199. CancelJob(job-&gt;id, 1);
  200. <span class="enscript-keyword">continue</span>;
  201. }
  202. <span class="enscript-keyword">if</span> (q-&gt;next_update == 0)
  203. q-&gt;next_update = attr-&gt;values[0].integer + p-&gt;quota_period;
  204. <span class="enscript-keyword">if</span> ((attr = ippFindAttribute(job-&gt;attrs, <span class="enscript-string">&quot;job-media-sheets-completed&quot;</span>,
  205. IPP_TAG_INTEGER)) != NULL)
  206. q-&gt;page_count += attr-&gt;values[0].integer;
  207. <span class="enscript-keyword">if</span> ((attr = ippFindAttribute(job-&gt;attrs, <span class="enscript-string">&quot;job-k-octets&quot;</span>,
  208. IPP_TAG_INTEGER)) != NULL)
  209. q-&gt;k_count += attr-&gt;values[0].integer;
  210. }
  211. <span class="enscript-keyword">return</span> (q);
  212. }
  213. <span class="enscript-comment">/*
  214. * 'quota_compare()' - Compare two quota records...
  215. */</span>
  216. <span class="enscript-type">static</span> <span class="enscript-type">int</span> <span class="enscript-comment">/* O - Result of comparison */</span>
  217. <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>
  218. <span class="enscript-type">const</span> quota_t *q2) <span class="enscript-comment">/* I - Second quota record */</span>
  219. {
  220. <span class="enscript-keyword">return</span> (strcasecmp(q1-&gt;username, q2-&gt;username));
  221. }
  222. <span class="enscript-comment">/*
  223. * End of &quot;$Id: quotas.c,v 1.7 2005/01/04 22:10:46 jlovell Exp $&quot;.
  224. */</span>
  225. </pre>
  226. <hr />
  227. </body></html>