]> git.ipfire.org Git - thirdparty/lxc.git/commitdiff
file_utils: add open_at_same()
authorChristian Brauner <christian.brauner@ubuntu.com>
Fri, 30 Jul 2021 11:02:01 +0000 (13:02 +0200)
committerChristian Brauner <christian.brauner@ubuntu.com>
Fri, 30 Jul 2021 11:02:01 +0000 (13:02 +0200)
Signed-off-by: Christian Brauner <christian.brauner@ubuntu.com>
src/lxc/file_utils.c
src/lxc/file_utils.h

index 13a87055275185f1932abfd30be83abdd48a2476..a361d188e7baf9e2e6f8610227ae169686e67611 100644 (file)
@@ -670,6 +670,21 @@ int open_at(int dfd, const char *path, unsigned int o_flags,
        return move_fd(fd);
 }
 
+int open_at_same(int fd_same, int dfd, const char *path, unsigned int o_flags,
+                unsigned int resolve_flags, mode_t mode)
+{
+       __do_close int fd = -EBADF;
+
+       fd = open_at(dfd, path, o_flags, resolve_flags, mode);
+       if (fd < 0)
+               return -errno;
+
+       if (!same_file_lax(fd_same, fd))
+               return ret_errno(EINVAL);
+
+       return move_fd(fd);
+}
+
 int fd_make_nonblocking(int fd)
 {
        int flags;
index cd9f447ffeb694e16b6f21d03c63bac2adf91dca..faf7454dde60fc708d0f4ab0e8a625e73e9eca7f 100644 (file)
@@ -87,6 +87,9 @@ __hidden extern bool exists_dir_at(int dir_fd, const char *path);
 __hidden extern bool exists_file_at(int dir_fd, const char *path);
 __hidden extern int open_at(int dfd, const char *path, unsigned int o_flags,
                            unsigned int resolve_flags, mode_t mode);
+__hidden extern int open_at_same(int fd_same, int dfd, const char *path,
+                                unsigned int o_flags,
+                                unsigned int resolve_flags, mode_t mode);
 static inline int open_beneath(int dfd, const char *path, unsigned int flags)
 {
        return open_at(dfd, path, flags, PROTECT_LOOKUP_BENEATH, 0);