1 /* Author: Daniel Kahn Gillmor <dkg@fifthhorseman.net> */
2 /* Date: Fri, 04 Apr 2008 19:31:16 -0400 */
3 /* License: GPL v3 or later */
5 #include "gnutls-helpers.h"
10 void err(const char* fmt, ...) {
13 vfprintf(stderr, fmt, ap);
17 void logfunc(int level, const char* string) {
18 fprintf(stderr, "GnuTLS Logging (%d): %s\n", level, string);
24 const char* version = NULL;
25 const char* debug_string = NULL;
28 if (ret = gnutls_global_init(), ret) {
29 err("Failed to do gnutls_global_init() (error: %d)\n", ret);
33 version = gnutls_check_version(NULL);
36 err("gnutls version: %s\n", version);
38 err("no version found!\n");
42 if (debug_string = getenv("MONKEYSPHERE_DEBUG"), debug_string) {
43 loglevel = atoi(debug_string);
44 gnutls_global_set_log_function(logfunc);
46 gnutls_global_set_log_level(loglevel);
47 err("set log level to %d\n", loglevel);
52 void init_datum(gnutls_datum_t* d) {
56 void copy_datum(gnutls_datum_t* dest, const gnutls_datum_t* src) {
57 dest->data = gnutls_realloc(dest->data, src->size);
58 dest->size = src->size;
59 memcpy(dest->data, src->data, src->size);
61 int compare_data(const gnutls_datum_t* a, const gnutls_datum_t* b) {
62 if (a->size > b->size) {
66 if (a->size < b->size) {
70 return memcmp(a->data, b->data, a->size);
72 void free_datum(gnutls_datum_t* d) {
78 /* read the passed-in string, store in a single datum */
79 int set_datum_string(gnutls_datum_t* d, const char* s) {
80 unsigned int x = strlen(s)+1;
81 unsigned char* c = NULL;
83 c = gnutls_realloc(d->data, x);
88 memcpy(d->data, s, x);
92 /* read the passed-in file descriptor until EOF, store in a single
94 int set_datum_fd(gnutls_datum_t* d, int fd) {
95 unsigned int bufsize = 1024;
98 FILE* f = fdopen(fd, "r");
99 if (bufsize > d->size) {
101 d->data = gnutls_realloc(d->data, bufsize);
102 if (d->data == NULL) {
103 err("out of memory!\n");
112 err("could not fdopen FD %d\n", fd);
115 while (!feof(f) && !ferror(f)) {
116 if (len == bufsize) {
117 /* allocate more space by doubling: */
119 d->data = gnutls_realloc(d->data, bufsize);
120 if (d->data == NULL) {
121 err("out of memory!\n");
126 len += fread(d->data + len, 1, bufsize - len, f);
127 /* err("read %d bytes\n", len); */
130 err("Error reading from fd %d (error: %d) (error: %d '%s')\n", fd, ferror(f), errno, strerror(errno));
134 /* touch up buffer size to match reality: */
135 d->data = gnutls_realloc(d->data, len);
140 /* read the file indicated (by na1me) in the fname parameter. store
141 its entire contents in a single datum. */
142 int set_datum_file(gnutls_datum_t* d, const char* fname) {
144 unsigned char* c = NULL;
148 if (0 != stat(fname, &sbuf)) {
149 err("failed to stat '%s'\n", fname);
153 c = gnutls_realloc(d->data, sbuf.st_size);
155 err("failed to allocate %d bytes for '%s'\n", sbuf.st_size, fname);
160 d->size = sbuf.st_size;
161 file = fopen(fname, "r");
163 err("failed to open '%s' for reading\n", fname);
167 x = fread(d->data, d->size, 1, file);
169 err("tried to read %d bytes, read %d instead from '%s'\n", d->size, x, fname);