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:
parent
f556af9ad5
commit
34c39437f2
11
daemon.c
11
daemon.c
@ -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);
|
||||
|
6
daemon.h
6
daemon.h
@ -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[];
|
||||
|
32
service.c
32
service.c
@ -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)) {
|
||||
|
Loading…
Reference in New Issue
Block a user