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 }