Index: ossp-pkg/l2/l2_ch_pipe.c RCS File: /v/ossp/cvs/ossp-pkg/l2/l2_ch_pipe.c,v rcsdiff -q -kk '-r1.9' '-r1.10' -u '/v/ossp/cvs/ossp-pkg/l2/l2_ch_pipe.c,v' 2>/dev/null --- l2_ch_pipe.c 2001/09/14 11:13:32 1.9 +++ l2_ch_pipe.c 2001/09/14 15:40:04 1.10 @@ -30,12 +30,29 @@ #include "l2.h" #include +#include /* declare private channel configuration */ typedef struct { int iPipe; /* pipe filedescriptor used for writing only */ } l2_ch_pipe_t; +static void catchsignal(int sig, ...) +{ + va_list ap; + static l2_context_t *ctx = NULL; + + va_start(ap, sig); + if (sig == 0) + ctx = va_arg(ap, l2_context_t *); + else if (sig == SIGCHLD) { + ((l2_ch_pipe_t *)(int *)ctx->vp)->iPipe = -1; /* TODO: Fill in with new pipe fd */ + } + else if (sig == SIGPIPE) + ((l2_ch_pipe_t *)(int *)ctx->vp)->iPipe = -1; + va_end(ap); +} + /* create channel */ static l2_result_t hook_create(l2_context_t *ctx, l2_channel_t *ch) { @@ -70,6 +87,10 @@ if (cfg->iPipe == -1) return L2_ERR_ARG; + catchsignal(0, ctx); /* initialize signal handler with incoming context */ + signal(SIGCHLD, (void(*)())catchsignal); /* pipe changes descriptor */ + signal(SIGPIPE, (void(*)())catchsignal); /* pipe closes reading fd */ + return rv; } @@ -78,11 +99,21 @@ l2_level_t level, const char *buf, size_t buf_size) { l2_ch_pipe_t *cfg = (l2_ch_pipe_t *)ctx->vp; + l2_channel_t *downstream = l2_channel_downstream(ch); + l2_result_t rv; + /* validate the pipe fd */ + if (cfg->iPipe == -1) + return L2_ERR_ARG; + /* write message to channel pipe */ if (write(cfg->iPipe, buf, buf_size) == -1) return L2_ERR_SYS; + /* write to downstream channel */ + if ((rv = l2_channel_write(downstream, level, buf, buf_size)) != L2_OK) + return rv; + return L2_OK; } @@ -90,11 +121,17 @@ static l2_result_t hook_close(l2_context_t *ctx, l2_channel_t *ch) { l2_ch_pipe_t *cfg = (l2_ch_pipe_t *)ctx->vp; - + l2_channel_t *downstream = l2_channel_downstream(ch); + l2_result_t rv; + /* close channel pipe */ close(cfg->iPipe); cfg->iPipe = -1; + /* close downstream channel, too */ + if ((rv = l2_channel_close(downstream)) != L2_OK) + return rv; + return L2_OK; } @@ -102,16 +139,22 @@ static l2_result_t hook_destroy(l2_context_t *ctx, l2_channel_t *ch) { l2_ch_pipe_t *cfg = (l2_ch_pipe_t *)ctx->vp; + l2_channel_t *downstream = l2_channel_downstream(ch); + l2_result_t rv; /* destroy channel configuration */ free(cfg); + /* destroy downstream channel, too */ + if ((rv = l2_channel_destroy(downstream)) != L2_OK) + return rv; + return L2_OK; } /* exported channel handler structure */ l2_handler_t l2_handler_pipe = { - L2_CHANNEL_OUTPUT, + L2_CHANNEL_FILTER, hook_create, hook_configure, NULL, Index: ossp-pkg/l2/l2_test.c RCS File: /v/ossp/cvs/ossp-pkg/l2/l2_test.c,v rcsdiff -q -kk '-r1.20' '-r1.21' -u '/v/ossp/cvs/ossp-pkg/l2/l2_test.c,v' 2>/dev/null --- l2_test.c 2001/09/13 16:19:06 1.20 +++ l2_test.c 2001/09/14 15:40:04 1.21 @@ -34,6 +34,8 @@ #include #include #include +#include +#include #include "l2.h" @@ -67,6 +69,7 @@ l2_channel_t *chBuf; l2_channel_t *chFile; l2_channel_t *chSyslog; + l2_channel_t *chPipe; #ifdef WITH_SOCKET l2_channel_t *chSock; #endif @@ -75,6 +78,7 @@ #endif l2_stream_t *st; + int pipdesc[2]; /* For use with our pipe channel test */ /* * Typical steps to use a buffered file logging stream */ @@ -122,12 +126,24 @@ if (l2_channel_configure(chFile, "path,append,perm", "l2_test.log", TRUE, 0644) != L2_OK) die("failed to configure file channel"); + if (pipe(pipdesc)) + die("pipe() call failed"); + + if ((chPipe = l2_channel_create(&l2_handler_pipe)) == NULL) /* Pipe */ + die("failed to create pipe channel"); + + if (l2_channel_configure(chPipe, "pipe", pipdesc[1]) != L2_OK) + die("failed to configure pipe channel"); + if (l2_channel_stack(chFile, chBuf) != L2_OK) die("failed to stack buffer channel on top of file channel"); if (l2_channel_stack(chBuf, chPrefix) != L2_OK) die("failed to stack prefix channel on top of buffer channel"); + if (l2_channel_stack(chPrefix, chPipe) != L2_OK) + die("failed to stack pipe channel on top of prefix channel"); + if (l2_channel_open(chPrefix) != L2_OK) die("failed to open channel stack"); @@ -177,6 +193,8 @@ if (l2_stream_destroy(st) != L2_OK) die("failed to destroy stream"); + close(pipdesc[1]); /* Close the locally made pipe file descriptor */ + close(pipdesc[0]); /* Close the locally made pipe file descriptor */ return 0; }