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 }