OSSP CVS Repository

ossp - Check-in [1013]
Not logged in
[Honeypot]  [Browse]  [Home]  [Login]  [Reports
[Search]  [Ticket]  [Timeline
  [Patchset]  [Tagging/Branching

Check-in Number: 1013
Date: 2001-Sep-14 17:40:04 (local)
2001-Sep-14 15:40:04 (UTC)
User:ms
Branch:
Comment: Added the Thomas signal handler to catch SIGCHLD and SIGPIPE, pipe handler is now a filter not an output, new logic to test code, bugfixes.
Tickets:
Inspections:
Files:
ossp-pkg/l2/l2_ch_pipe.c      1.9 -> 1.10     45 inserted, 2 deleted
ossp-pkg/l2/l2_test.c      1.20 -> 1.21     18 inserted, 0 deleted

ossp-pkg/l2/l2_ch_pipe.c 1.9 -> 1.10

--- 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 <unistd.h>
+#include <signal.h>
 
 /* 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,


ossp-pkg/l2/l2_test.c 1.20 -> 1.21

--- 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 <netinet/in.h>
 #include <netdb.h>
 #include <syslog.h>
+#include <unistd.h>
+#include <fcntl.h>
 
 #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;
 }
 

CVSTrac 2.0.1