Index: trunk/Nebulous/nebclient/src/nebclient.c
===================================================================
--- trunk/Nebulous/nebclient/src/nebclient.c	(revision 20208)
+++ trunk/Nebulous/nebclient/src/nebclient.c	(revision 20209)
@@ -4,5 +4,5 @@
  * Copyright (C) 2005  Joshua Hoblitt
  *
- * $Id: nebclient.c,v 1.51 2008-10-13 22:11:09 jhoblitt Exp $
+ * $Id: nebclient.c,v 1.52 2008-10-16 23:53:01 jhoblitt Exp $
  */
 
@@ -333,4 +333,41 @@
 }
 
+
+bool nebSetXattr(nebServer *server, const char *key, const char *name, const char *value, nebCR flag)
+{
+
+    REQUIRE_SERVER;
+
+    if (!key) {
+        nebSetErr(server, "parameter 'key' may not be NULL");
+        return false;
+    }
+    if (!name) {
+        nebSetErr(server, "parameter 'name' may not be NULL");
+        return false;
+    }
+    if (!value) {
+        nebSetErr(server, "parameter 'value' may not be NULL");
+        return false;
+    }
+
+    char *type = flag == NEB_CREATE ? "create" : "replace";
+
+    int response;
+    if (soap_call_ns1__setxattr_USCOREobject(server->soap, server->endpoint,
+        NULL, (char *)key, (char *)name, (char *)value, type, &response) != SOAP_OK) {
+        nebSetServerErr(server);
+        return false;
+    }
+
+    if (!response) {
+        nebSetErr(server, "can not set xattr");
+        return false;
+    }
+
+    return true;
+}
+
+
 nebObjectInstances *nebFindInstances(nebServer *server, const char *key, const char *volume)
 {
Index: trunk/Nebulous/nebclient/src/nebclient.h
===================================================================
--- trunk/Nebulous/nebclient/src/nebclient.h	(revision 20208)
+++ trunk/Nebulous/nebclient/src/nebclient.h	(revision 20209)
@@ -4,5 +4,5 @@
  * Copyright (C) 2005  Joshua Hoblitt
  *
- * $Id: nebclient.h,v 1.33 2008-10-13 22:11:09 jhoblitt Exp $
+ * $Id: nebclient.h,v 1.34 2008-10-16 23:53:01 jhoblitt Exp $
  */
 
@@ -20,4 +20,5 @@
 
 typedef enum { NEB_READ, NEB_WRITE } nebRW;
+typedef enum { NEB_CREATE, NEB_REPLACE } nebCR;
 
 /** Represents a "connection" to a Nebulous server
@@ -142,4 +143,16 @@
 );
 
+/** Set an Xattr on a storage object
+ *
+ * @return true on success
+ */
+bool nebSetXattr(
+    nebServer *server,                  ///< nebServer object
+    const char *key,                    ///< storage object key (name)
+    const char *name,                   ///< xattr name
+    const char *value,                  ///< xattr value
+    nebCR flag                          ///< flag: "create"|"replace"
+);
+
 /** Lists all instances of a storage object
  *
Index: trunk/Nebulous/nebclient/tests/tests.c
===================================================================
--- trunk/Nebulous/nebclient/tests/tests.c	(revision 20208)
+++ trunk/Nebulous/nebclient/tests/tests.c	(revision 20209)
@@ -19,5 +19,5 @@
     char            *key = "foobarbaz";
 
-    plan_tests(23);
+    plan_tests(24);
 
     if (getenv("NEB_SERVER")) {
@@ -94,4 +94,6 @@
     neb_ok(server, nebUnlock(server, key, NEB_READ), "unlock object read");
 
+    neb_ok(server, nebSetXattr(server, key, "user.copies", "2",  NEB_CREATE), "set user.copies xattr");
+
     {
         nebObjectInstances *locations = NULL;
