// Number of characters for text format IP holdings
#define IPBUFMAX 40
+// Count record for IP -> length mapping
typedef struct _Count {
- struct _Count *next;
- struct _Count *prev;
- struct timeval when;
- int ignore;
- int last;
- int accum;
- int total;
- char ip[ IPBUFMAX ];
+ struct _Count *next; // Next Count in time order
+ struct _Count *prev; // Previous Count in time order
+ struct timeval when; // Last update time for this Count record
+ int ignore; // Flag to leave out from reports
+ int last; // The saved accumulation from the last report period
+ int accum; // Current accumulation
+ int total; // The total accumulation (reduced by fading)
+ char ip[ IPBUFMAX ]; // The IP concerned, in ascii
} Count;
+// Print message and exit
static void die(char *m) {
fprintf( stderr, "%s\n", m );
exit( 1 );
return hashvector_hashcode( key, IPBUFMAX );
}
+// The hashvector of seen IP
static hashvector TBL = {
- .table = { 256, 0 },
+ .table = { VECTOR_SLOTS, 0 },
.fill = 0,
.holes = 0,
.keyhashcode = Countp_hashcode,
.haskey = Countp_haskey
};
+// The Count records in time order
static struct {
Count *head;
Count *tail;
} trail;
+// Temporary buffer for IP addresses in ascii
static char buffer[ IPBUFMAX ];
/*============================================================
return 0;
}
-static int Countp_reclaim(pvector *pv,unsigned long ix,void *item,void *data) {
+static int Countp_reclaim(vector *pv,unsigned long ix,void *item,void *data) {
return 0;
}
show = now.tv_sec;
}
show += DELAY; // Time for next output
- pvector ordered = { 0, 0 };
+ vector ordered = { 0, 0 };
hashvector_contents( &TBL, &ordered );
- pvector_qsort( &ordered, Countp_compare );
- pvector_iterate( &ordered, Countp_fade_and_print, 0 );
- pvector_resize( &ordered, 0, Countp_reclaim, 0 );
+ vector_qsort( &ordered, Countp_compare );
+ vector_iterate( &ordered, Countp_fade_and_print, 0 );
+ vector_resize( &ordered, 0, Countp_reclaim, 0 );
fprintf( stdout, "==%ld/%ld/%ld\n", TBL.fill, TBL.holes, TBL.table.size );
}