Pino Toscano
2014-Apr-30 14:00 UTC
[Libguestfs] [PATCH] daemon: xattr: factorize do_getxattr and do_lgetxattr
Move all the common code to a new _getxattr function, much like done for
other xattrs operations.
Mostly code motion, no functional changes.
---
daemon/xattr.c | 54 +++++++++++-------------------------------------------
1 file changed, 11 insertions(+), 43 deletions(-)
diff --git a/daemon/xattr.c b/daemon/xattr.c
index abed5ff..d8ad59a 100644
--- a/daemon/xattr.c
+++ b/daemon/xattr.c
@@ -55,6 +55,7 @@ static guestfs_int_xattr_list *getxattrs (const char *path,
ssize_t (*listxattr)
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));
static int _removexattr (const char *xattr, const char *path, int
(*removexattr) (const char *path, const char *name));
static char *_listxattrs (const char *path, ssize_t (*listxattr) (const char
*path, char *list, size_t size), ssize_t *size);
+static char *_getxattr (const char *name, const char *path, ssize_t (*getxattr)
(const char *path, const char *name, void *value, size_t size), size_t *size_r);
guestfs_int_xattr_list *
do_getxattrs (const char *path)
@@ -448,6 +449,15 @@ do_internal_lxattrlist (const char *path, char *const
*names)
char *
do_getxattr (const char *path, const char *name, size_t *size_r)
{
+ return _getxattr (name, path, getxattr, size_r);
+}
+
+static char *
+_getxattr (const char *name, const char *path,
+ ssize_t (*getxattr) (const char *path, const char *name,
+ void *value, size_t size),
+ size_t *size_r)
+{
ssize_t r;
char *buf;
size_t len;
@@ -496,49 +506,7 @@ do_getxattr (const char *path, const char *name, size_t
*size_r)
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;
-
- if (len > XATTR_SIZE_MAX) {
- reply_with_error ("extended attribute is too large");
- return NULL;
- }
-
- 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 */
+ return _getxattr (name, path, lgetxattr, size_r);
}
int
--
1.9.0
Richard W.M. Jones
2014-Apr-30 16:52 UTC
Re: [Libguestfs] [PATCH] daemon: xattr: factorize do_getxattr and do_lgetxattr
On Wed, Apr 30, 2014 at 04:00:20PM +0200, Pino Toscano wrote:> Move all the common code to a new _getxattr function, much like done for > other xattrs operations. > > Mostly code motion, no functional changes. > --- > daemon/xattr.c | 54 +++++++++++------------------------------------------- > 1 file changed, 11 insertions(+), 43 deletions(-) > > diff --git a/daemon/xattr.c b/daemon/xattr.c > index abed5ff..d8ad59a 100644 > --- a/daemon/xattr.c > +++ b/daemon/xattr.c > @@ -55,6 +55,7 @@ static guestfs_int_xattr_list *getxattrs (const char *path, ssize_t (*listxattr) > 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)); > static int _removexattr (const char *xattr, const char *path, int (*removexattr) (const char *path, const char *name)); > static char *_listxattrs (const char *path, ssize_t (*listxattr) (const char *path, char *list, size_t size), ssize_t *size); > +static char *_getxattr (const char *name, const char *path, ssize_t (*getxattr) (const char *path, const char *name, void *value, size_t size), size_t *size_r); > > guestfs_int_xattr_list * > do_getxattrs (const char *path) > @@ -448,6 +449,15 @@ do_internal_lxattrlist (const char *path, char *const *names) > char * > do_getxattr (const char *path, const char *name, size_t *size_r) > { > + return _getxattr (name, path, getxattr, size_r); > +} > + > +static char * > +_getxattr (const char *name, const char *path, > + ssize_t (*getxattr) (const char *path, const char *name, > + void *value, size_t size), > + size_t *size_r) > +{ > ssize_t r; > char *buf; > size_t len; > @@ -496,49 +506,7 @@ do_getxattr (const char *path, const char *name, size_t *size_r) > 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; > - > - if (len > XATTR_SIZE_MAX) { > - reply_with_error ("extended attribute is too large"); > - return NULL; > - } > - > - 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 */ > + return _getxattr (name, path, lgetxattr, size_r); > }It's a minor thing, but this changes the error messages, so that they will say things like "getxattr: <errno string>" instead of "lgetxattr: ...". It would be good to pass in the name of the function as a string to _getxattr so that it can print the name correctly in error messages. ACK with that change. Rich. -- Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones Read my programming and virtualization blog: http://rwmj.wordpress.com virt-builder quickly builds VMs from scratch http://libguestfs.org/virt-builder.1.html
Pino Toscano
2014-May-02 08:22 UTC
Re: [Libguestfs] [PATCH] daemon: xattr: factorize do_getxattr and do_lgetxattr
On Wednesday 30 April 2014 17:52:14 Richard W.M. Jones wrote:> On Wed, Apr 30, 2014 at 04:00:20PM +0200, Pino Toscano wrote: > > Move all the common code to a new _getxattr function, much like done > > for other xattrs operations. > > > > Mostly code motion, no functional changes. > > --- > > > > daemon/xattr.c | 54 > > +++++++++++------------------------------------------- 1 file > > changed, 11 insertions(+), 43 deletions(-) > > > > diff --git a/daemon/xattr.c b/daemon/xattr.c > > index abed5ff..d8ad59a 100644 > > --- a/daemon/xattr.c > > +++ b/daemon/xattr.c > > @@ -55,6 +55,7 @@ static guestfs_int_xattr_list *getxattrs (const > > char *path, ssize_t (*listxattr)> > > 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)); static > > int _removexattr (const char *xattr, const char *path, int > > (*removexattr) (const char *path, const char *name)); static char > > *_listxattrs (const char *path, ssize_t (*listxattr) (const char > > *path, char *list, size_t size), ssize_t *size);> > > +static char *_getxattr (const char *name, const char *path, ssize_t > > (*getxattr) (const char *path, const char *name, void *value, > > size_t size), size_t *size_r);> > > guestfs_int_xattr_list * > > do_getxattrs (const char *path) > > > > @@ -448,6 +449,15 @@ do_internal_lxattrlist (const char *path, char > > *const *names)> > > char * > > do_getxattr (const char *path, const char *name, size_t *size_r) > > { > > > > + return _getxattr (name, path, getxattr, size_r); > > +} > > + > > +static char * > > +_getxattr (const char *name, const char *path, > > + ssize_t (*getxattr) (const char *path, const char *name, > > + void *value, size_t size), > > + size_t *size_r) > > +{ > > > > ssize_t r; > > char *buf; > > size_t len; > > > > @@ -496,49 +506,7 @@ do_getxattr (const char *path, const char > > *name, size_t *size_r)> > > 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; > > - > > - if (len > XATTR_SIZE_MAX) { > > - reply_with_error ("extended attribute is too large"); > > - return NULL; > > - } > > - > > - 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 */ > > + return _getxattr (name, path, lgetxattr, size_r); > > > > } > > It's a minor thing, but this changes the error messages, so that they > will say things like "getxattr: <errno string>" instead of "lgetxattr: > ...". > > It would be good to pass in the name of the function as a string to > _getxattr so that it can print the name correctly in error messages.Other common functions in xattr.c have the same minor issue.> ACK with that change.If that's OK for you, I can push this patch as it is, and fix the function names in error strings for the whole xattr.c at once. -- Pino Toscano
Reasonably Related Threads
- [PATCH] Clarify the error message when unavailable functions are called (RHBZ#679737).
- Re: RFC: copy-attributes command
- [PATCH libguestfs v2 0/3] daemon: Fix various commands which break on NTFS-3g compressed files.
- [PATCH libguestfs 0/3] daemon: Fix various commands which break on NTFS-3g compressed files.
- [PATCH] inspect: get icon of OpenMandriva guests