Files
podman/pkg/varlinkapi/transfers.go
Valentin Rothberg 8489dc4345 move go module to v2
With the advent of Podman 2.0.0 we crossed the magical barrier of go
modules.  While we were able to continue importing all packages inside
of the project, the project could not be vendored anymore from the
outside.

Move the go module to new major version and change all imports to
`github.com/containers/libpod/v2`.  The renaming of the imports
was done via `gomove` [1].

[1] https://github.com/KSubedi/gomove

Signed-off-by: Valentin Rothberg <rothberg@redhat.com>
2020-07-06 15:50:12 +02:00

81 lines
2.0 KiB
Go

// +build varlink
package varlinkapi
import (
"bufio"
"io"
"io/ioutil"
"os"
iopodman "github.com/containers/libpod/v2/pkg/varlink"
"github.com/sirupsen/logrus"
)
// SendFile allows a client to send a file to the varlink server
func (i *VarlinkAPI) SendFile(call iopodman.VarlinkCall, ftype string, length int64) error {
if !call.WantsUpgrade() {
return call.ReplyErrorOccurred("client must use upgraded connection to send files")
}
outputFile, err := ioutil.TempFile("", "varlink_send")
if err != nil {
return call.ReplyErrorOccurred(err.Error())
}
defer outputFile.Close()
if err = call.ReplySendFile(outputFile.Name()); err != nil {
// If an error occurs while sending the reply, return the error
return err
}
writer := bufio.NewWriter(outputFile)
defer writer.Flush()
reader := call.Call.Reader
if _, err := io.CopyN(writer, reader, length); err != nil {
return err
}
logrus.Debugf("successfully received %s", outputFile.Name())
// Send an ACK to the client
call.Call.Writer.WriteString(outputFile.Name() + ":")
call.Call.Writer.Flush()
return nil
}
// ReceiveFile allows the varlink server to send a file to a client
func (i *VarlinkAPI) ReceiveFile(call iopodman.VarlinkCall, filepath string, delete bool) error {
if !call.WantsUpgrade() {
return call.ReplyErrorOccurred("client must use upgraded connection to send files")
}
fs, err := os.Open(filepath)
if err != nil {
return call.ReplyErrorOccurred(err.Error())
}
fileInfo, err := fs.Stat()
if err != nil {
return call.ReplyErrorOccurred(err.Error())
}
// Send the file length down to client
// Varlink connection upgraded
if err = call.ReplyReceiveFile(fileInfo.Size()); err != nil {
// If an error occurs while sending the reply, return the error
return err
}
reader := bufio.NewReader(fs)
_, err = reader.WriteTo(call.Writer)
if err != nil {
return err
}
if delete {
if err := os.Remove(filepath); err != nil {
return err
}
}
return call.Writer.Flush()
}