inspect: Refuse to download software hive if it is huge.
[libguestfs.git] / daemon / xattr.c
index d16939f..a5169cf 100644 (file)
 #include <stdio.h>
 #include <unistd.h>
 
-#include "../src/guestfs_protocol.h"
+#include "guestfs_protocol.h"
 #include "daemon.h"
 #include "actions.h"
+#include "optgroups.h"
 
 #if defined(HAVE_ATTR_XATTR_H) || defined(HAVE_SYS_XATTR_H)
 
-#ifdef HAVE_ATTR_XATTR_H
-#include <attr/xattr.h>
-#else
-#ifdef HAVE_SYS_XATTR_H
-#include <sys/xattr.h>
-#endif
-#endif
+# ifdef HAVE_ATTR_XATTR_H
+#  include <attr/xattr.h>
+# else
+#  ifdef HAVE_SYS_XATTR_H
+#   include <sys/xattr.h>
+#  endif
+# endif
+
+int
+optgroup_linuxxattrs_available (void)
+{
+  return 1;
+}
 
 static guestfs_int_xattr_list *getxattrs (const char *path, ssize_t (*listxattr) (const char *path, char *list, size_t size), ssize_t (*getxattr) (const char *path, const char *name, void *value, size_t size));
 static int _setxattr (const char *xattr, const char *val, int vallen, const char *path, int (*setxattr) (const char *path, const char *name, const void *value, size_t size, int flags));
@@ -45,7 +52,7 @@ do_getxattrs (const char *path)
 #if defined(HAVE_LISTXATTR) && defined(HAVE_GETXATTR)
   return getxattrs (path, listxattr, getxattr);
 #else
-  reply_with_error ("getxattrs: no support for listxattr and getxattr");
+  reply_with_error ("no support for listxattr and getxattr");
   return NULL;
 #endif
 }
@@ -56,7 +63,7 @@ do_lgetxattrs (const char *path)
 #if defined(HAVE_LLISTXATTR) && defined(HAVE_LGETXATTR)
   return getxattrs (path, llistxattr, lgetxattr);
 #else
-  reply_with_error ("lgetxattrs: no support for llistxattr and lgetxattr");
+  reply_with_error ("no support for llistxattr and lgetxattr");
   return NULL;
 #endif
 }
@@ -67,7 +74,7 @@ do_setxattr (const char *xattr, const char *val, int vallen, const char *path)
 #if defined(HAVE_SETXATTR)
   return _setxattr (xattr, val, vallen, path, setxattr);
 #else
-  reply_with_error ("setxattr: no support for setxattr");
+  reply_with_error ("no support for setxattr");
   return -1;
 #endif
 }
@@ -78,7 +85,7 @@ do_lsetxattr (const char *xattr, const char *val, int vallen, const char *path)
 #if defined(HAVE_LSETXATTR)
   return _setxattr (xattr, val, vallen, path, lsetxattr);
 #else
-  reply_with_error ("lsetxattr: no support for lsetxattr");
+  reply_with_error ("no support for lsetxattr");
   return -1;
 #endif
 }
@@ -89,7 +96,7 @@ do_removexattr (const char *xattr, const char *path)
 #if defined(HAVE_REMOVEXATTR)
   return _removexattr (xattr, path, removexattr);
 #else
-  reply_with_error ("removexattr: no support for removexattr");
+  reply_with_error ("no support for removexattr");
   return -1;
 #endif
 }
@@ -100,7 +107,7 @@ do_lremovexattr (const char *xattr, const char *path)
 #if defined(HAVE_LREMOVEXATTR)
   return _removexattr (xattr, path, lremovexattr);
 #else
-  reply_with_error ("lremovexattr: no support for lremovexattr");
+  reply_with_error ("no support for lremovexattr");
   return -1;
 #endif
 }
