Lines Matching refs:state
169 struct daemon_state state; in main() local
171 daemon_state_init(&state); in main()
197 state.keep_cur_workdir = 0; in main()
200 state.keep_fds_open = 0; in main()
203 state.log_reopen = true; in main()
206 state.syslog_facility = get_log_mapping(optarg, in main()
208 if (state.syslog_facility == -1) { in main()
211 state.syslog_enabled = true; in main()
212 state.mode = MODE_SUPERVISE; in main()
215 state.stdmask = strtol(optarg, &p, 10); in main()
216 if (p == optarg || state.stdmask < 0 || state.stdmask > 3) { in main()
221 state.output_filename = optarg; in main()
228 state.mode = MODE_SUPERVISE; in main()
231 state.child_pidfile = optarg; in main()
232 state.mode = MODE_SUPERVISE; in main()
235 state.parent_pidfile = optarg; in main()
236 state.mode = MODE_SUPERVISE; in main()
239 state.restart_enabled = true; in main()
240 state.mode = MODE_SUPERVISE; in main()
243 state.restart_enabled = true; in main()
244 state.restart_delay = strtol(optarg, &p, 0); in main()
245 if (p == optarg || state.restart_delay < 1) { in main()
248 state.mode = MODE_SUPERVISE; in main()
251 state.syslog_priority = get_log_mapping(optarg, in main()
253 if (state.syslog_priority == -1) { in main()
256 state.syslog_enabled = true; in main()
257 state.mode = MODE_SUPERVISE; in main()
260 state.syslog_enabled = true; in main()
261 state.mode = MODE_SUPERVISE; in main()
264 state.title = optarg; in main()
267 state.syslog_tag = optarg; in main()
268 state.syslog_enabled = true; in main()
269 state.mode = MODE_SUPERVISE; in main()
272 state.user = optarg; in main()
283 state.argv = argv; in main()
289 if (!state.title) { in main()
290 state.title = argv[0]; in main()
293 if (state.output_filename) { in main()
294 state.output_fd = open_log(state.output_filename); in main()
295 if (state.output_fd == -1) { in main()
300 if (state.syslog_enabled) { in main()
301 openlog(state.syslog_tag, LOG_PID | LOG_NDELAY, in main()
302 state.syslog_facility); in main()
309 open_pid_files(&state); in main()
315 if (daemon(state.keep_cur_workdir, state.keep_fds_open) == -1) { in main()
317 daemon_terminate(&state); in main()
320 if (state.mode == MODE_DAEMON) { in main()
321 daemon_exec(&state); in main()
325 pidfile_write(state.parent_pidfh); in main()
327 state.kqueue_fd = daemon_setup_kqueue(); in main()
330 state.mode = MODE_SUPERVISE; in main()
331 daemon_eventloop(&state); in main()
332 daemon_sleep(&state); in main()
333 } while (state.restart_enabled); in main()
335 daemon_terminate(&state); in main()
339 daemon_exec(struct daemon_state *state) in daemon_exec() argument
341 pidfile_write(state->child_pidfh); in daemon_exec()
343 if (state->user != NULL) { in daemon_exec()
344 restrict_process(state->user); in daemon_exec()
350 execvp(state->argv[0], state->argv); in daemon_exec()
352 err(1, "%s", state->argv[0]); in daemon_exec()
367 daemon_eventloop(struct daemon_state *state) in daemon_eventloop() argument
380 if (pipe(state->pipe_fd)) { in daemon_eventloop()
384 kq = state->kqueue_fd; in daemon_eventloop()
385 EV_SET(&event, state->pipe_fd[0], EVFILT_READ, EV_ADD|EV_CLEAR, 0, 0, in daemon_eventloop()
394 state->pid = fork(); in daemon_eventloop()
397 switch (state->pid) { in daemon_eventloop()
400 state->mode = MODE_NOCHILD; in daemon_eventloop()
405 daemon_set_child_pipe(state); in daemon_eventloop()
406 daemon_exec(state); in daemon_eventloop()
411 close(state->pipe_fd[1]); in daemon_eventloop()
412 state->pipe_fd[1] = -1; in daemon_eventloop()
413 setproctitle("%s[%d]", state->title, (int)state->pid); in daemon_eventloop()
416 while (state->mode != MODE_NOCHILD) { in daemon_eventloop()
437 if (daemon_is_child_dead(state)) { in daemon_eventloop()
439 state->pid = -1; in daemon_eventloop()
440 state->mode = MODE_NOCHILD; in daemon_eventloop()
441 while (listen_child(state->pipe_fd[0], in daemon_eventloop()
442 state)) in daemon_eventloop()
447 if (state->mode != MODE_SUPERVISE) { in daemon_eventloop()
453 state->mode = MODE_TERMINATING; in daemon_eventloop()
454 state->restart_enabled = false; in daemon_eventloop()
455 if (state->pid > 0) { in daemon_eventloop()
456 kill(state->pid, SIGTERM); in daemon_eventloop()
464 if (state->log_reopen && state->output_fd >= 0) { in daemon_eventloop()
465 reopen_log(state); in daemon_eventloop()
479 (void)listen_child(state->pipe_fd[0], state); in daemon_eventloop()
489 close(state->pipe_fd[0]); in daemon_eventloop()
490 state->pipe_fd[0] = -1; in daemon_eventloop()
498 daemon_sleep(struct daemon_state *state) in daemon_sleep() argument
503 assert(state->pipe_fd[0] == -1); in daemon_sleep()
504 assert(state->pipe_fd[1] == -1); in daemon_sleep()
506 if (!state->restart_enabled) { in daemon_sleep()
511 state->restart_delay, NULL); in daemon_sleep()
512 if (kevent(state->kqueue_fd, &event, 1, NULL, 0, NULL) == -1) { in daemon_sleep()
517 ret = kevent(state->kqueue_fd, NULL, 0, &event, 1, NULL); in daemon_sleep()
546 state->restart_enabled = false; in daemon_sleep()
549 if (state->log_reopen && state->output_fd >= 0) { in daemon_sleep()
550 reopen_log(state); in daemon_sleep()
562 assert(state->restart_enabled); in daemon_sleep()
566 open_pid_files(struct daemon_state *state) in open_pid_files() argument
571 if (state->child_pidfile) { in open_pid_files()
572 state->child_pidfh = pidfile_open(state->child_pidfile, 0600, &fpid); in open_pid_files()
573 if (state->child_pidfh == NULL) { in open_pid_files()
578 err(2, "pidfile ``%s''", state->child_pidfile); in open_pid_files()
582 if (state->parent_pidfile) { in open_pid_files()
583 state->parent_pidfh= pidfile_open(state->parent_pidfile, 0600, &fpid); in open_pid_files()
584 if (state->parent_pidfh == NULL) { in open_pid_files()
586 pidfile_remove(state->child_pidfh); in open_pid_files()
592 err(2, "ppidfile ``%s''", state->parent_pidfile); in open_pid_files()
637 listen_child(int fd, struct daemon_state *state) in listen_child() argument
643 assert(state != NULL); in listen_child()
661 do_output(buf, bytes_line, state); in listen_child()
669 do_output(buf, bytes_read, state); in listen_child()
683 do_output(buf, bytes_read, state); in listen_child()
695 do_output(const unsigned char *buf, size_t len, struct daemon_state *state) in do_output() argument
698 assert(state != NULL); in do_output()
703 if (state->syslog_enabled) { in do_output()
704 syslog(state->syslog_priority, "%.*s", (int)len, buf); in do_output()
706 if (state->output_fd != -1) { in do_output()
707 if (write(state->output_fd, buf, len) == -1) in do_output()
710 if (state->keep_fds_open && in do_output()
711 !state->syslog_enabled && in do_output()
712 state->output_fd == -1) { in do_output()
725 reopen_log(struct daemon_state *state) in reopen_log() argument
729 outfd = open_log(state->output_filename); in reopen_log()
730 if (state->output_fd >= 0) { in reopen_log()
731 close(state->output_fd); in reopen_log()
733 state->output_fd = outfd; in reopen_log()
737 daemon_state_init(struct daemon_state *state) in daemon_state_init() argument
739 *state = (struct daemon_state) { in daemon_state_init()
767 daemon_terminate(struct daemon_state *state) in daemon_terminate() argument
769 assert(state != NULL); in daemon_terminate()
771 if (state->kqueue_fd >= 0) { in daemon_terminate()
772 close(state->kqueue_fd); in daemon_terminate()
774 if (state->output_fd >= 0) { in daemon_terminate()
775 close(state->output_fd); in daemon_terminate()
777 if (state->pipe_fd[0] >= 0) { in daemon_terminate()
778 close(state->pipe_fd[0]); in daemon_terminate()
781 if (state->pipe_fd[1] >= 0) { in daemon_terminate()
782 close(state->pipe_fd[1]); in daemon_terminate()
784 if (state->syslog_enabled) { in daemon_terminate()
787 pidfile_remove(state->child_pidfh); in daemon_terminate()
788 pidfile_remove(state->parent_pidfh); in daemon_terminate()
802 daemon_is_child_dead(struct daemon_state *state) in daemon_is_child_dead() argument
808 if (state->pid == who && (WIFEXITED(status) || in daemon_is_child_dead()
823 daemon_set_child_pipe(struct daemon_state *state) in daemon_set_child_pipe() argument
825 if (state->stdmask & STDERR_FILENO) { in daemon_set_child_pipe()
826 if (dup2(state->pipe_fd[1], STDERR_FILENO) == -1) { in daemon_set_child_pipe()
830 if (state->stdmask & STDOUT_FILENO) { in daemon_set_child_pipe()
831 if (dup2(state->pipe_fd[1], STDOUT_FILENO) == -1) { in daemon_set_child_pipe()
835 if (state->pipe_fd[1] != STDERR_FILENO && in daemon_set_child_pipe()
836 state->pipe_fd[1] != STDOUT_FILENO) { in daemon_set_child_pipe()
837 close(state->pipe_fd[1]); in daemon_set_child_pipe()
841 close(state->pipe_fd[0]); in daemon_set_child_pipe()