package main import ( "context" "encoding/json" "os" "os/exec" "syscall" "hakurei.app/hst" "hakurei.app/message" ) // run starts a container via cmd/hakurei and returns after it terminates. func run(ctx context.Context, msg message.Msg, config *hst.Config) error { c, cancel := context.WithCancel(ctx) defer cancel() cmd := exec.CommandContext(c, "hakurei") cmd.Stdin, cmd.Stdout, cmd.Stderr = os.Stdin, os.Stdout, os.Stderr cmd.Cancel = func() error { return cmd.Process.Signal(syscall.SIGINT) } if msg.IsVerbose() { cmd.Args = append(cmd.Args, "-v") } cmd.Args = append(cmd.Args, "run", "3") r, w, err := os.Pipe() if err != nil { return err } cmd.ExtraFiles = append(cmd.ExtraFiles, r) if err = cmd.Start(); err != nil { _, _ = r.Close(), w.Close() return err } if err = r.Close(); err != nil { _ = w.Close() return err } else if err = json.NewEncoder(w).Encode(&config); err != nil { _ = w.Close() return err } else if err = w.Close(); err != nil { return err } return cmd.Wait() }