(config *server.Configuration)
| 167 | } |
| 168 | |
| 169 | func daemonize(config *server.Configuration) (err error) { |
| 170 | checkDaemonIsRunning := func() (isRunning bool, err error) { |
| 171 | var fd int |
| 172 | fd, err = unix.Open(config.GetLockFile(), os.O_RDONLY, 0600) |
| 173 | if errors.Is(err, os.ErrNotExist) { |
| 174 | err = nil |
| 175 | isRunning = false |
| 176 | return |
| 177 | } else if err != nil { |
| 178 | return |
| 179 | } |
| 180 | |
| 181 | defer func() { |
| 182 | err = unix.Close(fd) |
| 183 | }() |
| 184 | err = unix.Flock(fd, unix.LOCK_EX|unix.LOCK_NB) |
| 185 | if errors.Is(err, unix.EWOULDBLOCK) { |
| 186 | err = nil |
| 187 | isRunning = true |
| 188 | return |
| 189 | } else if err != nil { |
| 190 | return |
| 191 | } |
| 192 | isRunning = false |
| 193 | err = unix.Flock(fd, unix.LOCK_UN) |
| 194 | return |
| 195 | } |
| 196 | |
| 197 | var isRunning bool |
| 198 | isRunning, err = checkDaemonIsRunning() |
| 199 | if err != nil { |
| 200 | return |
| 201 | } |
| 202 | if isRunning { |
| 203 | return |
| 204 | } |
| 205 | |
| 206 | var executable string |
| 207 | executable, err = os.Executable() |
| 208 | if err != nil { |
| 209 | return |
| 210 | } |
| 211 | cmd := exec.Command(executable, "daemon") |
| 212 | err = cmd.Run() |
| 213 | if err != nil { |
| 214 | err = fmt.Errorf("\"%s daemonize\" error: %w", executable, err) |
| 215 | } |
| 216 | return |
| 217 | } |
no test coverage detected