penalty.c revision 8825740187b8aaca9c39c4fd6a0b79d480eb143f
db36dca3d45e6eefbb30042ee65876566f1a6014Sumit Bose/* Copyright (c) 2009-2010 Dovecot authors, see the included COPYING file */
db36dca3d45e6eefbb30042ee65876566f1a6014Sumit Bose /* ordered by last_update */
db36dca3d45e6eefbb30042ee65876566f1a6014Sumit Bose char *ident;
db36dca3d45e6eefbb30042ee65876566f1a6014Sumit Bose unsigned int last_update:LAST_UPDATE_BITS; /* last_penalty + n */
db36dca3d45e6eefbb30042ee65876566f1a6014Sumit Bose /* we use value up to two different checksums.
db36dca3d45e6eefbb30042ee65876566f1a6014Sumit Bose after that switch to pointer. */
db36dca3d45e6eefbb30042ee65876566f1a6014Sumit Bose unsigned int *value_ptr;
db36dca3d45e6eefbb30042ee65876566f1a6014Sumit Bose /* ident => penalty_rec */
db36dca3d45e6eefbb30042ee65876566f1a6014Sumit Bose penalty->expire_secs = PENALTY_DEFAULT_EXPIRE_SECS;
db36dca3d45e6eefbb30042ee65876566f1a6014Sumit Bosestatic void penalty_rec_free(struct penalty *penalty, struct penalty_rec *rec)
db36dca3d45e6eefbb30042ee65876566f1a6014Sumit Bose DLLIST2_REMOVE(&penalty->oldest, &penalty->newest, rec);
db36dca3d45e6eefbb30042ee65876566f1a6014Sumit Bosevoid penalty_set_expire_secs(struct penalty *penalty, unsigned int expire_secs)
db36dca3d45e6eefbb30042ee65876566f1a6014Sumit Bosepenalty_bump_checksum(struct penalty_rec *rec, unsigned int checksum)
db36dca3d45e6eefbb30042ee65876566f1a6014Sumit Bose unsigned int *checksums;
db36dca3d45e6eefbb30042ee65876566f1a6014Sumit Bose unsigned int i, count;
db36dca3d45e6eefbb30042ee65876566f1a6014Sumit Bose for (i = 0; i < count; i++) {
db36dca3d45e6eefbb30042ee65876566f1a6014Sumit Bose if (i > 0) {
db36dca3d45e6eefbb30042ee65876566f1a6014Sumit Bose sizeof(checksums[0]) * i);
db36dca3d45e6eefbb30042ee65876566f1a6014Sumit Bosestatic void penalty_add_checksum(struct penalty_rec *rec, unsigned int checksum)
db36dca3d45e6eefbb30042ee65876566f1a6014Sumit Bose unsigned int *checksums;
db36dca3d45e6eefbb30042ee65876566f1a6014Sumit Bose if (rec->checksum.value[CHECKSUM_VALUE_COUNT-1] == 0) {
db36dca3d45e6eefbb30042ee65876566f1a6014Sumit Bose memcpy(rec->checksum.value + 1, rec->checksum.value,
db36dca3d45e6eefbb30042ee65876566f1a6014Sumit Bose /* switch to using a pointer */
db36dca3d45e6eefbb30042ee65876566f1a6014Sumit Bose checksums = i_new(unsigned int, CHECKSUM_VALUE_PTR_COUNT);
db36dca3d45e6eefbb30042ee65876566f1a6014Sumit Bose memcpy(rec->checksum.value_ptr + 1, rec->checksum.value_ptr,
db36dca3d45e6eefbb30042ee65876566f1a6014Sumit Boseunsigned int penalty_get(struct penalty *penalty, const char *ident,
db36dca3d45e6eefbb30042ee65876566f1a6014Sumit Bosestatic void penalty_timeout(struct penalty *penalty)
db36dca3d45e6eefbb30042ee65876566f1a6014Sumit Bose expire_time = ioloop_time - penalty->expire_secs;
db36dca3d45e6eefbb30042ee65876566f1a6014Sumit Bose if (rec->last_penalty + rec->last_update > expire_time)
db36dca3d45e6eefbb30042ee65876566f1a6014Sumit Bose unsigned int diff;
db36dca3d45e6eefbb30042ee65876566f1a6014Sumit Bose diff = rec->last_penalty + rec->last_update - expire_time;
db36dca3d45e6eefbb30042ee65876566f1a6014Sumit Bosevoid penalty_inc(struct penalty *penalty, const char *ident,
db36dca3d45e6eefbb30042ee65876566f1a6014Sumit Bose hash_table_insert(penalty->hash, rec->ident, rec);
db36dca3d45e6eefbb30042ee65876566f1a6014Sumit Bose DLLIST2_REMOVE(&penalty->oldest, &penalty->newest, rec);
db36dca3d45e6eefbb30042ee65876566f1a6014Sumit Bose rec->last_penalty = ioloop_time - rec->last_update;
db36dca3d45e6eefbb30042ee65876566f1a6014Sumit Bose DLLIST2_APPEND(&penalty->oldest, &penalty->newest, rec);
db36dca3d45e6eefbb30042ee65876566f1a6014Sumit Bose penalty->to = timeout_add(penalty->expire_secs * 1000,
db36dca3d45e6eefbb30042ee65876566f1a6014Sumit Bosebool penalty_has_checksum(struct penalty *penalty, const char *ident,
db36dca3d45e6eefbb30042ee65876566f1a6014Sumit Bose unsigned int checksum)
db36dca3d45e6eefbb30042ee65876566f1a6014Sumit Bose const unsigned int *checksums;
db36dca3d45e6eefbb30042ee65876566f1a6014Sumit Bose unsigned int i, count;
db36dca3d45e6eefbb30042ee65876566f1a6014Sumit Bose for (i = 0; i < count; i++) {
db36dca3d45e6eefbb30042ee65876566f1a6014Sumit Bosevoid penalty_dump(struct penalty *penalty, struct ostream *output)
db36dca3d45e6eefbb30042ee65876566f1a6014Sumit Bose for (rec = penalty->oldest; rec != NULL; rec = rec->next) {