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 }