Index: /trunk/Nebulous/nebclient/src/nebclient.c
===================================================================
--- /trunk/Nebulous/nebclient/src/nebclient.c	(revision 4636)
+++ /trunk/Nebulous/nebclient/src/nebclient.c	(revision 4637)
@@ -4,5 +4,5 @@
  * Copyright (C) 2005  Joshua Hoblitt
  *
- * $Id: nebclient.c,v 1.27 2005-07-28 02:07:13 jhoblitt Exp $
+ * $Id: nebclient.c,v 1.28 2005-07-28 02:55:20 jhoblitt Exp $
  */
 
@@ -18,4 +18,5 @@
 #include <stdbool.h>
 #include <stdarg.h>
+#include <time.h>
 #include "xmalloc.h"
 #include "soapH.h"
@@ -24,4 +25,6 @@
 
 #define ERRBUF_SIZE 2048
+#define LOCK_TIMEOUT 10
+#define LOCK_INTERVAL 1
 
 #define nebSetErr(server,...) \
@@ -199,12 +202,53 @@
 bool nebLock(nebServer *server, const char *key, nebRW flag)
 {
-
-    return true;
+    time_t          endtime;
+    char            *type;
+    int             response;
+
+    type = flag == NEB_READ ? "read" : "write";
+
+    endtime = time(NULL) + LOCK_TIMEOUT;
+
+    while (time(NULL) < endtime) {
+        if (soap_call_ns1__lock_USCOREobject(server->soap, server->endpoint,
+            NULL, (char *)key, type, &response) != SOAP_OK) {
+            nebSetServerErr(server);
+            return false;
+        }
+
+        if (response) {
+            return true;
+        }
+
+        sleep(LOCK_INTERVAL);
+    }
+
+    // else, we never got a lock
+    nebSetErr(server, "can not get a %s lock", type);
+
+    return false;
 }
 
 bool nebUnlock(nebServer *server, const char *key, nebRW flag)
 {
-
-    return true;
+    char            *type;
+    int             response;
+
+    type = flag == NEB_READ ? "read" : "write";
+
+    if (soap_call_ns1__unlock_USCOREobject(server->soap, server->endpoint,
+        NULL, (char *)key, type, &response) != SOAP_OK) {
+        nebSetServerErr(server);
+        return false;
+    }
+
+    if (response) {
+        return true;
+    }
+
+    // else, we never got a lock
+    nebSetErr(server, "can not release %s lock", type);
+
+    return false;
 }
 
