broke out gnutls business into a helper file in preparation for new projects.
authorDaniel Kahn Gillmor <dkg@fifthhorseman.net>
Mon, 7 Apr 2008 05:37:41 +0000 (01:37 -0400)
committerDaniel Kahn Gillmor <dkg@fifthhorseman.net>
Mon, 7 Apr 2008 05:37:41 +0000 (01:37 -0400)
Makefile
gnutls-helpers.c [new file with mode: 0644]
gnutls-helpers.h [new file with mode: 0644]
main.c

index a2a3e74a52302b6436b070857980d1c35970e6ef..b8545a99b22d8e743d2c43f64ae1937c2b243ec4 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -1,7 +1,10 @@
-monkeysphere: main.c
-       gcc -g -Wall --pedantic -o monkeysphere main.c `libgnutls-config --libs --cflags` -lgnutls-extra
+monkeysphere: main.c gnutls-helpers.o
+       gcc -g -Wall --pedantic -o monkeysphere main.c `libgnutls-config --libs --cflags` -lgnutls-extra gnutls-helpers.o
+
+%.o: %.c
+       gcc -g -Wall --pedantic -o $@ -c $<
 
 clean: 
-       rm -f monkeysphere
+       rm -f monkeysphere *.o
 
 .PHONY: clean
