cdbw
struct cdbw;
struct cdbw *cdbw_open(void);
int cdbw_put(struct cdbw *, const void *, size_t,
int cdbw_put_data(struct cdbw *, const void *, size_t,
int cdbw_put_key(struct cdbw *, const void *, size_t,
int cdbw_output(struct cdbw *, int, const char *,
void cdbw_close(struct cdbw *);
struct cdbw *
struct cdbw *cdbw;
cdbw = calloc(sizeof(*cdbw), 1);
if (cdbw == NULL)
cdbw->hash_size = 1024;
cdbw->hash = calloc(cdbw->hash_size, sizeof(*cdbw->hash));
if (cdbw->hash == NULL) {
free(cdbw);
for (i = 0; i < cdbw->hash_size; ++i)
SLIST_INIT(cdbw->hash + i);
return cdbw;
cdbw_put(struct cdbw *cdbw, const void *key, size_t keylen,
rv = cdbw_put_data(cdbw, data, datalen, &idx);
rv = cdbw_put_key(cdbw, key, keylen, idx);
--cdbw->data_counter;
free(cdbw->data_ptr[cdbw->data_counter]);
cdbw->data_size -= datalen;
cdbw_put_data(struct cdbw *cdbw, const void *data, size_t datalen,
if (cdbw->data_counter == max_data_counter)
if (cdbw->data_size + datalen < cdbw->data_size ||
cdbw->data_size + datalen > 0xffffffffU)
if (cdbw->data_allocated == cdbw->data_counter) {
if (cdbw->data_allocated == 0)
new_allocated = cdbw->data_allocated * 2;
new_data_ptr = realloc(cdbw->data_ptr,
sizeof(*cdbw->data_ptr) * new_allocated);
cdbw->data_ptr = new_data_ptr;
new_data_len = realloc(cdbw->data_len,
sizeof(*cdbw->data_len) * new_allocated);
cdbw->data_len = new_data_len;
cdbw->data_allocated = new_allocated;
cdbw->data_ptr[cdbw->data_counter] = malloc(datalen);
if (cdbw->data_ptr[cdbw->data_counter] == NULL)
memcpy(cdbw->data_ptr[cdbw->data_counter], data, datalen);
cdbw->data_len[cdbw->data_counter] = datalen;
cdbw->data_size += datalen;
*idx = cdbw->data_counter++;
cdbw_put_key(struct cdbw *cdbw, const void *key, size_t keylen, uint32_t idx)
if (idx >= cdbw->data_counter ||
cdbw->key_counter == max_data_counter)
head = cdbw->hash + (hashes[0] & (cdbw->hash_size - 1));
++cdbw->key_counter;
if (cdbw->key_counter <= cdbw->hash_size)
new_hash_size = cdbw->hash_size * 2;
head = &cdbw->hash[hashes[0] & (cdbw->hash_size - 1)];
for (i = 0; i < cdbw->hash_size; ++i) {
head = cdbw->hash + i;
free(cdbw->hash);
cdbw->hash_size = new_hash_size;
cdbw->hash = new_head;
cdbw_close(struct cdbw *cdbw)
for (i = 0; i < cdbw->hash_size; ++i) {
head = cdbw->hash + i;
for (i = 0; i < cdbw->data_counter; ++i)
free(cdbw->data_ptr[i]);
free(cdbw->data_ptr);
free(cdbw->data_len);
free(cdbw->hash);
free(cdbw);
build_graph(struct cdbw *cdbw, struct state *state)
for (i = 0; i < cdbw->hash_size; ++i) {
head = &cdbw->hash[i];
print_hash(struct cdbw *cdbw, struct state *state, int fd, const char *descr)
le32enc(buf + 24, cdbw->data_size);
le32enc(buf + 28, cdbw->data_counter);
size2 = compute_size(cdbw->data_size);
for (data_size = 0, i = 0; i < cdbw->data_counter; ++i) {
data_size += cdbw->data_len[i];
for (i = 0; i < cdbw->data_counter; ++i) {
COND_FLUSH_BUFFER(cdbw->data_len[i]);
if (cdbw->data_len[i] < sizeof(buf)) {
memcpy(buf + cur_pos, cdbw->data_ptr[i],
cdbw->data_len[i]);
cur_pos += cdbw->data_len[i];
ret = write(fd, cdbw->data_ptr[i], cdbw->data_len[i]);
if (ret == -1 || (size_t)ret != cdbw->data_len[i])
cdbw_output(struct cdbw *cdbw, int fd, const char *descr,
if (cdbw->data_counter == 0 || cdbw->key_counter == 0) {
print_hash(cdbw, &state, fd, descr);
state.keys = cdbw->key_counter;
state.data_entries = cdbw->data_counter;
} while (build_graph(cdbw, &state));
rv = print_hash(cdbw, &state, fd, descr);
struct cdbw *cdbw;
if ((cdbw = cdbw_open()) == NULL) {
if (cdbw_put(cdbw, addr, alen, addr, alen) == -1) {
if (cdbw_output(cdbw, fd, "npf-table-cdb", NULL) == -1) {
cdbw_close(cdbw);
struct cdbw *db;
save_term(struct cdbw *db, TERM *term)
struct cdbw *db;
static struct cdbw *db;
struct cdbw *cdbw;
if ((cdbw = cdbw_open()) == NULL) {
if (cdbw_put(cdbw, &addr, alen, &addr, alen) == -1)
if (cdbw_put(cdbw, &addr, alen, &addr, alen) == -1)
if (cdbw_output(cdbw, fd, "npf-table-cdb", NULL) == -1) {
cdbw_close(cdbw);
if (cdbw_put_data(cdbw, data, datalen, &idx))
if (cdbw_put_key(cdbw, key, keylen, idx) && warndup)
if (cdbw_put_key(cdbw, key, keylen, idx) && warndup)
if (cdbw_put_key(cdbw, key, keylen, idx) && warndup)
if (cdbw_put_key(cdbw, key, keylen, idx) && warndup)
if (cdbw_output(cdbw, cdbw_fd, "services(5)", NULL)) {
cdbw_close(cdbw);
cdbw = NULL;
static struct cdbw *cdbw;
if ((cdbw = cdbw_open()) == NULL)
cdbw_close(cdbw);
cdbw = NULL;