Lines Matching full:state

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