diff --git a/gnutls-helpers.c b/gnutls-helpers.c
new file mode 100644 (file)
index 0000000..f5d37e6
--- /dev/null
@@ -0,0 +1,175 @@
+/* Author: Daniel Kahn Gillmor <dkg@fifthhorseman.net> */
+/* Date: Fri, 04 Apr 2008 19:31:16 -0400 */
+/* License: GPL v3 or later */
+
+#include "gnutls-helpers.h"
+
+int loglevel = 0;
+
+
+void err(const char* fmt, ...) {
+  va_list ap;
+  va_start(ap, fmt);
+  vfprintf(stderr, fmt, ap);
+  va_end(ap);
+}
+
+void logfunc(int level, const char* string) {
+  fprintf(stderr, "GnuTLS Logging (%d): %s\n", level, string);
+}
+
+
+
+int init_gnutls() {
+  const char* version = NULL;
+  const char* debug_string = NULL;
+  int ret;
+
+  if (ret = gnutls_global_init(), ret) {
+    err("Failed to do gnutls_global_init() (error: %d)\n", ret);
+    return 1;
+  }
+
+  version = gnutls_check_version(NULL);
+
+  if (version) 
+    err("gnutls version: %s\n", version);
+  else {
+    err("no version found!\n");
+    return 1;
+  }
+
+  if (debug_string = getenv("MONKEYSPHERE_DEBUG"), debug_string) {
+    loglevel = atoi(debug_string);
+    gnutls_global_set_log_function(logfunc);
+    
+    gnutls_global_set_log_level(loglevel);
+    err("set log level to %d\n", loglevel);
+  }
+  return 0;
+}
+
+void init_datum(gnutls_datum_t* d) {
+  d->data = NULL;
+  d->size = 0;
+}
+void copy_datum(gnutls_datum_t* dest, const gnutls_datum_t* src) {
+  dest->data = gnutls_realloc(dest->data, src->size);
+  dest->size = src->size;
+  memcpy(dest->data, src->data, src->size);
+}
+int compare_data(const gnutls_datum_t* a, const gnutls_datum_t* b) {
+  if (a->size > b->size) {
+    err("a is larger\n");
+    return 1;
+  }
+  if (a->size < b->size) {
+    err("b is larger\n");
+    return -1;
+  }
+  return memcmp(a->data, b->data, a->size);
+}
+void free_datum(gnutls_datum_t* d) {
+  gnutls_free(d->data);
+  d->data = NULL;
+  d->size = 0;
+}
+
+/* read the passed-in string, store in a single datum */
+int set_datum_string(gnutls_datum_t* d, const char* s) {
+  unsigned int x = strlen(s)+1;
+  unsigned char* c = NULL;
+
+  c = gnutls_realloc(d->data, x);
+  if (NULL == c)
+    return -1;
+  d->data = c;
+  d->size = x;
+  memcpy(d->data, s, x);
+  return 0;
+}
+
+/* read the passed-in file descriptor until EOF, store in a single
+   datum */
+int set_datum_fd(gnutls_datum_t* d, int fd) {
+  unsigned int bufsize = 1024;
+  unsigned int len = 0;
+
+  FILE* f = fdopen(fd, "r");
+  if (bufsize > d->size) {
+    bufsize = 1024;
+    d->data = gnutls_realloc(d->data, bufsize);
+    if (d->data == NULL) {
+      err("out of memory!\n");
+      return -1;
+    }
+    d->size = bufsize;
+  } else {
+    bufsize = d->size;
+  }
+  f = fdopen(fd, "r");
+  if (NULL == f) {
+    err("could not fdopen FD %d\n", fd);
+  }
+  clearerr(f);
+  while (!feof(f) && !ferror(f)) { 
+    if (len == bufsize) {
+      /* allocate more space by doubling: */
+      bufsize *= 2;
+      d->data = gnutls_realloc(d->data, bufsize);
+      if (d->data == NULL) {
+       err("out of memory!\n"); 
+       return -1;
+      };
+      d->size = bufsize;
+    }
+    len += fread(d->data + len, 1, bufsize - len, f);
+    /*     err("read %d bytes\n", len); */
+  }
+  if (ferror(f)) {
+    err("Error reading from fd %d (error: %d) (error: %d '%s')\n", fd, ferror(f), errno, strerror(errno));
+    return -1;
+  }
+    
+  /* touch up buffer size to match reality: */
+  d->data = gnutls_realloc(d->data, len);
+  d->size = len;
+  return 0;
+}
+
+/* read the file indicated (by na1me) in the fname parameter.  store
+   its entire contents in a single datum. */
+int set_datum_file(gnutls_datum_t* d, const char* fname) {
+  struct stat sbuf;
+  unsigned char* c = NULL;
+  FILE* file = NULL;
+  size_t x = 0;
+
+  if (0 != stat(fname, &sbuf)) {
+    err("failed to stat '%s'\n", fname);
+    return -1;
+  }
+  
+  c = gnutls_realloc(d->data, sbuf.st_size);
+  if (NULL == c) {
+    err("failed to allocate %d bytes for '%s'\n", sbuf.st_size, fname);
+    return -1;
+  }
+
+  d->data = c;
+  d->size = sbuf.st_size;
+  file = fopen(fname, "r");
+  if (NULL == file) {
+    err("failed to open '%s' for reading\n",  fname);
+    return -1;
+  }
+
+  x = fread(d->data, d->size, 1, file);
+  if (x != 1) {
+    err("tried to read %d bytes, read %d instead from '%s'\n", d->size, x, fname);
+    fclose(file);
+    return -1;
+  }
+  fclose(file);
+  return 0;
+}
diff --git a/gnutls-helpers.h b/gnutls-helpers.h
new file mode 100644 (file)
index 0000000..1bf7a1d
--- /dev/null
@@ -0,0 +1,46 @@
+/* Author: Daniel Kahn Gillmor <dkg@fifthhorseman.net> */
+/* Date: Fri, 04 Apr 2008 19:31:16 -0400 */
+/* License: GPL v3 or later */
+
+
+#include <gnutls/gnutls.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
+#include <stdarg.h>
+
+/* Functions to help dealing with GnuTLS for monkeysphere key
+   translation projects: */
+
+/* set everything up, including logging levels.  Return 0 on
+   success */
+int init_gnutls();
+
+/* logging and output functions: */
+
+void err(const char* fmt, ...);
+void logfunc(int level, const char* string);
+
+/* basic datum manipulations: */
+
+void init_datum(gnutls_datum_t* d);
+void copy_datum(gnutls_datum_t* dest, const gnutls_datum_t* src);
+int compare_data(const gnutls_datum_t* a, const gnutls_datum_t* b);
+void free_datum(gnutls_datum_t* d);
+
+/* functions to get data into datum objects: */
+
+/* read the passed-in string, store in a single datum */
+int set_datum_string(gnutls_datum_t* d, const char* s);
+
+/* read the passed-in file descriptor until EOF, store in a single
+   datum */
+int set_datum_fd(gnutls_datum_t* d, int fd);
+
+/* read the file indicated (by na1me) in the fname parameter.  store
+   its entire contents in a single datum. */
+int set_datum_file(gnutls_datum_t* d, const char* fname);
diff --git a/main.c b/main.c
index 8225f0a01df331269a2bd5dbbd90247c7297372d..638666baabe416ec4c0dcdcbe528db373763bb96 100644 (file)
--- a/main.c
+++ b/main.c
@@ -1,14 +1,7 @@
-#include <gnutls/gnutls.h>
+#include "gnutls-helpers.h"
+
 #include <gnutls/openpgp.h>
 #include <gnutls/x509.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <errno.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <unistd.h>
