github.com/Cloud-Foundations/Dominator@v0.3.4/sub/client/getFiles.go (about)

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