Index: /trunk/Nebulous/nebclient/src/nebclient.c
===================================================================
--- /trunk/Nebulous/nebclient/src/nebclient.c	(revision 4645)
+++ /trunk/Nebulous/nebclient/src/nebclient.c	(revision 4646)
@@ -4,5 +4,5 @@
  * Copyright (C) 2005  Joshua Hoblitt
  *
- * $Id: nebclient.c,v 1.29 2005-07-28 04:13:32 jhoblitt Exp $
+ * $Id: nebclient.c,v 1.30 2005-07-28 21:55:52 jhoblitt Exp $
  */
 
@@ -37,4 +37,5 @@
 static size_t nebParseURI(nebServer *server, const char *URI, char **filename);
 static bool nebNukeFile(nebServer *server, const char *filename);
+static char *nullstrncpy(char *dest, const char *src, size_t n);
 
 nebServer *nebServerAlloc(const char *endpoint)
@@ -457,8 +458,38 @@
 }
 
-int nebStat(nebServer *server, const char *key)
-{
-
-    return 0;
+nebObjectStat *nebStat(nebServer *server, const char *key)
+{
+    struct ns1__stat_USCOREobjectResponse response;
+    nebObjectStat   *stat;
+    int             resultElements = 0;
+    char            **resultArray = NULL;
+
+    stat = xmalloc(sizeof(nebObjectStat));
+
+    // FIXME is this leaking memory when response goes out of scope?
+    if (soap_call_ns1__stat_USCOREobject(server->soap, server->endpoint,
+            NULL, (char *)key, &response) != SOAP_OK) {
+        nebSetServerErr(server);
+        return NULL;
+    }
+
+    resultElements = response.result->__size;
+    resultArray    = response.result->__ptr;
+
+    if (resultElements != 8) {
+        nebSetErr(server, "server didn't return the proper number of stat elements");
+        return NULL;
+    }
+
+    nullstrncpy(stat->so_id, resultArray[0], 256);
+    nullstrncpy(stat->ext_id, resultArray[1], 256);
+    nullstrncpy(stat->class_id, resultArray[2], 256);
+    nullstrncpy(stat->comment, resultArray[3], 256);
+    nullstrncpy(stat->read_lock, resultArray[4], 256);
+    nullstrncpy(stat->write_lock, resultArray[5], 256);
+    nullstrncpy(stat->epoch, resultArray[6], 256);
+    nullstrncpy(stat->mtime, resultArray[7], 256);
+
+    return stat;
 }
 
@@ -681,2 +712,11 @@
     return true;
 }
+
+static char *nullstrncpy(char *dest, const char *src, size_t n) {
+    if (!src) {
+        dest = NULL;
+        return dest;
+    }
+
+    return strncpy(dest, src, n);
+}
Index: /trunk/Nebulous/nebclient/src/nebclient.h
===================================================================
--- /trunk/Nebulous/nebclient/src/nebclient.h	(revision 4645)
+++ /trunk/Nebulous/nebclient/src/nebclient.h	(revision 4646)
@@ -4,5 +4,5 @@
  * Copyright (C) 2005  Joshua Hoblitt
  *
- * $Id: nebclient.h,v 1.21 2005-07-28 02:07:13 jhoblitt Exp $
+ * $Id: nebclient.h,v 1.22 2005-07-28 21:55:52 jhoblitt Exp $
  */
 
@@ -21,4 +21,15 @@
     char            *endpoint;
 } nebServer;
+
+typedef struct {
+    char            so_id[256];
+    char            ext_id[256];
+    char            class_id[256];
+    char            comment[256];
+    char            read_lock[256];
+    char            write_lock[256];
+    char            epoch[256];
+    char            mtime[256];
+} nebObjectStat;
 
 nebServer *nebServerAlloc(const char *endpoint);
@@ -50,5 +61,5 @@
 bool nebDeleteInstance(nebServer *server, const char *URI);
 
-int nebStat(nebServer *server, const char *key);
+nebObjectStat *nebStat(nebServer *server, const char *key);
 
 char *nebErr(nebServer *server);
Index: /trunk/Nebulous/nebclient/tests/tests.c
===================================================================
--- /trunk/Nebulous/nebclient/tests/tests.c	(revision 4645)
+++ /trunk/Nebulous/nebclient/tests/tests.c	(revision 4646)
@@ -1,3 +1,4 @@
 #include <stdio.h>
+#include <stdlib.h>
 #include <unistd.h>
 #include <stdbool.h>
@@ -21,5 +22,5 @@
     char            *key = "foobarbaz";
 
-    TESTS(19);
+    TESTS(20);
 
     if (getenv("NEBULOUS_SERVER")) {
@@ -50,4 +51,6 @@
 
     OK(nebCull(server, key), "cull object");
+
+    OK(nebStat(server, key), "stat object");
 
     OK(nebLock(server, key, NEB_WRITE), "lock object write");
