mirror of
https://github.com/containers/podman
synced 2024-10-20 17:23:30 +00:00
podman cp: treat /dev/stdout correctly
/dev/stdout should not be treated as "-" to remain compatible with Docker and to have a more consistent and idiomatic interface. Fixes: #9362 Signed-off-by: Valentin Rothberg <rothberg@redhat.com>
This commit is contained in:
parent
10d52c05e2
commit
8577be72e8
|
@ -121,7 +121,9 @@ func copyFromContainer(container string, containerPath string, hostPath string)
|
|||
return err
|
||||
}
|
||||
|
||||
isStdout := false
|
||||
if hostPath == "-" {
|
||||
isStdout = true
|
||||
hostPath = os.Stdout.Name()
|
||||
}
|
||||
|
||||
|
@ -152,10 +154,16 @@ func copyFromContainer(container string, containerPath string, hostPath string)
|
|||
hostBaseName = filepath.Base(hostInfo.LinkTarget)
|
||||
}
|
||||
|
||||
if !isStdout {
|
||||
if err := validateFileInfo(hostInfo); err != nil {
|
||||
return errors.Wrap(err, "invalid destination")
|
||||
}
|
||||
}
|
||||
|
||||
reader, writer := io.Pipe()
|
||||
hostCopy := func() error {
|
||||
defer reader.Close()
|
||||
if hostInfo.LinkTarget == os.Stdout.Name() {
|
||||
if isStdout {
|
||||
_, err := io.Copy(os.Stdout, reader)
|
||||
return err
|
||||
}
|
||||
|
@ -363,3 +371,12 @@ func containerParentDir(container string, containerPath string) (string, error)
|
|||
workDir = filepath.Join(workDir, containerPath)
|
||||
return filepath.Dir(workDir), nil
|
||||
}
|
||||
|
||||
// validateFileInfo returns an error if the specified FileInfo doesn't point to
|
||||
// a directory or a regular file.
|
||||
func validateFileInfo(info *copy.FileInfo) error {
|
||||
if info.Mode.IsDir() || info.Mode.IsRegular() {
|
||||
return nil
|
||||
}
|
||||
return errors.Errorf("%q must be a directory or a regular file", info.LinkTarget)
|
||||
}
|
||||
|
|
|
@ -508,6 +508,10 @@ load helpers
|
|||
run_podman exec cpcontainer sh -c "echo '$rand_content' > /tmp/file.txt"
|
||||
run_podman exec cpcontainer touch /tmp/empty.txt
|
||||
|
||||
# Make sure that only "-" gets special treatment. "/dev/stdout"
|
||||
run_podman 125 cp cpcontainer:/tmp/file.txt /dev/stdout
|
||||
is "$output" 'Error: invalid destination: "/dev/stdout" must be a directory or a regular file'
|
||||
|
||||
# Copying from stdout will always compress. So let's copy the previously
|
||||
# created file from the container via stdout, untar the archive and make
|
||||
# sure the file exists with the expected content.
|
||||
|
|
Loading…
Reference in a new issue