Index: trunk/Nebulous/nebclient/src/nebclient.c
===================================================================
--- trunk/Nebulous/nebclient/src/nebclient.c	(revision 20988)
+++ trunk/Nebulous/nebclient/src/nebclient.c	(revision 21461)
@@ -4,5 +4,5 @@
  * Copyright (C) 2005  Joshua Hoblitt
  *
- * $Id: nebclient.c,v 1.56 2008-12-14 22:48:35 eugene Exp $
+ * $Id: nebclient.c,v 1.57 2009-02-13 02:45:47 jhoblitt Exp $
  */
 
@@ -336,5 +336,4 @@
 bool nebSetXattr(nebServer *server, const char *key, const char *name, const char *value, nebCR flag)
 {
-
     REQUIRE_SERVER;
 
@@ -363,4 +362,99 @@
     if (!response) {
         nebSetErr(server, "can not set xattr");
+        return false;
+    }
+
+    return true;
+}
+
+
+char *nebGetXattr(nebServer *server, const char *key, const char *name) 
+{
+    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;
+    }
+
+    struct ns1__getxattr_USCOREobjectResponse response;
+    if (soap_call_ns1__getxattr_USCOREobject(server->soap, server->endpoint,
+        NULL, (char *)key, (char *)name, (char **)&response) != SOAP_OK) {
+        nebSetServerErr(server);
+        return false;
+    }
+
+    if (!(char *)response.result) {
+        nebSetErr(server, "server returned no result");
+        return NULL;
+    }
+
+    char *value = xmalloc(strlen((char *)response.result) + 1);
+    strcpy(value, (char *)response.result);
+
+    return value;
+}
+
+
+int nebListXattr(nebServer *server, const char *key, char ***xattrs)
+{
+    REQUIRE_SERVER;
+
+    if (!key) {
+        nebSetErr(server, "parameter 'key' may not be NULL");
+        return false;
+    }
+
+    struct ns1__listxattr_USCOREobjectResponse response;
+    if (soap_call_ns1__listxattr_USCOREobject(server->soap, server->endpoint,
+        NULL, (char *)key, &response) != SOAP_OK) {
+        nebSetServerErr(server);
+        return false;
+    }
+
+    int resultElements = response.result->__size;
+
+    if (xattrs) {
+        char **resultArray = response.result->__ptr;
+        *xattrs = xmalloc(resultElements * sizeof(char *));
+        if (resultElements) {
+            for (int i = 0; i < resultElements; i++) {
+                *xattrs[i] = xmalloc(strlen(resultArray[i]) + 1);
+                strcpy(*xattrs[i], resultArray[i]);
+            }
+
+        }
+    }
+
+    return resultElements;
+}
+
+
+bool nebRemoveXattr(nebServer *server, const char *key, const char *name)
+{
+    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;
+    }
+
+    int response;
+    if (soap_call_ns1__removexattr_USCOREobject(server->soap, server->endpoint,
+        NULL, (char *)key, (char *)name, &response) != SOAP_OK) {
+        nebSetServerErr(server);
+        return false;
+    }
+
+    if (!response) {
+        nebSetErr(server, "can not remove xattr");
         return false;
     }
