github.com/cloud-foundations/dominator@v0.0.0-20221004181915-6e4fee580046/sub/client/getFiles.go (about)

     1  package client
     2  
     3  import (
     4  	"io"
     5  
     6  	"github.com/Cloud-Foundations/Dominator/lib/srpc"
     7  	"github.com/Cloud-Foundations/Dominator/proto/sub"
     8  )
     9  
    10  func getFiles(client *srpc.Client, filenames []string,
    11  	readerFunc func(reader io.Reader, size uint64) error) error {
    12  	conn, err := client.Call("Subd.GetFiles")
    13  	if err != nil {
    14  		return err
    15  	}
    16  	defer conn.Close()
    17  	go sendRequests(conn, filenames)
    18  	for range filenames {
    19  		var reply sub.GetFileResponse
    20  		if err := conn.Decode(&reply); err != nil {
    21  			return err
    22  		}
    23  		if reply.Error != nil {
    24  			return reply.Error
    25  		}
    26  		if err := readerFunc(&io.LimitedReader{R: conn, N: int64(reply.Size)},
    27  			reply.Size); err != nil {
    28  			return err
    29  		}
    30  	}
    31  	return nil
    32  }
    33  
    34  func sendRequests(conn *srpc.Conn, filenames []string) error {
    35  	for _, filename := range filenames {
    36  		if _, err := conn.WriteString(filename + "\n"); err != nil {
    37  			return err
    38  		}
    39  	}
    40  	if _, err := conn.WriteString("\n"); err != nil {
    41  		return err
    42  	}
    43  	return conn.Flush()
    44  }