diff options
author | Valentin Rothberg <rothberg@redhat.com> | 2021-01-22 15:38:51 +0100 |
---|---|---|
committer | Valentin Rothberg <rothberg@redhat.com> | 2021-01-26 09:01:33 +0100 |
commit | 7b186dcb9e79c15a4d5506db8922281cd8034a58 (patch) | |
tree | 24eed190348a717bf19273ed31f9c2a3c40178dc /libpod/container_api.go | |
parent | 6ba8819d336ed3514b57c5818123ddfac80555ef (diff) | |
download | podman-7b186dcb9e79c15a4d5506db8922281cd8034a58.tar.gz podman-7b186dcb9e79c15a4d5506db8922281cd8034a58.tar.bz2 podman-7b186dcb9e79c15a4d5506db8922281cd8034a58.zip |
libpod: add (*Container).ResolvePath()
Add an API to libpod to resolve a path on the container. We can
refactor the code that was originally written for copy. Other
functions are requiring a proper path resolution, so libpod seems
like a reasonable home for sharing that code.
Signed-off-by: Valentin Rothberg <rothberg@redhat.com>
Diffstat (limited to 'libpod/container_api.go')
-rw-r--r-- | libpod/container_api.go | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/libpod/container_api.go b/libpod/container_api.go index 0d62a2dd7..951227a4f 100644 --- a/libpod/container_api.go +++ b/libpod/container_api.go @@ -776,3 +776,32 @@ func (c *Container) ShouldRestart(ctx context.Context) bool { } return c.shouldRestart() } + +// ResolvePath resolves the specified path on the root for the container. The +// root must either be the mounted image of the container or the already +// mounted container storage. +// +// It returns the resolved root and the resolved path. Note that the path may +// resolve to the container's mount point or to a volume or bind mount. +func (c *Container) ResolvePath(ctx context.Context, root string, path string) (string, string, error) { + logrus.Debugf("Resolving path %q (root %q) on container %s", path, root, c.ID()) + + // Minimal sanity checks. + if len(root)*len(path) == 0 { + return "", "", errors.Wrapf(define.ErrInternal, "ResolvePath: root (%q) and path (%q) must be non empty", root, path) + } + if _, err := os.Stat(root); err != nil { + return "", "", errors.Wrapf(err, "cannot locate root to resolve path on container %s", c.ID()) + } + + if !c.batched { + c.lock.Lock() + defer c.lock.Unlock() + + if err := c.syncContainer(); err != nil { + return "", "", err + } + } + + return c.resolvePath(root, path) +} |