]> git.ipfire.org Git - thirdparty/lxc.git/commitdiff
utils: add mount_from_at()
authorChristian Brauner <christian.brauner@ubuntu.com>
Thu, 4 Feb 2021 14:23:55 +0000 (15:23 +0100)
committerChristian Brauner <christian.brauner@ubuntu.com>
Thu, 4 Feb 2021 17:45:32 +0000 (18:45 +0100)
Signed-off-by: Christian Brauner <christian.brauner@ubuntu.com>
src/lxc/utils.c
src/lxc/utils.h

index e664e62769480a63a2a9f0440bff41cdd5f0ed9f..60d35ed926fd57d126e10a8bcc4fb9cbe373c09a 100644 (file)
@@ -1263,6 +1263,53 @@ int mount_at(int dfd,
        return ret;
 }
 
+int mount_from_at(int dfd_from, const char *path_from,
+                 __u64 o_flags_from,
+                 __u64 resolve_flags_from,
+                 int dfd_to, const char *path_to,
+                 __u64 o_flags_to,
+                 __u64 resolve_flags_to,
+                 const char *fstype, unsigned int mnt_flags, const void *data)
+{
+       __do_close int fd_from = -EBADF, fd_to = -EBADF;
+       struct lxc_open_how how = {};
+       int ret;
+       char src_buf[LXC_PROC_PID_FD_LEN], dst_buf[LXC_PROC_PID_FD_LEN];
+
+       if (is_empty_string(path_from)) {
+               ret = snprintf(src_buf, sizeof(src_buf), "/proc/self/fd/%d", dfd_from);
+       } else {
+               how.flags       = o_flags_from;
+               how.resolve     = resolve_flags_from;
+               fd_from = openat2(dfd_from, path_from, &how, sizeof(how));
+               if (fd_from < 0)
+                       return -errno;
+
+               ret = snprintf(src_buf, sizeof(src_buf), "/proc/self/fd/%d", fd_from);
+       }
+       if (ret < 0 || ret >= sizeof(src_buf))
+               return -EIO;
+
+       if (is_empty_string(path_to)) {
+               ret = snprintf(dst_buf, sizeof(dst_buf), "/proc/self/fd/%d", dfd_to);
+       } else {
+               how.flags       = o_flags_to;
+               how.resolve     = resolve_flags_to;
+               fd_to = openat2(dfd_to, path_to, &how, sizeof(how));
+               if (fd_to < 0)
+                       return -errno;
+
+               ret = snprintf(dst_buf, sizeof(dst_buf), "/proc/self/fd/%d", fd_to);
+       }
+
+       if (is_empty_string(src_buf))
+               ret = mount(NULL, dst_buf, fstype, mnt_flags, data);
+       else
+               ret = mount(src_buf, dst_buf, fstype, mnt_flags, data);
+
+       return ret;
+}
+
 int open_devnull(void)
 {
        int fd = open("/dev/null", O_RDWR);
index dc22394fc09e377385ee29461c06bed1992de89e..ffc235a1b9b5ad5ce14ee49c9ad603eced20caab 100644 (file)
@@ -247,5 +247,11 @@ __hidden extern int mount_at(int dfd, const char *src_under_dfd,
                             const char *dst_under_dfd, __u64 o_flags,
                             __u64 resolve_flags, const char *fstype,
                             unsigned int mnt_flags, const void *data);
+__hidden extern int mount_from_at(int dfd_from, const char *path_from,
+                                 __u64 o_flags_from, __u64 resolve_flags_from,
+                                 int dfd_to, const char *path_to,
+                                 __u64 o_flags_to, __u64 resolve_flags_to,
+                                 const char *fstype, unsigned int mnt_flags,
+                                 const void *data);
 
 #endif /* __LXC_UTILS_H */