github.com/lmorg/murex@v0.0.0-20240217211045-e081c89cd4ef/builtins/core/processes/bgfg_unix.go (about)

     1  //go:build !windows && !plan9 && !js
     2  // +build !windows,!plan9,!js
     3  
     4  package processes
     5  
     6  import (
     7  	"errors"
     8  	"syscall"
     9  
    10  	"github.com/lmorg/murex/lang"
    11  	"github.com/lmorg/murex/lang/state"
    12  	"github.com/lmorg/murex/lang/types"
    13  )
    14  
    15  func mkbg(p *lang.Process) error {
    16  	fid, err := p.Parameters.Uint32(0)
    17  	if err != nil {
    18  		return errors.New("invalid parameters. Expecting either a code block or FID of a stopped process")
    19  	}
    20  
    21  	f, err := lang.GlobalFIDs.Proc(fid)
    22  	if err != nil {
    23  		return err
    24  	}
    25  
    26  	if f.State.Get() != state.Stopped {
    27  		return errors.New("FID is not a stopped process. Run `jobs` or `fid-list` to see a list of stopped processes")
    28  	}
    29  
    30  	pid, cmd := f.Exec.Get()
    31  	if pid > 0 && cmd != nil {
    32  		err = cmd.Process.Signal(syscall.SIGCONT)
    33  		if err != nil {
    34  			return err
    35  		}
    36  	}
    37  	go unstop(f)
    38  
    39  	updateTree(f, true)
    40  
    41  	f.State.Set(state.Executing)
    42  
    43  	lang.ShowPrompt <- true
    44  	return nil
    45  }
    46  
    47  func cmdForeground(p *lang.Process) error {
    48  	p.Stdout.SetDataType(types.Null)
    49  
    50  	fid, err := p.Parameters.Uint32(0)
    51  	if err != nil {
    52  		return err
    53  	}
    54  
    55  	f, err := lang.GlobalFIDs.Proc(fid)
    56  	if err != nil {
    57  		return err
    58  	}
    59  
    60  	lang.HidePrompt <- true
    61  
    62  	pid, cmd := f.Exec.Get()
    63  	if pid > 0 && cmd != nil {
    64  		err = cmd.Process.Signal(syscall.SIGCONT)
    65  		if err != nil {
    66  			return err
    67  		}
    68  	}
    69  	go unstop(f)
    70  
    71  	updateTree(f, false)
    72  
    73  	lang.ForegroundProc.Set(f)
    74  
    75  	f.State.Set(state.Executing)
    76  	<-f.Context.Done()
    77  	return nil
    78  }
    79  
    80  func unstop(p *lang.Process) {
    81  	p.WaitForStopped <- true
    82  }