int process_sigs (DSPAM_CTX * CTX, int age) { struct _ds_storage_signature *ss; struct nt *del; struct nt_node *node; int delta; del = nt_create(NT_CHAR); if (del == NULL) return -1; #ifdef DEBUG printf ("Processing sigs; age: %d\n", age); #endif ss = _ds_get_nextsignature (CTX); while (ss != NULL) { #ifdef DEBUG printf ("Signature: %s\n Created: %s\n", ss->signature, ctime (&ss->created_on)); #endif delta = (((time (NULL) - ss->created_on) / 60) / 60) / 24; if (age == 0 || delta > age) { #ifdef DEBUG printf (" DELETED!\n"); #endif nt_add(del, ss->signature); } free(ss->data); free(ss); ss = _ds_get_nextsignature (CTX); } node = del->first; while(node != NULL) { _ds_delete_signature (CTX, node->ptr); node = node->next; } nt_destroy(del); return 0; }
struct _ds_storage_signature * _ds_get_nextsignature (DSPAM_CTX * CTX) { struct _sqlite_drv_storage *s = (struct _sqlite_drv_storage *) CTX->storage; struct _ds_storage_signature *st; unsigned long length; char query[128]; unsigned char *mem; char *err=NULL; const char **row, *query_tail=NULL; int ncolumn, x; if (s->dbh == NULL) { LOGDEBUG ("_ds_get_nextsignature: invalid database handle (NULL)"); return NULL; } st = calloc (1, sizeof (struct _ds_storage_signature)); if (st == NULL) { LOG (LOG_CRIT, ERR_MEM_ALLOC); return NULL; } if (s->iter_sig == NULL) { snprintf (query, sizeof (query), "select data, signature, strftime('%%s', created_on), " "length(data) from dspam_signature_data"); if ((sqlite_compile(s->dbh, query, &query_tail, &s->iter_sig, &err)) !=SQLITE_OK) { _sqlite_drv_query_error (err, query); free(st); return NULL; } } if ((x = sqlite_step(s->iter_sig, &ncolumn, &row, NULL)) !=SQLITE_ROW) { if (x != SQLITE_DONE) { _sqlite_drv_query_error (err, query); s->iter_sig = NULL; free(st); return NULL; } sqlite_finalize((struct sqlite_vm *) s->iter_sig, &err); s->iter_sig = NULL; free(st); return NULL; } length = strtol(row[3], NULL, 0); if (length == 0) { free(st); return _ds_get_nextsignature(CTX); } mem = malloc (length+1); if (mem == NULL) { LOG (LOG_CRIT, ERR_MEM_ALLOC); sqlite_finalize(s->iter_sig, &err); s->iter_sig = NULL; free(st); return NULL; } length = sqlite_decode_binary((const unsigned char *) &row[ncolumn], mem); if (length<0) { LOG(LOG_ERR, "sqlite_decode_binary() failed with error %d", length); s->iter_sig = NULL; free(st); return NULL; } st->data = realloc(mem, length); strlcpy(st->signature, row[1], sizeof(st->signature)); st->length = length; st->created_on = (time_t) strtol(row[2], NULL, 0); return st; }