Submit #3063 » save_headers_to_dbm_file.patch
usr.bin/kcollect/kcollect.c | ||
---|---|---|
static void dump_dbm(kcollect_t *ary, size_t count, const char *datafile);
|
||
static int str2unix(const char* str, const char* fmt);
|
||
static int rec_comparator(const void *c1, const void *c2);
|
||
static void load_dbm(const char *datafile, kcollect_t *ary,
|
||
static void load_dbm(const char *datafile,
|
||
kcollect_t **ret_ary, size_t *counter);
|
||
static void dump_fields(kcollect_t *ary);
|
||
static void adjust_fields(kcollect_t *ent, const char *fields);
|
||
... | ... | |
* array and counter
|
||
*/
|
||
if (fromFile) {
|
||
load_dbm(dbmFile, ary, &dbmAry, &count);
|
||
load_dbm(dbmFile, &dbmAry, &count);
|
||
free(ary);
|
||
ary = dbmAry;
|
||
... | ... | |
char fmt;
|
||
char sbuf[20];
|
||
struct tm *tmv;
|
||
time_t t;
|
||
time_t t;
|
||
for (i = count - 1; i >= 2; --i) {
|
||
if ((total_count & 15) == 0) {
|
||
... | ... | |
format_output(value, fmt, scale, sbuf);
|
||
printf("%s",sbuf);
|
||
}
|
||
printf("\n");
|
||
++total_count;
|
||
}
|
||
... | ... | |
datum value;
|
||
time_t t;
|
||
uint i;
|
||
|
||
char h0[] = "HEADER 0";
|
||
char h1[] = "HEADER 1";
|
||
for (i = 2; i < (count - 1); ++i) {
|
||
t = ary[i].realtime.tv_sec;
|
||
for (i = 0; i < (count); ++i) {
|
||
/* first 2 INFO records are special and get 0|1 */
|
||
t = (i < 2)? i : ary[i].realtime.tv_sec;
|
||
tmv = gmtime(&t);
|
||
strftime(buf, sizeof(buf), DISPLAY_FULL_DATE, tmv);
|
||
key.dptr = buf;
|
||
key.dsize = sizeof(buf);
|
||
/* store the first 2 records with their own key */
|
||
key.dptr = (t < 2)?((t == 0)? h0:h1): buf;
|
||
key.dsize = (t < 2)?sizeof("HEADER 0"):sizeof(buf);
|
||
value.dptr = ary[i].data;
|
||
value.dsize = sizeof(ary[i].data);
|
||
value.dsize = sizeof(uint64_t) * KCOLLECT_ENTRIES;
|
||
if (dbm_store(db,key,value,DBM_INSERT) == -1) {
|
||
fprintf(stderr,
|
||
"[ERR] error storing the value in "
|
||
... | ... | |
*/
|
||
static
|
||
void
|
||
load_dbm(const char* datafile, kcollect_t *ary, kcollect_t **ret_ary,
|
||
load_dbm(const char* datafile, kcollect_t **ret_ary,
|
||
size_t *counter)
|
||
{
|
||
DBM * db = dbm_open(datafile,(O_RDONLY),(S_IRUSR|S_IRGRP));
|
||
datum key;
|
||
datum value;
|
||
size_t recCounter = 0;
|
||
int headersFound = 0;
|
||
if (db == NULL) {
|
||
fprintf(stderr,
|
||
... | ... | |
/* with the count allocate enough memory */
|
||
if (*ret_ary)
|
||
free(*ret_ary);
|
||
*ret_ary = malloc(sizeof(kcollect_t) * (recCounter + 2));
|
||
*ret_ary = malloc(sizeof(kcollect_t) * (recCounter));
|
||
if (*ret_ary == NULL) {
|
||
fprintf(stderr,
|
||
"[ERR] failed to allocate enough memory to "
|
||
... | ... | |
dbm_close(db);
|
||
exit(EXIT_FAILURE);
|
||
} else {
|
||
/* initialize the first 2 ary records */
|
||
uint c;
|
||
memcpy((*ret_ary)[0].data, ary[0].data,
|
||
sizeof(uint64_t) * KCOLLECT_ENTRIES);
|
||
memcpy((*ret_ary)[1].data, ary[1].data,
|
||
sizeof(uint64_t) * KCOLLECT_ENTRIES);
|
||
uint sc;
|
||
/*
|
||
* Actual data retrieval but only of recCounter
|
||
* records
|
||
*/
|
||
c = 0;
|
||
c = 2;
|
||
key = dbm_firstkey(db);
|
||
while (key.dptr && c < recCounter) {
|
||
value = dbm_fetch(db, key);
|
||
if (value.dptr != NULL) {
|
||
memcpy((*ret_ary)[2 + c].data,
|
||
if(!strcmp(key.dptr,"HEADER 0")) {
|
||
sc = 0;
|
||
headersFound |= 1;
|
||
}
|
||
else if(!strcmp(key.dptr,"HEADER 1")) {
|
||
sc = 1;
|
||
headersFound |= 2;
|
||
}
|
||
else {
|
||
sc = c;
|
||
c++;
|
||
}
|
||
memcpy((*ret_ary)[sc].data,
|
||
value.dptr,
|
||
sizeof(uint64_t) * KCOLLECT_ENTRIES);
|
||
(*ret_ary)[2 + c].realtime.tv_sec =
|
||
(*ret_ary)[sc].realtime.tv_sec =
|
||
str2unix(key.dptr,
|
||
DISPLAY_FULL_DATE);
|
||
}
|
||
key = dbm_nextkey(db);
|
||
++c;
|
||
}
|
||
}
|
||
}
|
||
/*
|
||
* Set the counter to returned records + first 2 header records,
|
||
* Set the counter,
|
||
* and sort the non-header records.
|
||
*/
|
||
*counter = 2 + recCounter;
|
||
qsort(&(*ret_ary)[2], recCounter, sizeof(kcollect_t), rec_comparator);
|
||
*counter = recCounter;
|
||
qsort(&(*ret_ary)[2], recCounter - 2, sizeof(kcollect_t), rec_comparator);
|
||
dbm_close(db);
|
||
dbm_close(db);
|
||
if (headersFound != 3) {
|
||
fprintf(stderr, "We could not retrieve all necessary headers, might be the database file is corrupted? (%i)\n", headersFound);
|
||
exit(EXIT_FAILURE);
|
||
}
|
||
}
|
||
static void
|