summaryrefslogtreecommitdiff
path: root/cmd/podman/images/utils_linux.go
diff options
context:
space:
mode:
authorQi Wang <qiwan@redhat.com>2020-07-23 15:54:12 -0400
committerQi Wang <qiwan@redhat.com>2020-08-12 10:03:41 -0400
commit49dea06037e1254a1dbe0064942e7329079388ec (patch)
tree25dd0ddb22f219e2ed6fc6e777e7d083ec27c5bb /cmd/podman/images/utils_linux.go
parent8eaacec150df782c291e9c6046bb0db010dd2f08 (diff)
downloadpodman-49dea06037e1254a1dbe0064942e7329079388ec.tar.gz
podman-49dea06037e1254a1dbe0064942e7329079388ec.tar.bz2
podman-49dea06037e1254a1dbe0064942e7329079388ec.zip
podman save use named pipe
podman save uses named pipe as output path, not directly using /dev/stdout. fix #7017 Signed-off-by: Qi Wang <qiwan@redhat.com>
Diffstat (limited to 'cmd/podman/images/utils_linux.go')
-rw-r--r--cmd/podman/images/utils_linux.go47
1 files changed, 47 insertions, 0 deletions
diff --git a/cmd/podman/images/utils_linux.go b/cmd/podman/images/utils_linux.go
new file mode 100644
index 000000000..5521abab4
--- /dev/null
+++ b/cmd/podman/images/utils_linux.go
@@ -0,0 +1,47 @@
+package images
+
+import (
+ "io"
+ "io/ioutil"
+ "os"
+ "path/filepath"
+
+ "github.com/pkg/errors"
+ "github.com/sirupsen/logrus"
+ "golang.org/x/sys/unix"
+)
+
+// setupPipe for fixing https://github.com/containers/podman/issues/7017
+// uses named pipe since containers/image EvalSymlinks fails with /dev/stdout
+// the caller should use the returned function to clean up the pipeDir
+func setupPipe() (string, func() <-chan error, error) {
+ errc := make(chan error)
+ pipeDir, err := ioutil.TempDir(os.TempDir(), "pipeDir")
+ if err != nil {
+ return "", nil, err
+ }
+ pipePath := filepath.Join(pipeDir, "saveio")
+ err = unix.Mkfifo(pipePath, 0600)
+ if err != nil {
+ if e := os.RemoveAll(pipeDir); e != nil {
+ logrus.Errorf("error removing named pipe: %q", e)
+ }
+ return "", nil, errors.Wrapf(err, "error creating named pipe")
+ }
+ go func() {
+ fpipe, err := os.Open(pipePath)
+ if err != nil {
+ errc <- err
+ return
+ }
+ _, err = io.Copy(os.Stdout, fpipe)
+ fpipe.Close()
+ errc <- err
+ }()
+ return pipePath, func() <-chan error {
+ if e := os.RemoveAll(pipeDir); e != nil {
+ logrus.Errorf("error removing named pipe: %q", e)
+ }
+ return errc
+ }, nil
+}