github.com/cloud-foundations/dominator@v0.0.0-20221004181915-6e4fee580046/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.rootDir, filename)
    28  		if err := processFilename(conn, filename); err != nil {
    29  			return err
    30  		}
    31  	}
    32  	plural := "s"
    33  	if numFiles == 1 {
    34  		plural = ""
    35  	}
    36  	t.logger.Printf("GetFiles(): %d file%s provided\n", numFiles, plural)
    37  	return nil
    38  }
    39  
    40  func processFilename(conn *srpc.Conn, filename string) error {
    41  	file, err := os.Open(filename)
    42  	var response sub.GetFileResponse
    43  	if err != nil {
    44  		response.Error = err
    45  	} else {
    46  		defer file.Close()
    47  		if fi, err := file.Stat(); err != nil {
    48  			response.Error = err
    49  		} else {
    50  			response.Size = uint64(fi.Size())
    51  		}
    52  	}
    53  	if err := conn.Encode(response); err != nil {
    54  		return err
    55  	}
    56  	if response.Error != nil {
    57  		return nil
    58  	}
    59  	_, err = io.Copy(conn, bufio.NewReader(file))
    60  	return err
    61  }