Lines Matching refs:state

183 	struct daemon_state state;  in main()  local
185 daemon_state_init(&state); in main()
211 state.keep_cur_workdir = 0; in main()
214 state.restart_count = (int)strtonum(optarg, 0, in main()
221 state.keep_fds_open = 0; in main()
224 state.log_reopen = true; in main()
227 state.syslog_facility = get_log_mapping(optarg, in main()
229 if (state.syslog_facility == -1) { in main()
232 state.syslog_enabled = true; in main()
233 state.mode = MODE_SUPERVISE; in main()
236 state.stdmask = (int)strtonum(optarg, 0, 3, &e); in main()
242 state.output_filename = optarg; in main()
249 state.mode = MODE_SUPERVISE; in main()
252 state.child_pidfile = optarg; in main()
253 state.mode = MODE_SUPERVISE; in main()
256 state.parent_pidfile = optarg; in main()
257 state.mode = MODE_SUPERVISE; in main()
260 state.restart_enabled = true; in main()
261 state.mode = MODE_SUPERVISE; in main()
264 state.restart_enabled = true; in main()
265 state.restart_delay = (int)strtonum(optarg, 1, in main()
270 state.mode = MODE_SUPERVISE; in main()
273 state.syslog_priority = get_log_mapping(optarg, in main()
275 if (state.syslog_priority == -1) { in main()
278 state.syslog_enabled = true; in main()
279 state.mode = MODE_SUPERVISE; in main()
282 state.syslog_enabled = true; in main()
283 state.mode = MODE_SUPERVISE; in main()
286 state.title = optarg; in main()
289 state.syslog_tag = optarg; in main()
290 state.syslog_enabled = true; in main()
291 state.mode = MODE_SUPERVISE; in main()
294 state.user = optarg; in main()
305 state.argv = argv; in main()
311 if (!state.title) { in main()
312 state.title = argv[0]; in main()
315 if (state.output_filename) { in main()
316 state.output_fd = open_log(state.output_filename); in main()
317 if (state.output_fd == -1) { in main()
322 if (state.syslog_enabled) { in main()
323 openlog(state.syslog_tag, LOG_PID | LOG_NDELAY, in main()
324 state.syslog_facility); in main()
331 open_pid_files(&state); in main()
337 if (daemon(state.keep_cur_workdir, state.keep_fds_open) == -1) { in main()
339 daemon_terminate(&state); in main()
342 if (state.mode == MODE_DAEMON) { in main()
343 daemon_exec(&state); in main()
347 pidfile_write(state.parent_pidfh); in main()
349 state.kqueue_fd = daemon_setup_kqueue(); in main()
352 state.mode = MODE_SUPERVISE; in main()
353 daemon_eventloop(&state); in main()
354 daemon_sleep(&state); in main()
355 if (state.restart_enabled && state.restart_count > -1) { in main()
356 if (state.restarted_count >= state.restart_count) { in main()
357 state.restart_enabled = false; in main()
359 state.restarted_count++; in main()
361 } while (state.restart_enabled); in main()
363 daemon_terminate(&state); in main()
367 daemon_exec(struct daemon_state *state) in daemon_exec() argument
369 pidfile_write(state->child_pidfh); in daemon_exec()
371 if (state->user != NULL) { in daemon_exec()
372 restrict_process(state->user); in daemon_exec()
378 execvp(state->argv[0], state->argv); in daemon_exec()
380 err(1, "%s", state->argv[0]); in daemon_exec()
395 daemon_eventloop(struct daemon_state *state) in daemon_eventloop() argument
412 state->pipe_rd = pipe_fd[0]; in daemon_eventloop()
413 state->pipe_wr = pipe_fd[1]; in daemon_eventloop()
415 kq = state->kqueue_fd; in daemon_eventloop()
416 EV_SET(&event, state->pipe_rd, EVFILT_READ, EV_ADD|EV_CLEAR, 0, 0, in daemon_eventloop()
425 state->pid = fork(); in daemon_eventloop()
428 switch (state->pid) { in daemon_eventloop()
431 state->mode = MODE_NOCHILD; in daemon_eventloop()
436 daemon_set_child_pipe(state); in daemon_eventloop()
437 daemon_exec(state); in daemon_eventloop()
442 close(state->pipe_wr); in daemon_eventloop()
443 state->pipe_wr = -1; in daemon_eventloop()
444 setproctitle("%s[%d]", state->title, (int)state->pid); in daemon_eventloop()
447 while (state->mode != MODE_NOCHILD) { in daemon_eventloop()
468 if (daemon_is_child_dead(state)) { in daemon_eventloop()
470 state->pid = -1; in daemon_eventloop()
471 state->mode = MODE_NOCHILD; in daemon_eventloop()
472 while (listen_child(state)) { in daemon_eventloop()
478 if (state->mode != MODE_SUPERVISE) { in daemon_eventloop()
484 state->mode = MODE_TERMINATING; in daemon_eventloop()
485 state->restart_enabled = false; in daemon_eventloop()
486 if (state->pid > 0) { in daemon_eventloop()
487 kill(state->pid, SIGTERM); in daemon_eventloop()
495 if (state->log_reopen && state->output_fd >= 0) { in daemon_eventloop()
496 reopen_log(state); in daemon_eventloop()
510 (void)listen_child(state); in daemon_eventloop()
520 close(state->pipe_rd); in daemon_eventloop()
521 state->pipe_rd = -1; in daemon_eventloop()
528 if (state->child_pidfh != NULL && state->restart_enabled) { in daemon_eventloop()
529 pidfile_truncate(state->child_pidfh); in daemon_eventloop()
538 daemon_sleep(struct daemon_state *state) in daemon_sleep() argument
543 assert(state->pipe_rd == -1); in daemon_sleep()
544 assert(state->pipe_wr == -1); in daemon_sleep()
546 if (!state->restart_enabled) { in daemon_sleep()
551 state->restart_delay, NULL); in daemon_sleep()
552 if (kevent(state->kqueue_fd, &event, 1, NULL, 0, NULL) == -1) { in daemon_sleep()
557 ret = kevent(state->kqueue_fd, NULL, 0, &event, 1, NULL); in daemon_sleep()
586 state->restart_enabled = false; in daemon_sleep()
589 if (state->log_reopen && state->output_fd >= 0) { in daemon_sleep()
590 reopen_log(state); in daemon_sleep()
602 assert(state->restart_enabled); in daemon_sleep()
606 open_pid_files(struct daemon_state *state) in open_pid_files() argument
611 if (state->child_pidfile) { in open_pid_files()
612 state->child_pidfh = pidfile_open(state->child_pidfile, 0600, &fpid); in open_pid_files()
613 if (state->child_pidfh == NULL) { in open_pid_files()
618 err(2, "pidfile ``%s''", state->child_pidfile); in open_pid_files()
622 if (state->parent_pidfile) { in open_pid_files()
623 state->parent_pidfh= pidfile_open(state->parent_pidfile, 0600, &fpid); in open_pid_files()
624 if (state->parent_pidfh == NULL) { in open_pid_files()
626 pidfile_remove(state->child_pidfh); in open_pid_files()
632 err(2, "ppidfile ``%s''", state->parent_pidfile); in open_pid_files()
675 listen_child(struct daemon_state *state) in listen_child() argument
680 assert(state != NULL); in listen_child()
681 assert(state->pos < LBUF_SIZE - 1); in listen_child()
683 rv = read(state->pipe_rd, state->buf + state->pos, in listen_child()
684 LBUF_SIZE - state->pos - 1); in listen_child()
686 state->pos += rv; in listen_child()
687 assert(state->pos <= LBUF_SIZE - 1); in listen_child()
689 state->buf[LBUF_SIZE - 1] = '\0'; in listen_child()
698 cp = memrchr(state->buf, '\n', state->pos); in listen_child()
700 size_t bytes_line = cp - state->buf + 1; in listen_child()
701 assert(bytes_line <= state->pos); in listen_child()
702 do_output(state->buf, bytes_line, state); in listen_child()
703 state->pos -= bytes_line; in listen_child()
704 memmove(state->buf, cp + 1, state->pos); in listen_child()
707 if (state->pos < LBUF_SIZE - 1) { in listen_child()
710 do_output(state->buf, state->pos, state); in listen_child()
711 state->pos = 0; in listen_child()
723 if (state->pos > 0) { in listen_child()
724 do_output(state->buf, state->pos, state); in listen_child()
725 state->pos = 0; in listen_child()
736 do_output(const unsigned char *buf, size_t len, struct daemon_state *state) in do_output() argument
739 assert(state != NULL); in do_output()
744 if (state->syslog_enabled) { in do_output()
745 syslog(state->syslog_priority, "%.*s", (int)len, buf); in do_output()
747 if (state->output_fd != -1) { in do_output()
748 if (write(state->output_fd, buf, len) == -1) in do_output()
751 if (state->keep_fds_open && in do_output()
752 !state->syslog_enabled && in do_output()
753 state->output_fd == -1) { in do_output()
766 reopen_log(struct daemon_state *state) in reopen_log() argument
770 outfd = open_log(state->output_filename); in reopen_log()
771 if (state->output_fd >= 0) { in reopen_log()
772 close(state->output_fd); in reopen_log()
774 state->output_fd = outfd; in reopen_log()
778 daemon_state_init(struct daemon_state *state) in daemon_state_init() argument
780 *state = (struct daemon_state) { in daemon_state_init()
813 daemon_terminate(struct daemon_state *state) in daemon_terminate() argument
815 assert(state != NULL); in daemon_terminate()
817 if (state->kqueue_fd >= 0) { in daemon_terminate()
818 close(state->kqueue_fd); in daemon_terminate()
820 if (state->output_fd >= 0) { in daemon_terminate()
821 close(state->output_fd); in daemon_terminate()
823 if (state->pipe_rd >= 0) { in daemon_terminate()
824 close(state->pipe_rd); in daemon_terminate()
827 if (state->pipe_wr >= 0) { in daemon_terminate()
828 close(state->pipe_wr); in daemon_terminate()
830 if (state->syslog_enabled) { in daemon_terminate()
833 pidfile_remove(state->child_pidfh); in daemon_terminate()
834 pidfile_remove(state->parent_pidfh); in daemon_terminate()
848 daemon_is_child_dead(struct daemon_state *state) in daemon_is_child_dead() argument
854 if (state->pid == who && (WIFEXITED(status) || in daemon_is_child_dead()
869 daemon_set_child_pipe(struct daemon_state *state) in daemon_set_child_pipe() argument
871 if (state->stdmask & STDERR_FILENO) { in daemon_set_child_pipe()
872 if (dup2(state->pipe_wr, STDERR_FILENO) == -1) { in daemon_set_child_pipe()
876 if (state->stdmask & STDOUT_FILENO) { in daemon_set_child_pipe()
877 if (dup2(state->pipe_wr, STDOUT_FILENO) == -1) { in daemon_set_child_pipe()
881 if (state->pipe_wr != STDERR_FILENO && in daemon_set_child_pipe()
882 state->pipe_wr != STDOUT_FILENO) { in daemon_set_child_pipe()
883 close(state->pipe_wr); in daemon_set_child_pipe()
887 close(state->pipe_rd); in daemon_set_child_pipe()