+++ /dev/null
-package main
-
-import (
- "os"
-)
-
-func Daemonize(attr *os.ProcAttr) error {
- path, err := os.Executable()
- if err != nil {
- return err
- }
-
- argv := []string{os.Args[0], "--foreground"}
- argv = append(argv, os.Args[1:]...)
- process, err := os.StartProcess(
- path,
- argv,
- attr,
- )
- if err != nil {
- return err
- }
- process.Release()
- return nil
-}
"fmt"
"os"
"os/signal"
- "runtime"
"strconv"
)
const (
ENV_WG_TUN_FD = "WG_TUN_FD"
ENV_WG_UAPI_FD = "WG_UAPI_FD"
+ ENV_WG_PROCESS_FOREGROUND = "WG_PROCESS_FOREGROUND"
)
func printUsage() {
interfaceName = os.Args[1]
}
+ if !foreground {
+ foreground = os.Getenv(ENV_WG_PROCESS_FOREGROUND) == "1"
+ }
+
// get log level (default: info)
logLevel := func() int {
env := os.Environ()
env = append(env, fmt.Sprintf("%s=3", ENV_WG_TUN_FD))
env = append(env, fmt.Sprintf("%s=4", ENV_WG_UAPI_FD))
+ env = append(env, fmt.Sprintf("%s=1", ENV_WG_PROCESS_FOREGROUND))
attr := &os.ProcAttr{
Files: []*os.File{
nil, // stdin
Dir: ".",
Env: env,
}
- err = Daemonize(attr)
+
+ path, err := os.Executable()
+ if err != nil {
+ logger.Error.Println("Failed to determine executable:", err)
+ os.Exit(ExitSetupFailed)
+ }
+
+ process, err := os.StartProcess(
+ path,
+ os.Args,
+ attr,
+ )
if err != nil {
logger.Error.Println("Failed to daemonize:", err)
os.Exit(ExitSetupFailed)
}
+ process.Release()
return
}
- // increase number of go workers (for Go <1.5)
-
- runtime.GOMAXPROCS(runtime.NumCPU())
-
// create wireguard device
device := NewDevice(tun, logger)