summaryrefslogtreecommitdiff
path: root/gnutls-helpers.c
blob: f5d37e602eb40da9aad86d93d4f1473b067a19cb (plain)
  1. /* Author: Daniel Kahn Gillmor <dkg@fifthhorseman.net> */
  2. /* Date: Fri, 04 Apr 2008 19:31:16 -0400 */
  3. /* License: GPL v3 or later */
  4. #include "gnutls-helpers.h"
  5. int loglevel = 0;
  6. void err(const char* fmt, ...) {
  7. va_list ap;
  8. va_start(ap, fmt);
  9. vfprintf(stderr, fmt, ap);
  10. va_end(ap);
  11. }
  12. void logfunc(int level, const char* string) {
  13. fprintf(stderr, "GnuTLS Logging (%d): %s\n", level, string);
  14. }
  15. int init_gnutls() {
  16. const char* version = NULL;
  17. const char* debug_string = NULL;
  18. int ret;
  19. if (ret = gnutls_global_init(), ret) {
  20. err("Failed to do gnutls_global_init() (error: %d)\n", ret);
  21. return 1;
  22. }
  23. version = gnutls_check_version(NULL);
  24. if (version)
  25. err("gnutls version: %s\n", version);
  26. else {
  27. err("no version found!\n");
  28. return 1;
  29. }
  30. if (debug_string = getenv("MONKEYSPHERE_DEBUG"), debug_string) {
  31. loglevel = atoi(debug_string);
  32. gnutls_global_set_log_function(logfunc);
  33. gnutls_global_set_log_level(loglevel);
  34. err("set log level to %d\n", loglevel);
  35. }
  36. return 0;
  37. }
  38. void init_datum(gnutls_datum_t* d) {
  39. d->data = NULL;
  40. d->size = 0;
  41. }
  42. void copy_datum(gnutls_datum_t* dest, const gnutls_datum_t* src) {
  43. dest->data = gnutls_realloc(dest->data, src->size);
  44. dest->size = src->size;
  45. memcpy(dest->data, src->data, src->size);
  46. }
  47. int compare_data(const gnutls_datum_t* a, const gnutls_datum_t* b) {
  48. if (a->size > b->size) {
  49. err("a is larger\n");
  50. return 1;
  51. }
  52. if (a->size < b->size) {
  53. err("b is larger\n");
  54. return -1;
  55. }
  56. return memcmp(a->data, b->data, a->size);
  57. }
  58. void free_datum(gnutls_datum_t* d) {
  59. gnutls_free(d->data);
  60. d->data = NULL;
  61. d->size = 0;
  62. }
  63. /* read the passed-in string, store in a single datum */
  64. int set_datum_string(gnutls_datum_t* d, const char* s) {
  65. unsigned int x = strlen(s)+1;
  66. unsigned char* c = NULL;
  67. c = gnutls_realloc(d->data, x);
  68. if (NULL == c)
  69. return -1;
  70. d->data = c;
  71. d->size = x;
  72. memcpy(d->data, s, x);
  73. return 0;
  74. }
  75. /* read the passed-in file descriptor until EOF, store in a single
  76. datum */
  77. int set_datum_fd(gnutls_datum_t* d, int fd) {
  78. unsigned int bufsize = 1024;
  79. unsigned int len = 0;
  80. FILE* f = fdopen(fd, "r");
  81. if (bufsize > d->size) {
  82. bufsize = 1024;
  83. d->data = gnutls_realloc(d->data, bufsize);
  84. if (d->data == NULL) {
  85. err("out of memory!\n");
  86. return -1;
  87. }
  88. d->size = bufsize;
  89. } else {
  90. bufsize = d->size;
  91. }
  92. f = fdopen(fd, "r");
  93. if (NULL == f) {
  94. err("could not fdopen FD %d\n", fd);
  95. }
  96. clearerr(f);
  97. while (!feof(f) && !ferror(f)) {
  98. if (len == bufsize) {
  99. /* allocate more space by doubling: */
  100. bufsize *= 2;
  101. d->data = gnutls_realloc(d->data, bufsize);
  102. if (d->data == NULL) {
  103. err("out of memory!\n");
  104. return -1;
  105. };
  106. d->size = bufsize;
  107. }
  108. len += fread(d->data + len, 1, bufsize - len, f);
  109. /* err("read %d bytes\n", len); */
  110. }
  111. if (ferror(f)) {
  112. err("Error reading from fd %d (error: %d) (error: %d '%s')\n", fd, ferror(f), errno, strerror(errno));
  113. return -1;
  114. }
  115. /* touch up buffer size to match reality: */
  116. d->data = gnutls_realloc(d->data, len);
  117. d->size = len;
  118. return 0;
  119. }
  120. /* read the file indicated (by na1me) in the fname parameter. store
  121. its entire contents in a single datum. */
  122. int set_datum_file(gnutls_datum_t* d, const char* fname) {
  123. struct stat sbuf;
  124. unsigned char* c = NULL;
  125. FILE* file = NULL;
  126. size_t x = 0;
  127. if (0 != stat(fname, &sbuf)) {
  128. err("failed to stat '%s'\n", fname);
  129. return -1;
  130. }
  131. c = gnutls_realloc(d->data, sbuf.st_size);
  132. if (NULL == c) {
  133. err("failed to allocate %d bytes for '%s'\n", sbuf.st_size, fname);
  134. return -1;
  135. }
  136. d->data = c;
  137. d->size = sbuf.st_size;
  138. file = fopen(fname, "r");
  139. if (NULL == file) {
  140. err("failed to open '%s' for reading\n", fname);
  141. return -1;
  142. }
  143. x = fread(d->data, d->size, 1, file);
  144. if (x != 1) {
  145. err("tried to read %d bytes, read %d instead from '%s'\n", d->size, x, fname);
  146. fclose(file);
  147. return -1;
  148. }
  149. fclose(file);
  150. return 0;
  151. }