Index: trunk/Nebulous/nebclient/src/nebclient.c
===================================================================
--- trunk/Nebulous/nebclient/src/nebclient.c	(revision 4504)
+++ trunk/Nebulous/nebclient/src/nebclient.c	(revision 4506)
@@ -4,5 +4,5 @@
  * Copyright (C) 2005  Joshua Hoblitt
  *
- * $Id: nebclient.c,v 1.11 2005-07-07 21:41:15 jhoblitt Exp $
+ * $Id: nebclient.c,v 1.12 2005-07-07 22:47:40 jhoblitt Exp $
  */
 
@@ -17,4 +17,5 @@
 #include <unistd.h>
 #include <stdbool.h>
+#include <stdarg.h>
 #include "xmalloc.h"
 #include "soapH.h"
@@ -24,4 +25,6 @@
 #define ERRBUF_SIZE 2048
 
+static bool nebSetErr(nebServer *server, const char *format, ...);
+static bool nebSetServerErr(nebServer *server);
 static off_t nebCopyFile(char *source, char *dest);
 static off_t nebCopyFilehandle(int sourceFH, int destFH);
@@ -35,24 +38,10 @@
     server          = xmalloc(sizeof(nebServer));
     server->soap    = xmalloc(sizeof(struct soap));
-    server->err_msg = xmalloc(ERRBUF_SIZE);
+    server->err_buf = xmalloc(ERRBUF_SIZE);
+    server->err_buf_size = ERRBUF_SIZE;
 
     soap_init(server->soap);
 
     return server;
-}
-
-char *nebServerErr(nebServer *server)
-{
-    char            *fault;
-    const char      **code;
-    const char      **string;
-
-    code   = soap_faultcode(server->soap);
-    string = soap_faultstring(server->soap);
-
-    fault = xmalloc(strlen(*code) + 3 + strlen(*string) + 1);
-    sprintf(fault, "%s - %s", *code, *string);
-
-    return fault;
 }
 
@@ -63,5 +52,5 @@
 
     nebFree(server->soap);
-    nebFree(server->err_msg);
+    nebFree(server->err_buf);
     nebFree(server);
 }
@@ -94,4 +83,6 @@
 
     // server error
+    nebSetServerErr(server);
+
     return -1;
 }
@@ -339,8 +330,48 @@
 }
 
-int nebErr(nebServer *server, char *errString )
-{
-
-    return 0;
+char *nebErr(nebServer *server)
+{
+    return server->err_buf;
+}
+
+static bool nebSetErr(nebServer *server, const char *format, ...)
+{
+    va_list         args;
+    size_t          err_size;
+
+    while (1) {
+        va_start(args, format);
+        err_size = vsnprintf(server->err_buf, server->err_buf_size, format, args);
+        va_end(args);
+
+        if (err_size < 0) {
+            fprintf(stderr, "failed to set error message\n");
+
+            return false;
+        }
+
+        if (err_size < server->err_buf_size) {
+            return true;
+        }
+
+        // else: expand err_buf
+        fprintf(stderr, "error buffer is too small, expanding\n");
+
+        // account for '\0'
+        server->err_buf_size = err_size + 1;
+        xrealloc(server->err_buf, server->err_buf_size);
+    }
+
+}
+
+static bool nebSetServerErr(nebServer *server)
+{
+    const char      **code;
+    const char      **string;
+
+    code   = soap_faultcode(server->soap);
+    string = soap_faultstring(server->soap);
+
+    return nebSetErr(server, "%s - %s", *code, *string);
 }
 
