--- a/mcabber/libjabber/rate.c Thu Sep 01 21:18:19 2005 +0200
+++ b/mcabber/libjabber/rate.c Thu Sep 01 23:29:21 2005 +0200
@@ -13,8 +13,29 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
- * Jabber
- * Copyright (C) 1998-1999 The Jabber Team http://jabber.org/
+ * Copyrights
+ *
+ * Portions created by or assigned to Jabber.com, Inc. are
+ * Copyright (c) 1999-2002 Jabber.com, Inc. All Rights Reserved. Contact
+ * information for Jabber.com, Inc. is available at http://www.jabber.com/.
+ *
+ * Portions Copyright (c) 1998-1999 Jeremie Miller.
+ *
+ * Acknowledgements
+ *
+ * Special thanks to the Jabber Open Source Contributors for their
+ * suggestions and support of Jabber.
+ *
+ */
+
+/**
+ * create a new instance of jlimit that is used to limit events
+ *
+ * limit the events to maxp points per maxt seconds
+ *
+ * @param maxt time interval (in seconds) after which the points are cleared
+ * @param maxp maximum number of points available for the time interval given in maxt
+ * @return new instance of jlimit (has to be freed with jlimit_free if not used anymore)
*/
#include "jabber.h"
@@ -35,15 +56,31 @@
return r;
}
+/**
+ * free a jlimit instance
+ *
+ * @param r the jlimit instance that should be freed
+ */
void jlimit_free(jlimit r)
{
if(r != NULL)
{
- if(r->key != NULL) free(r->key);
- pool_free(r->p);
+ if(r->key != NULL) free(r->key);
+ pool_free(r->p);
}
}
+/**
+ * update/check a key in a jlimit instance
+ *
+ * Each jlimit instance can track many limits (that have the same setup).
+ * The limit is selected by the key, which can be an IP address.
+ *
+ * @param r the jlimit instance
+ * @param key for which key the limit should be checked
+ * @param points how many points of the limit should be consumed
+ * @return 1 if limit reached, 0 if we are still within the rate limit
+ */
int jlimit_check(jlimit r, char *key, int points)
{
int now = time(NULL);
@@ -53,15 +90,15 @@
/* make sure we didn't go over the time frame or get a null/new key */
if((now - r->start) > r->maxt || key == NULL || j_strcmp(key,r->key) != 0)
{ /* start a new key */
- free(r->key);
- if(key != NULL)
- /* We use strdup instead of pstrdup since r->key needs to be free'd before
- and more often than the rest of the rlimit structure */
- r->key = strdup(key);
- else
- r->key = NULL;
- r->start = now;
- r->points = 0;
+ free(r->key);
+ if(key != NULL)
+ /* We use strdup instead of pstrdup since r->key needs to be free'd before
+ and more often than the rest of the rlimit structure */
+ r->key = strdup(key);
+ else
+ r->key = NULL;
+ r->start = now;
+ r->points = 0;
}
r->points += points;
@@ -69,7 +106,7 @@
/* if we're within the time frame and over the point limit */
if(r->points > r->maxp && (now - r->start) < r->maxt)
{
- return 1; /* we don't reset the rate here, so that it remains rated until the time runs out */
+ return 1; /* we don't reset the rate here, so that it remains rated until the time runs out */
}
return 0;