github.com/pf-qiu/concourse/v6@v6.7.3-0.20201207032516-1f455d73275f/atc/worker/gclient/connection/process_stream.go (about) 1 package connection 2 3 import ( 4 "net" 5 "sync" 6 7 "code.cloudfoundry.org/garden" 8 "code.cloudfoundry.org/garden/transport" 9 ) 10 11 type processStream struct { 12 processID string 13 conn net.Conn 14 15 sync.Mutex 16 } 17 18 func (s *processStream) Write(data []byte) (int, error) { 19 d := string(data) 20 stdin := transport.Stdin 21 return len(data), s.sendPayload(transport.ProcessPayload{ 22 ProcessID: s.processID, 23 Source: &stdin, 24 Data: &d, 25 }) 26 } 27 28 func (s *processStream) Close() error { 29 stdin := transport.Stdin 30 return s.sendPayload(transport.ProcessPayload{ 31 ProcessID: s.processID, 32 Source: &stdin, 33 }) 34 } 35 36 func (s *processStream) SetTTY(spec garden.TTYSpec) error { 37 return s.sendPayload(&transport.ProcessPayload{ 38 ProcessID: s.processID, 39 TTY: &spec, 40 }) 41 } 42 43 func (s *processStream) Signal(signal garden.Signal) error { 44 return s.sendPayload(&transport.ProcessPayload{ 45 ProcessID: s.processID, 46 Signal: &signal, 47 }) 48 } 49 50 func (s *processStream) sendPayload(payload interface{}) error { 51 s.Lock() 52 53 err := transport.WriteMessage(s.conn, payload) 54 if err != nil { 55 s.Unlock() 56 return err 57 } 58 59 s.Unlock() 60 61 return nil 62 } 63 64 func (s *processStream) ProcessID() string { 65 return s.processID 66 }