Mercurial > ~mikael > mcabber > hg
diff mcabber/libjabber/rate.c @ 417:c3ae9251c197
Sync libjabber with upstream
Sync with jabberd-1.4.4.
author | Mikael Berthe <mikael@lilotux.net> |
---|---|
date | Thu, 01 Sep 2005 23:29:21 +0200 |
parents | ec86d759ed54 |
children |
line wrap: on
line diff
--- 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;