#include #include #include #include #define MAX_ITER 128 #define ITEM_SIZE 128 static const char* filename = "repro.db"; static char buffer[2* ITEM_SIZE * MAX_ITER] = { '\0' }; static int writer(void) { int k; DBM* db = dbm_open(filename, O_RDWR|O_CREAT, 0660); if (db == NULL) { perror("dbm_open"); return 1; } for (k = 0; k < MAX_ITER; k++) { char keybuf[64]; datum key; datum value; int r; sprintf(keybuf, "%04d", k); key.dptr = keybuf; key.dsize = strlen(keybuf); value.dptr = buffer; value.dsize = k * ITEM_SIZE; r = dbm_store(db, key, value, DBM_REPLACE); if (r == -1) { perror("dbm_store"); return 1; } } dbm_close(db); return 0; } static int reader(void) { int k; DBM* db = dbm_open(filename, O_RDONLY, 0660); if (db == NULL) { perror("dbm_open"); return 1; } datum key; key = dbm_firstkey(db); while (key.dptr != NULL) { fwrite(key.dptr, 1, key.dsize, stdout); fputs("\n", stdout); key = dbm_nextkey(db); } dbm_close(db); return 0; } int main(void) { int r; r = writer(); if (r != 0) return 1; r = reader(); if (r != 0) return 1; return 0; }