63 lines
		
	
	
		
			1004 B
		
	
	
	
		
			Go
		
	
	
			
		
		
	
	
			63 lines
		
	
	
		
			1004 B
		
	
	
	
		
			Go
		
	
	
// +build !windows
 | 
						|
 | 
						|
package panicwrap
 | 
						|
 | 
						|
import (
 | 
						|
	"github.com/bugsnag/osext"
 | 
						|
	"os"
 | 
						|
	"os/exec"
 | 
						|
)
 | 
						|
 | 
						|
func monitor(c *WrapConfig) (int, error) {
 | 
						|
 | 
						|
	// If we're the child process, absorb panics.
 | 
						|
	if Wrapped(c) {
 | 
						|
		panicCh := make(chan string)
 | 
						|
 | 
						|
		go trackPanic(os.Stdin, os.Stderr, c.DetectDuration, panicCh)
 | 
						|
 | 
						|
		// Wait on the panic data
 | 
						|
		panicTxt := <-panicCh
 | 
						|
		if panicTxt != "" {
 | 
						|
			if !c.HidePanic {
 | 
						|
				os.Stderr.Write([]byte(panicTxt))
 | 
						|
			}
 | 
						|
 | 
						|
			c.Handler(panicTxt)
 | 
						|
		}
 | 
						|
 | 
						|
		os.Exit(0)
 | 
						|
	}
 | 
						|
 | 
						|
	exePath, err := osext.Executable()
 | 
						|
	if err != nil {
 | 
						|
		return -1, err
 | 
						|
	}
 | 
						|
	cmd := exec.Command(exePath, os.Args[1:]...)
 | 
						|
 | 
						|
	read, write, err := os.Pipe()
 | 
						|
	if err != nil {
 | 
						|
		return -1, err
 | 
						|
	}
 | 
						|
 | 
						|
	cmd.Stdin = read
 | 
						|
	cmd.Stdout = os.Stdout
 | 
						|
	cmd.Stderr = os.Stderr
 | 
						|
	cmd.Env = append(os.Environ(), c.CookieKey+"="+c.CookieValue)
 | 
						|
 | 
						|
	if err != nil {
 | 
						|
		return -1, err
 | 
						|
	}
 | 
						|
	err = cmd.Start()
 | 
						|
	if err != nil {
 | 
						|
		return -1, err
 | 
						|
	}
 | 
						|
 | 
						|
	err = dup2(int(write.Fd()), int(os.Stderr.Fd()))
 | 
						|
	if err != nil {
 | 
						|
		return -1, err
 | 
						|
	}
 | 
						|
 | 
						|
	return -1, nil
 | 
						|
}
 |