(configuration server.Configuration, pidToNotify int)
| 81 | } |
| 82 | |
| 83 | func daemonProc(configuration server.Configuration, pidToNotify int) { |
| 84 | err := os.Chdir("/") |
| 85 | verifyFatal(err) |
| 86 | |
| 87 | log.SetPrefix(fmt.Sprintf("%v ", os.Getpid())) |
| 88 | log.Printf("Starting daemon. Version: %q", Version) |
| 89 | |
| 90 | lockFileName := configuration.GetLockFile() |
| 91 | lockFileFd, err := unix.Open(lockFileName, os.O_CREATE|os.O_RDWR, 0600) |
| 92 | verifyFatal(err) |
| 93 | |
| 94 | pidStr := []byte(strconv.Itoa(os.Getpid())) |
| 95 | _, err = unix.Write(lockFileFd, pidStr) |
| 96 | if err != nil { |
| 97 | log.Panic(fmt.Errorf("cannot write to %s: %w", lockFileName, err)) |
| 98 | } |
| 99 | |
| 100 | log.Printf("Locking file: %s", lockFileName) |
| 101 | err = unix.Flock(lockFileFd, unix.LOCK_EX|unix.LOCK_NB) |
| 102 | if err != nil { |
| 103 | log.Panic(fmt.Errorf("cannot lock file %s: %w", lockFileName, err)) |
| 104 | } |
| 105 | |
| 106 | log.Printf("Removing old unix socket") |
| 107 | socketFile := configuration.GetSocketFile() |
| 108 | err = cleanFile(socketFile) |
| 109 | if err != nil { |
| 110 | log.Panic(fmt.Errorf("cannot remove %s: %w", socketFile, err)) |
| 111 | } |
| 112 | |
| 113 | log.Printf("Launching server") |
| 114 | s, err := server.NewServer(&configuration) |
| 115 | verifyFatal(err) |
| 116 | defer func() { |
| 117 | err = s.Close() |
| 118 | verifyFatal(err) |
| 119 | }() |
| 120 | |
| 121 | if pidToNotify != 0 { |
| 122 | err = unix.Kill(pidToNotify, unix.SIGUSR1) |
| 123 | } |
| 124 | |
| 125 | err = s.Serve() |
| 126 | verifyFatal(err) |
| 127 | |
| 128 | log.Printf("Daemon is exiting normally") |
| 129 | os.Exit(0) |
| 130 | } |
| 131 | |
| 132 | func forkedDaemonMain(pidToNotify int) { |
| 133 | configuration, err := server.DefaultConfiguration() |
no test coverage detected