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  }