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

     1  package rpcd
     2  
     3  import (
     4  	"bufio"
     5  	"io"
     6  	"os"
     7  	"path"
     8  
     9  	"github.com/Cloud-Foundations/Dominator/lib/srpc"
    10  	"github.com/Cloud-Foundations/Dominator/proto/sub"
    11  )
    12  
    13  func (t *rpcType) GetFiles(conn *srpc.Conn) error {
    14  	defer conn.Flush()
    15  	t.getFilesLock.Lock()
    16  	defer t.getFilesLock.Unlock()
    17  	numFiles := 0
    18  	for ; ; numFiles++ {
    19  		filename, err := conn.ReadString('\n')
    20  		if err != nil {
    21  			return err
    22  		}
    23  		filename = filename[:len(filename)-1]
    24  		if filename == "" {
    25  			break
    26  		}
    27  		filename = path.Join(t.config.RootDirectoryName, filename)
    28  		if err := t.getFile(conn, filename); err != nil {
    29  			return err
    30  		}
    31  	}
    32  	plural := "s"
    33  	if numFiles == 1 {
    34  		plural = ""
    35  	}
    36  	t.params.Logger.Printf("GetFiles(): %d file%s provided\n", numFiles, plural)
    37  	return nil
    38  }
    39  
    40  func (t *rpcType) getFile(conn *srpc.Conn, filename string) error {
    41  	var file *os.File
    42  	var err error
    43  	t.params.WorkdirGoroutine.Run(func() { file, err = os.Open(filename) })
    44  	var response sub.GetFileResponse
    45  	if err != nil {
    46  		response.Error = err.Error()
    47  	} else {
    48  		defer file.Close()
    49  		if fi, err := file.Stat(); err != nil {
    50  			response.Error = err.Error()
    51  		} else {
    52  			response.Size = uint64(fi.Size())
    53  		}
    54  	}
    55  	if err := conn.Encode(response); err != nil {
    56  		return err
    57  	}
    58  	if response.Error != "" {
    59  		return nil
    60  	}
    61  	_, err = io.Copy(conn, bufio.NewReader(file))
    62  	return err
    63  }