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 }