return r;
/* Make sure we always have a mount that we can move to root later on. */
- if (!path_is_mount_point(directory, NULL, 0)) {
- r = mount_nofollow_verbose(LOG_ERR, directory, directory, NULL, MS_BIND|MS_REC, NULL);
- if (r < 0)
- return r;
- }
+ r = make_mount_point(directory);
+ if (r < 0)
+ return r;
if (dissected_image) {
/* Now we know the uid shift, let's now mount everything else that might be in the image. */
return mount_in_namespace(target, propagate_path, incoming_path, src, dest, read_only, make_file_or_directory, options, true);
}
+
+int make_mount_point(const char *path) {
+ int r;
+
+ assert(path);
+
+ /* If 'path' is already a mount point, does nothing and returns 0. If it is not it makes it one, and returns 1. */
+
+ r = path_is_mount_point(path, NULL, 0);
+ if (r < 0)
+ return log_debug_errno(r, "Failed to determine whether '%s' is a mount point: %m", path);
+ if (r > 0)
+ return 0;
+
+ r = mount_nofollow_verbose(LOG_DEBUG, path, path, NULL, MS_BIND|MS_REC, NULL);
+ if (r < 0)
+ return r;
+
+ return 1;
+}
int bind_mount_in_namespace(pid_t target, const char *propagate_path, const char *incoming_path, const char *src, const char *dest, bool read_only, bool make_file_or_directory);
int mount_image_in_namespace(pid_t target, const char *propagate_path, const char *incoming_path, const char *src, const char *dest, bool read_only, bool make_file_or_directory, const MountOptions *options);
+
+int make_mount_point(const char *path);