Read service pipes

Changed line reading functions to return const char * because modifying
the strings by adding '\0' into them screws up the following call.
This commit is contained in:
C. McEnroe 2020-08-15 14:46:11 -04:00
parent f556af9ad5
commit 34c39437f2
3 changed files with 43 additions and 6 deletions

View File

@ -286,13 +286,20 @@ int main(int argc, char *argv[]) {
}
if (nfds > 0 && fds[0].revents) {
for (char *line; NULL != (line = lineRead(&fifoLine, fifo));) {
const char *line;
while (NULL != (line = lineRead(&fifoLine, fifo))) {
syslog(LOG_INFO, "control: %s", line);
}
if (errno != EAGAIN) syslog(LOG_ERR, "read: %m");
}
// TODO: Handle pipes.
if (nfds > 0) {
for (size_t i = 0; i < services.len; ++i) {
if (fds[1 + 2 * i].revents || fds[2 + 2 * i].revents) {
serviceRead(&services.ptr[i]);
}
}
}
if (timespecisset(&deadline)) {
clock_gettime(CLOCK_MONOTONIC, &now);

View File

@ -17,6 +17,7 @@
#include <errno.h>
#include <grp.h>
#include <pwd.h>
#include <stdbool.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
@ -55,13 +56,13 @@ struct Line {
char buf[512];
};
static inline char *lineFlush(struct Line *line) {
static inline const char *lineFlush(struct Line *line) {
if (!line->len) return NULL;
line->buf[line->len++] = '\0';
return line->buf;
}
static inline char *lineRead(struct Line *line, int fd) {
static inline const char *lineRead(struct Line *line, int fd) {
char *nul = memchr(line->buf, '\0', line->len);
if (nul) {
nul++;
@ -131,6 +132,7 @@ void serviceStart(struct Service *service);
void serviceStop(struct Service *service);
void serviceRestart(struct Service *service);
void serviceSignal(struct Service *service, int signal);
void serviceRead(struct Service *service);
void serviceReap(pid_t pid, int status);
extern char configError[];

View File

@ -16,10 +16,12 @@
#include <assert.h>
#include <err.h>
#include <errno.h>
#include <fcntl.h>
#include <limits.h>
#include <paths.h>
#include <signal.h>
#include <stdbool.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
@ -201,6 +203,33 @@ void serviceRestart(struct Service *service) {
}
}
static void serviceLog(struct Service *service, int pri, const char *log) {
syslog(
pri, "%s[%ju]: %s",
service->name, (intmax_t)service->pid, log
);
}
void serviceRead(struct Service *service) {
const char *out;
while (NULL != (out = lineRead(&service->outLine, service->outPipe[0]))) {
serviceLog(service, LOG_INFO, out);
}
if (errno != EAGAIN) syslog(LOG_ERR, "read: %m");
const char *err;
while (NULL != (err = lineRead(&service->errLine, service->errPipe[0]))) {
serviceLog(service, LOG_NOTICE, err);
}
if (errno != EAGAIN) syslog(LOG_ERR, "read: %m");
}
static void serviceFlush(struct Service *service) {
const char *out = lineFlush(&service->outLine);
const char *err = lineFlush(&service->errLine);
if (out) serviceLog(service, LOG_INFO, out);
if (err) serviceLog(service, LOG_NOTICE, err);
}
void serviceReap(pid_t pid, int status) {
struct Service *service = NULL;
for (size_t i = 0; i < services.len; ++i) {
@ -213,8 +242,7 @@ void serviceReap(pid_t pid, int status) {
syslog(LOG_WARNING, "reaping unknown child %jd", (intmax_t)pid);
return;
}
// TODO: Flush line buffers.
serviceFlush(service);
service->state = Stop;
if (WIFEXITED(status)) {