update xds-server package in docker
[src/xds/xds-server.git] / lib / xdsserver / apiv1-exec.go
index 327c4c5..c045e9e 100644 (file)
@@ -152,14 +152,17 @@ func (s *APIService) execCmd(c *gin.Context) {
 
        // Define callback for input (stdin)
        execWS.InputEvent = xsapiv1.ExecInEvent
-       execWS.InputCB = func(e *eows.ExecOverWS, stdin string) (string, error) {
+       execWS.InputCB = func(e *eows.ExecOverWS, bStdin []byte) ([]byte, error) {
+
+               stdin := string(bStdin)
+
                s.Log.Debugf("STDIN <<%v>>", strings.Replace(stdin, "\n", "\\n", -1))
 
                // Handle Ctrl-D
                if len(stdin) == 1 && stdin == "\x04" {
                        // Close stdin
                        errMsg := fmt.Errorf("close stdin: %v", stdin)
-                       return "", errMsg
+                       return []byte{}, errMsg
                }
 
                // Set correct path
@@ -172,12 +175,15 @@ func (s *APIService) execCmd(c *gin.Context) {
                        // Translate paths from client to server
                        stdin = (*f).ConvPathCli2Svr(stdin)
                }
-
-               return stdin, nil
+               return []byte(stdin), nil
        }
 
        // Define callback for output (stdout+stderr)
-       execWS.OutputCB = func(e *eows.ExecOverWS, stdout, stderr string) {
+       execWS.OutputCB = func(e *eows.ExecOverWS, bStdout, bStderr []byte) {
+
+               stdout := string(bStdout)
+               stderr := string(bStderr)
+
                // IO socket can be nil when disconnected
                so := s.sessions.IOSocketGet(e.Sid)
                if so == nil {
@@ -308,6 +314,9 @@ func (s *APIService) execCmd(c *gin.Context) {
                if errSoEmit != nil {
                        s.Log.Errorf("WS Emit : %v", errSoEmit)
                }
+               s.lock.Lock()
+               s.lock.LockCpt--
+               s.lock.Unlock()
        }
 
        // User data (used within callbacks)
@@ -324,8 +333,14 @@ func (s *APIService) execCmd(c *gin.Context) {
        // Start command execution
        s.Log.Infof("Execute [Cmd ID %s]: %v %v", execWS.CmdID, execWS.Cmd, execWS.Args)
 
+       s.lock.Lock()
+       s.lock.LockCpt++
+       s.lock.Unlock()
        err = execWS.Start()
        if err != nil {
+               s.lock.Lock()
+               s.lock.LockCpt--
+               s.lock.Unlock()
                common.APIError(c, err.Error())
                return
        }