-#include <stdarg.h>
 
 /* 
    Author: Daniel Kahn Gillmor <dkg@fifthhorseman.net>
@@ -44,150 +37,8 @@ ssh-rsa AAAAB3NzaC1yc2EAAACBAL2BZCp+ueFAoNCc0P/d457Gl10Trgn7XOn19zIKN7sfkspyVvoM
  */
 
 
-int loglevel = 0;
-
-
-void err(const char* fmt, ...) {
-  va_list ap;
-  va_start(ap, fmt);
-  vfprintf(stderr, fmt, ap);
-  va_end(ap);
-}
-
-void logfunc(int level, const char* string) {
-  fprintf(stderr, "GnuTLS Logging (%d): %s\n", level, string);
-}
-
-void init_datum(gnutls_datum_t* d) {
-  d->data = NULL;
-  d->size = 0;
-}
-void copy_datum(gnutls_datum_t* dest, const gnutls_datum_t* src) {
-  dest->data = gnutls_realloc(dest->data, src->size);
-  dest->size = src->size;
-  memcpy(dest->data, src->data, src->size);
-}
-int compare_data(const gnutls_datum_t* a, const gnutls_datum_t* b) {
-  if (a->size > b->size) {
-    err("a is larger\n");
-    return 1;
-  }
-  if (a->size < b->size) {
-    err("b is larger\n");
-    return -1;
-  }
-  return memcmp(a->data, b->data, a->size);
-}
-void free_datum(gnutls_datum_t* d) {
-  gnutls_free(d->data);
-  d->data = NULL;
-  d->size = 0;
-}
-
-/* read the passed-in string, store in a single datum */
-int set_datum_string(gnutls_datum_t* d, const char* s) {
-  unsigned int x = strlen(s)+1;
-  unsigned char* c = NULL;
-
-  c = gnutls_realloc(d->data, x);
-  if (NULL == c)
-    return -1;
-  d->data = c;
-  d->size = x;
-  memcpy(d->data, s, x);
-  return 0;
-}
-
-/* read the passed-in file descriptor until EOF, store in a single
-   datum */
-int set_datum_fd(gnutls_datum_t* d, int fd) {
-  unsigned int bufsize = 1024;
-  unsigned int len = 0;
-
-  FILE* f = fdopen(fd, "r");
-  if (bufsize > d->size) {
-    bufsize = 1024;
-    d->data = gnutls_realloc(d->data, bufsize);
-    if (d->data == NULL) {
-      err("out of memory!\n");
-      return -1;
-    }
-    d->size = bufsize;
-  } else {
-    bufsize = d->size;
-  }
-  f = fdopen(fd, "r");
-  if (NULL == f) {
-    err("could not fdopen FD %d\n", fd);
-  }
-  clearerr(f);
-  while (!feof(f) && !ferror(f)) { 
-    if (len == bufsize) {
-      /* allocate more space by doubling: */
-      bufsize *= 2;
-      d->data = gnutls_realloc(d->data, bufsize);
-      if (d->data == NULL) {
-       err("out of memory!\n"); 
-       return -1;
-      };
-      d->size = bufsize;
-    }
-    len += fread(d->data + len, 1, bufsize - len, f);
-    /*     err("read %d bytes\n", len); */
-  }
-  if (ferror(f)) {
-    err("Error reading from fd %d (error: %d) (error: %d '%s')\n", fd, ferror(f), errno, strerror(errno));
-    return -1;
-  }
-    
-  /* touch up buffer size to match reality: */
-  d->data = gnutls_realloc(d->data, len);
-  d->size = len;
-  return 0;
-}
-
-/* read the file indicated (by na1me) in the fname parameter.  store
-   its entire contents in a single datum. */
-int set_datum_file(gnutls_datum_t* d, const char* fname) {
-  struct stat sbuf;
-  unsigned char* c = NULL;
-  FILE* file = NULL;
-  size_t x = 0;
-
-  if (0 != stat(fname, &sbuf)) {
-    err("failed to stat '%s'\n", fname);
-    return -1;
-  }
-  
-  c = gnutls_realloc(d->data, sbuf.st_size);
-  if (NULL == c) {
-    err("failed to allocate %d bytes for '%s'\n", sbuf.st_size, fname);
-    return -1;
-  }
-
-  d->data = c;
-  d->size = sbuf.st_size;
-  file = fopen(fname, "r");
-  if (NULL == file) {
-    err("failed to open '%s' for reading\n",  fname);
-    return -1;
-  }
-
-  x = fread(d->data, d->size, 1, file);
-  if (x != 1) {
-    err("tried to read %d bytes, read %d instead from '%s'\n", d->size, x, fname);
-    fclose(file);
-    return -1;
-  }
-  fclose(file);
-  return 0;
-}
-
 
 int main(int argc, char* argv[]) {
-  const char* version = NULL;
-  const char* debug_string = NULL;
-
   gnutls_x509_privkey_t x509_privkey;
   gnutls_datum_t data, test, clean;
   int ret;
@@ -206,6 +57,8 @@ int main(int argc, char* argv[]) {
 
   char output_data[10240];
   size_t ods = sizeof(output_data);
+
+  init_gnutls();
   
   init_datum(&data);
   init_datum(&test);
@@ -220,29 +73,6 @@ int main(int argc, char* argv[]) {
   init_datum(&y);
   init_datum(&x);
 
-  if (ret = gnutls_global_init(), ret) {
-    err("Failed to do gnutls_global_init() (error: %d)\n", ret);
-    return 1;
-  }
-
-
-
-  version = gnutls_check_version(NULL);
-
-  if (version) 
-    err("gnutls version: %s\n", version);
-  else {
-    err("no version found!\n");
-    return 1;
-  }
-
-  if (debug_string = getenv("MONKEYSPHERE_DEBUG"), debug_string) {
-    loglevel = atoi(debug_string);
-    gnutls_global_set_log_function(logfunc);
-    
-    gnutls_global_set_log_level(loglevel);
-    err("set log level to %d\n", loglevel);
-  }
 
   if (ret = gnutls_x509_privkey_init(&x509_privkey), ret) {
     err("Failed to initialize X.509 private key (error: %d)\n", ret);
@@ -336,8 +166,6 @@ int main(int argc, char* argv[]) {
     return 1;
   }
   
-  /* const gnutls_datum_t * m, const gnutls_datum_t * e, const gnutls_datum_t * d, const gnutls_datum_t * p, const gnutls_datum_t * q, const gnutls_datum_t * u); */
-  
   ret = gnutls_x509_privkey_fix(x509_privkey);
   if (ret != 0) {
     err("failed to fix up the private key in X.509 format (error: %d)\n", ret);