@@ -120,7 +127,7 @@ getxattrs (const char *path,
   len = listxattr (path, NULL, 0);
   CHROOT_OUT;
   if (len == -1) {
-    reply_with_perror ("listxattr");
+    reply_with_perror ("listxattr: %s", path);
     goto error;
   }
 
@@ -134,7 +141,7 @@ getxattrs (const char *path,
   len = listxattr (path, buf, len);
   CHROOT_OUT;
   if (len == -1) {
-    reply_with_perror ("listxattr");
+    reply_with_perror ("listxattr: %s", path);
     goto error;
   }
 
@@ -259,7 +266,7 @@ do_lxattrlist (const char *path, char *const *names)
   char *buf = NULL;
 
   if (path_len >= PATH_MAX) {
-    reply_with_perror ("lxattrlist: path longer than PATH_MAX");
+    reply_with_perror ("path longer than PATH_MAX");
     goto error;
   }
 
@@ -281,7 +288,7 @@ do_lxattrlist (const char *path, char *const *names)
      * outgoing struct list.
      */
     if (path_len + strlen (names[k]) + 2 > PATH_MAX) {
-      reply_with_perror ("lxattrlist: path and name longer than PATH_MAX");
+      reply_with_perror ("path and name longer than PATH_MAX");
       goto error;
     }
     pathname[path_len] = '/';
@@ -403,14 +410,14 @@ do_lxattrlist (const char *path, char *const *names)
     fprintf (stderr, "lxattrlist: returning: [\n");
     for (k = 0; k < ret->guestfs_int_xattr_list_len; ++k) {
       const guestfs_int_xattr *entry = &ret->guestfs_int_xattr_list_val[k];
-      if (strcmp (entry[0].attrname, "") != 0) {
+      if (STRNEQ (entry[0].attrname, "")) {
         fprintf (stderr, "ERROR: expecting empty attrname at k = %zu\n", k);
         break;
       }
       fprintf (stderr, "  %zu: special attrval = %s\n",
                k, entry[0].attrval.attrval_val);
       for (i = 1; k+i < ret->guestfs_int_xattr_list_len; ++i) {
-        if (strcmp (entry[i].attrname, "") == 0)
+        if (STREQ (entry[i].attrname, ""))
           break;
         fprintf (stderr, "    name %s, value length %d\n",
                  entry[i].attrname, entry[i].attrval.attrval_len);
@@ -436,60 +443,58 @@ do_lxattrlist (const char *path, char *const *names)
   }
   return NULL;
 #else
-  reply_with_error ("lxattrlist: no support for llistxattr and lgetxattr");
+  reply_with_error ("no support for llistxattr and lgetxattr");
   return NULL;
 #endif
 }
 
 #else /* no xattr.h */
+int
+optgroup_linuxxattrs_available (void)
+{
+  return 0;
+}
 
 guestfs_int_xattr_list *
 do_getxattrs (const char *path)
 {
-  reply_with_error ("getxattrs: no support for xattrs");
-  return NULL;
+  NOT_AVAILABLE (NULL);
 }
 
 guestfs_int_xattr_list *
 do_lgetxattrs (const char *path)
 {
-  reply_with_error ("lgetxattrs: no support for xattrs");
-  return NULL;
+  NOT_AVAILABLE (NULL);
 }
 
 int
 do_setxattr (const char *xattr, const char *val, int vallen, const char *path)
 {
-  reply_with_error ("setxattr: no support for xattrs");
-  return -1;
+  NOT_AVAILABLE (-1);
 }
 
 int
 do_lsetxattr (const char *xattr, const char *val, int vallen, const char *path)
 {
-  reply_with_error ("lsetxattr: no support for xattrs");
-  return -1;
+  NOT_AVAILABLE (-1);
 }
 
 int
 do_removexattr (const char *xattr, const char *path)
 {
-  reply_with_error ("removexattr: no support for xattrs");
-  return -1;
+  NOT_AVAILABLE (-1);
 }
 
 int
 do_lremovexattr (const char *xattr, const char *path)
 {
-  reply_with_error ("lremovexattr: no support for xattrs");
-  return -1;
+  NOT_AVAILABLE (-1);
 }
 
 guestfs_int_xattr_list *
 do_lxattrlist (const char *path, char *const *names)
 {
-  reply_with_error ("lxattrlist: no support for xattrs");
-  return NULL;
+  NOT_AVAILABLE (NULL);
 }
 
 #endif /* no xattr.h */