Guest User

Untitled

a guest
Jan 19th, 2019
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.34 KB | None | 0 0
  1. /* Compile with: cc bdb-get.c -ldb */
  2. #include <ctype.h>
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <string.h>
  6. #include <db.h>
  7.  
  8. static DB_ENV *env = NULL;
  9. static DB *db = NULL;
  10. static DBT dkey, ddata;
  11.  
  12. static void
  13. dberr(const char *msg, int rc)
  14. {
  15. fprintf(stderr, "%s: %s\n", msg, db_strerror(rc));
  16. }
  17.  
  18. static void
  19. cleanup()
  20. {
  21. int rc;
  22. free(ddata.data);
  23. if (db)
  24. if (rc = db->close(db, 0))
  25. dberr("cleanup: DB->close failed", rc);
  26. if (env)
  27. if (rc = env->close(env, 0))
  28. dberr("cleanup: DB_ENV->close failed", rc);
  29. }
  30.  
  31. static void
  32. stdfatal(const char *msg)
  33. {
  34. perror(msg);
  35. cleanup();
  36. exit(EXIT_FAILURE);
  37. }
  38.  
  39. static void
  40. dbfatal(const char *msg, int rc)
  41. {
  42. dberr(msg, rc);
  43. cleanup();
  44. exit(EXIT_FAILURE);
  45. }
  46.  
  47. static int
  48. digittoint(int c)
  49. {
  50. if ('0' <= c && c <= '9')
  51. return c - '0';
  52. if ('A' <= c && c <= 'Z')
  53. return c - 'A' + 10;
  54. if ('a' <= c && c <= 'z')
  55. return c - 'a' + 10;
  56. abort();
  57. }
  58.  
  59. int
  60. main(int argc, char **argv)
  61. {
  62. if (argc != 4) {
  63. fprintf(stderr, "usage: %s <db-home> <db-name> <hex-key>\n", argv[0]);
  64. exit(EXIT_FAILURE);
  65. }
  66. const char *home = argv[1];
  67. const char *name = argv[2];
  68. const char *key = argv[3];
  69. unsigned char *data;
  70. if (key[0] == '0' && key[1] == 'x')
  71. key += 2;
  72. if (strlen(key) % 2) {
  73. fprintf(stderr, "Invalid key, not even sized\n");
  74. cleanup();
  75. exit(EXIT_FAILURE);
  76. }
  77.  
  78. dkey.size = dkey.ulen = strlen(key) / 2;
  79. dkey.data = data = malloc(dkey.ulen);
  80. if (!data)
  81. stdfatal("malloc failed");
  82. while (isxdigit(key[0]) && isxdigit(key[1])) {
  83. *data++ = digittoint(key[0]) * 16 + digittoint(key[1]);
  84. key += 2;
  85. }
  86.  
  87. int rc;
  88. if (rc = db_env_create(&env, 0))
  89. dbfatal("db_env_create failed", rc);
  90. if (rc = env->open(env, home, 0, 0))
  91. dbfatal("DB_ENV->open failed", rc);
  92. if (rc = db_create(&db, env, 0))
  93. dbfatal("db_create failed", rc);
  94. if (rc = db->open(db, NULL, name, NULL, DB_UNKNOWN, DB_RDONLY, 0))
  95. dbfatal("DB->open failed", rc);
  96.  
  97. ddata.flags = DB_DBT_MALLOC;
  98. if (rc = db->get(db, NULL, &dkey, &ddata, 0))
  99. dbfatal("DB->get failed", rc);
  100.  
  101. if (fwrite(ddata.data, 1, ddata.size, stdout) != ddata.size)
  102. stdfatal("fwrite failed");
  103.  
  104. cleanup();
  105. exit(EXIT_SUCCESS);
  106. }
Add Comment
Please, Sign In to add comment