/* libguestfs - the guestfsd daemon
- * Copyright (C) 2009 Red Hat Inc.
+ * Copyright (C) 2009-2011 Red Hat Inc.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
#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_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
}
#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
}
#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
}
#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
}
#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
}
#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
}
len = listxattr (path, NULL, 0);
CHROOT_OUT;
if (len == -1) {
- reply_with_perror ("listxattr");
+ reply_with_perror ("listxattr: %s", path);
goto error;
}
len = listxattr (path, buf, len);
CHROOT_OUT;
if (len == -1) {
- reply_with_perror ("listxattr");
+ reply_with_perror ("listxattr: %s", path);
goto error;
}
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;
}
* 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] = '/';
}
}
- /* If verbose, debug what we're about to send back. */
- if (verbose) {
- 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 (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 (STREQ (entry[i].attrname, ""))
- break;
- fprintf (stderr, " name %s, value length %d\n",
- entry[i].attrname, entry[i].attrval.attrval_len);
- }
- k += i-1;
- }
- fprintf (stderr, "]\n");
- }
-
return ret;
error:
}
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
}
+char *
+do_getxattr (const char *path, const char *name, size_t *size_r)
+{
+ ssize_t r;
+ char *buf;
+ size_t len;
+
+ CHROOT_IN;
+ r = getxattr (path, name, NULL, 0);
+ CHROOT_OUT;
+ if (r == -1) {
+ reply_with_perror ("getxattr");
+ return NULL;
+ }
+
+ len = r;
+ buf = malloc (len);
+ if (buf == NULL) {
+ reply_with_perror ("malloc");
+ return NULL;
+ }
+
+ CHROOT_IN;
+ r = getxattr (path, name, buf, len);
+ CHROOT_OUT;
+ if (r == -1) {
+ reply_with_perror ("getxattr");
+ free (buf);
+ return NULL;
+ }
+
+ if (len != (size_t) r) {
+ reply_with_error ("getxattr: unexpected size (%zu/%zd)", len, r);
+ free (buf);
+ return NULL;
+ }
+
+ /* Must set size_r last thing before returning. */
+ *size_r = len;
+ return buf; /* caller frees */
+}
+
+char *
+do_lgetxattr (const char *path, const char *name, size_t *size_r)
+{
+ ssize_t r;
+ char *buf;
+ size_t len;
+
+ CHROOT_IN;
+ r = lgetxattr (path, name, NULL, 0);
+ CHROOT_OUT;
+ if (r == -1) {
+ reply_with_perror ("lgetxattr");
+ return NULL;
+ }
+
+ len = r;
+ buf = malloc (len);
+ if (buf == NULL) {
+ reply_with_perror ("malloc");
+ return NULL;
+ }
+
+ CHROOT_IN;
+ r = lgetxattr (path, name, buf, len);
+ CHROOT_OUT;
+ if (r == -1) {
+ reply_with_perror ("lgetxattr");
+ free (buf);
+ return NULL;
+ }
+
+ if (len != (size_t) r) {
+ reply_with_error ("lgetxattr: unexpected size (%zu/%zd)", len, r);
+ free (buf);
+ return NULL;
+ }
+
+ /* Must set size_r last thing before returning. */
+ *size_r = len;
+ return buf; /* caller frees */
+}
+
#else /* no xattr.h */
int
optgroup_linuxxattrs_available (void)
NOT_AVAILABLE (NULL);
}
+char *
+do_getxattr (const char *path, const char *name, size_t *size_r)
+{
+ NOT_AVAILABLE (NULL);
+}
+
+char *
+do_lgetxattr (const char *path, const char *name, size_t *size_r)
+{
+ NOT_AVAILABLE (NULL);
+}
+
#endif /* no xattr.h */