xattr-util: add flistxattr_malloc() that returns a NULSTR
authorLennart Poettering <lennart@poettering.net>
Thu, 14 Nov 2019 13:51:04 +0000 (14:51 +0100)
committerLennart Poettering <lennart@poettering.net>
Tue, 19 Nov 2019 14:44:58 +0000 (15:44 +0100)
src/basic/xattr-util.c
src/basic/xattr-util.h

index aae693e..0125a9c 100644 (file)
@@ -234,3 +234,37 @@ int fd_setcrtime(int fd, usec_t usec) {
 
         return 0;
 }
+
+int flistxattr_malloc(int fd, char **ret) {
+        size_t l = 100;
+
+        assert(fd >= 0);
+        assert(ret);
+
+        for (;;) {
+                _cleanup_free_ char *v = NULL;
+                ssize_t n;
+
+                v = new(char, l+1);
+                if (!v)
+                        return -ENOMEM;
+
+                n = flistxattr(fd, v, l);
+                if (n < 0) {
+                        if (errno != ERANGE)
+                                return -errno;
+                } else {
+                        v[n] = 0; /* NUL terminate */
+                        *ret = TAKE_PTR(v);
+                        return (int) n;
+                }
+
+                n = flistxattr(fd, NULL, 0);
+                if (n < 0)
+                        return -errno;
+                if (n > INT_MAX) /* We couldn't return this as 'int' anymore */
+                        return -E2BIG;
+
+                l = (size_t) n;
+        }
+}
index 9fa85d7..a69e913 100644 (file)
@@ -23,3 +23,5 @@ int fd_setcrtime(int fd, usec_t usec);
 int fd_getcrtime(int fd, usec_t *usec);
 int path_getcrtime(const char *p, usec_t *usec);
 int fd_getcrtime_at(int dirfd, const char *name, usec_t *usec, int flags);
+
+int flistxattr_malloc(int fd, char **ret);