]> git.ipfire.org Git - thirdparty/lxc.git/commitdiff
file_utils: add lxc_read_try_buf_at()
authorChristian Brauner <christian.brauner@ubuntu.com>
Tue, 2 Feb 2021 15:59:14 +0000 (16:59 +0100)
committerChristian Brauner <christian.brauner@ubuntu.com>
Tue, 2 Feb 2021 15:59:14 +0000 (16:59 +0100)
Signed-off-by: Christian Brauner <christian.brauner@ubuntu.com>
src/lxc/file_utils.c
src/lxc/file_utils.h

index d871190d7678796f8ccc6713477d491956653d8e..e2a3837f9c5dd2b4fc7bcd2ff8dbe5c73f5d0e39 100644 (file)
@@ -122,6 +122,32 @@ int lxc_read_from_file(const char *filename, void *buf, size_t count)
        return ret;
 }
 
+ssize_t lxc_read_try_buf_at(int dfd, const char *path, void *buf, size_t count)
+{
+       __do_close int fd = -EBADF;
+       ssize_t ret;
+
+       fd = open_at(dfd, path, PROTECT_OPEN_W, PROTECT_LOOKUP_BENEATH, 0);
+       if (fd < 0)
+               return -errno;
+
+       if (!buf || !count) {
+               char buf2[100];
+               size_t count2 = 0;
+
+               while ((ret = lxc_read_nointr(fd, buf2, 100)) > 0)
+                       count2 += ret;
+
+               if (ret >= 0)
+                       ret = count2;
+       } else {
+               memset(buf, 0, count);
+               ret = lxc_read_nointr(fd, buf, count);
+       }
+
+       return ret;
+}
+
 ssize_t lxc_write_nointr(int fd, const void *buf, size_t count)
 {
        ssize_t ret;
index 0250038b347f7fd7be5e2c46a899aab718d365ea..76a48edb3749f767518c974bb2d231e0e00a8ede 100644 (file)
@@ -94,5 +94,7 @@ __hidden int fd_make_nonblocking(int fd);
 __hidden extern char *read_file_at(int dfd, const char *fnam,
                                    unsigned int o_flags,
                                    unsigned resolve_flags);
+__hidden extern ssize_t lxc_read_try_buf_at(int dfd, const char *path,
+                                            void *buf, size_t count);
 
 #endif /* __LXC_FILE_UTILS_H */