Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /* Compile with: cc bdb-get.c -ldb */
- #include <ctype.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <db.h>
- static DB_ENV *env = NULL;
- static DB *db = NULL;
- static DBT dkey, ddata;
- static void
- dberr(const char *msg, int rc)
- {
- fprintf(stderr, "%s: %s\n", msg, db_strerror(rc));
- }
- static void
- cleanup()
- {
- int rc;
- free(ddata.data);
- if (db)
- if (rc = db->close(db, 0))
- dberr("cleanup: DB->close failed", rc);
- if (env)
- if (rc = env->close(env, 0))
- dberr("cleanup: DB_ENV->close failed", rc);
- }
- static void
- stdfatal(const char *msg)
- {
- perror(msg);
- cleanup();
- exit(EXIT_FAILURE);
- }
- static void
- dbfatal(const char *msg, int rc)
- {
- dberr(msg, rc);
- cleanup();
- exit(EXIT_FAILURE);
- }
- static int
- digittoint(int c)
- {
- if ('0' <= c && c <= '9')
- return c - '0';
- if ('A' <= c && c <= 'Z')
- return c - 'A' + 10;
- if ('a' <= c && c <= 'z')
- return c - 'a' + 10;
- abort();
- }
- int
- main(int argc, char **argv)
- {
- if (argc != 4) {
- fprintf(stderr, "usage: %s <db-home> <db-name> <hex-key>\n", argv[0]);
- exit(EXIT_FAILURE);
- }
- const char *home = argv[1];
- const char *name = argv[2];
- const char *key = argv[3];
- unsigned char *data;
- if (key[0] == '0' && key[1] == 'x')
- key += 2;
- if (strlen(key) % 2) {
- fprintf(stderr, "Invalid key, not even sized\n");
- cleanup();
- exit(EXIT_FAILURE);
- }
- dkey.size = dkey.ulen = strlen(key) / 2;
- dkey.data = data = malloc(dkey.ulen);
- if (!data)
- stdfatal("malloc failed");
- while (isxdigit(key[0]) && isxdigit(key[1])) {
- *data++ = digittoint(key[0]) * 16 + digittoint(key[1]);
- key += 2;
- }
- int rc;
- if (rc = db_env_create(&env, 0))
- dbfatal("db_env_create failed", rc);
- if (rc = env->open(env, home, 0, 0))
- dbfatal("DB_ENV->open failed", rc);
- if (rc = db_create(&db, env, 0))
- dbfatal("db_create failed", rc);
- if (rc = db->open(db, NULL, name, NULL, DB_UNKNOWN, DB_RDONLY, 0))
- dbfatal("DB->open failed", rc);
- ddata.flags = DB_DBT_MALLOC;
- if (rc = db->get(db, NULL, &dkey, &ddata, 0))
- dbfatal("DB->get failed", rc);
- if (fwrite(ddata.data, 1, ddata.size, stdout) != ddata.size)
- stdfatal("fwrite failed");
- cleanup();
- exit(EXIT_SUCCESS);
- }
Add Comment
Please, Sign In to add comment