git: 24fd3e969ebe - main - daemon: move buffer into daemon_state
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Wed, 27 Dec 2023 06:08:10 UTC
The branch main has been updated by kevans: URL: https://cgit.FreeBSD.org/src/commit/?id=24fd3e969ebe2ed44bc04f5ccc4db21cf02184d5 commit 24fd3e969ebe2ed44bc04f5ccc4db21cf02184d5 Author: Ihor Antonov <ihor@antonovs.family> AuthorDate: 2023-12-27 06:07:25 +0000 Commit: Kyle Evans <kevans@FreeBSD.org> CommitDate: 2023-12-27 06:07:25 +0000 daemon: move buffer into daemon_state There is no reason for a buffer in listen_child() to be a static function variable. The buffer and its position are parts of the daemon state and should live together with the rest of the state variables. Reviewed by: cperciva, kevans --- usr.sbin/daemon/daemon.c | 40 +++++++++++++++++++++------------------- 1 file changed, 21 insertions(+), 19 deletions(-) diff --git a/usr.sbin/daemon/daemon.c b/usr.sbin/daemon/daemon.c index ed6239b9fb93..e9c4bf05504c 100644 --- a/usr.sbin/daemon/daemon.c +++ b/usr.sbin/daemon/daemon.c @@ -66,6 +66,8 @@ enum daemon_mode { }; struct daemon_state { + unsigned char buf[LBUF_SIZE]; + size_t pos; int pipe_fd[2]; char **argv; const char *child_pidfile; @@ -584,38 +586,36 @@ restrict_process(const char *user) static bool listen_child(struct daemon_state *state) { - static unsigned char buf[LBUF_SIZE]; - static size_t bytes_read = 0; ssize_t rv; assert(state != NULL); - assert(bytes_read < LBUF_SIZE - 1); + assert(state->pos < LBUF_SIZE - 1); - rv = read(state->pipe_fd[0], buf + bytes_read, LBUF_SIZE - bytes_read - 1); + rv = read(state->pipe_fd[0], state->buf + state->pos, LBUF_SIZE - state->pos - 1); if (rv > 0) { unsigned char *cp; - bytes_read += rv; - assert(bytes_read <= LBUF_SIZE - 1); + state->pos += rv; + assert(state->pos <= LBUF_SIZE - 1); /* Always NUL-terminate just in case. */ - buf[LBUF_SIZE - 1] = '\0'; + state->buf[LBUF_SIZE - 1] = '\0'; /* * Chomp line by line until we run out of buffer. * This does not take NUL characters into account. */ - while ((cp = memchr(buf, '\n', bytes_read)) != NULL) { - size_t bytes_line = cp - buf + 1; - assert(bytes_line <= bytes_read); - do_output(buf, bytes_line, state); - bytes_read -= bytes_line; - memmove(buf, cp + 1, bytes_read); + while ((cp = memchr(state->buf, '\n', state->pos)) != NULL) { + size_t bytes_line = cp - state->buf + 1; + assert(bytes_line <= state->pos); + do_output(state->buf, bytes_line, state); + state->pos -= bytes_line; + memmove(state->buf, cp + 1, state->pos); } /* Wait until the buffer is full. */ - if (bytes_read < LBUF_SIZE - 1) { + if (state->pos < LBUF_SIZE - 1) { return true; } - do_output(buf, bytes_read, state); - bytes_read = 0; + do_output(state->buf, state->pos, state); + state->pos = 0; return true; } else if (rv == -1) { /* EINTR should trigger another read. */ @@ -627,9 +627,9 @@ listen_child(struct daemon_state *state) } } /* Upon EOF, we have to flush what's left of the buffer. */ - if (bytes_read > 0) { - do_output(buf, bytes_read, state); - bytes_read = 0; + if (state->pos > 0) { + do_output(state->buf, state->pos, state); + state->pos = 0; } return false; } @@ -685,6 +685,8 @@ static void daemon_state_init(struct daemon_state *state) { *state = (struct daemon_state) { + .buf = {0}, + .pos = 0, .pipe_fd = { -1, -1 }, .argv = NULL, .parent_pidfh = NULL,