OSSP CVS Repository

ossp - Difference in ossp-pkg/l2/l2_ch_file.c versions 1.27 and 1.28
Not logged in
[Honeypot]  [Browse]  [Home]  [Login]  [Reports
[Search]  [Ticket]  [Timeline
  [History

ossp-pkg/l2/l2_ch_file.c 1.27 -> 1.28

--- l2_ch_file.c 2003/06/30 12:38:17     1.27
+++ l2_ch_file.c 2003/06/30 12:54:06     1.28
@@ -41,6 +41,7 @@
     int   append;
     int   trunc;
     int   perm;
+    int   jitter;
 } l2_ch_file_t;
 
 /* create channel */
@@ -58,6 +59,7 @@
     cfg->append = -1;
     cfg->trunc  = -1;
     cfg->perm   = (S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH);
+    cfg->jitter = 0;
 
     /* link private channel configuration into channel context */
     ctx->vp = cfg;
@@ -69,7 +71,7 @@
 static l2_result_t hook_configure(l2_context_t *ctx, l2_channel_t *ch, const char *fmt, va_list ap)
 {
     l2_ch_file_t *cfg = (l2_ch_file_t *)ctx->vp;
-    l2_param_t pa[5];
+    l2_param_t pa[6];
     l2_result_t rv;
     l2_env_t *env;
 
@@ -78,11 +80,11 @@
     L2_PARAM_SET(pa[1], append, INT, &cfg->append);
     L2_PARAM_SET(pa[2], trunc,  INT, &cfg->trunc);
     L2_PARAM_SET(pa[3], perm,   INT, &cfg->perm);
-    L2_PARAM_END(pa[4]);
+    L2_PARAM_SET(pa[4], jitter, INT, &cfg->jitter);
+    L2_PARAM_END(pa[5]);
     l2_channel_env(ch, &env);
     rv = l2_util_setparams(env, pa, fmt, ap);
 
-
     return rv;
 }
 
@@ -119,6 +121,12 @@
     if (   cfg->trunc == -1)
         cfg->trunc = (1 - cfg->append) & 1;
 
+    /* reduce jitter to 0 (no) or 1 (yes) */
+    if (cfg->jitter <= 0)
+        cfg->jitter = 0;
+    if (cfg->jitter >= 1)
+        cfg->jitter = 1;
+
     /* make sure a path was set */
     if (cfg->path == NULL)
         return L2_ERR_USE;
@@ -135,6 +143,12 @@
     if (cfg->fd == -1)
         return L2_ERR_SYS;
 
+    /* close channel file if jittering, we just wanted to see a successful open and truncate if required */
+    if (cfg->jitter == 1) {
+        close(cfg->fd);
+        cfg->fd = -1;
+    }
+
     return L2_OK;
 }
 
@@ -143,12 +157,35 @@
                               l2_level_t level, const char *buf, size_t buf_size)
 {
     l2_ch_file_t *cfg = (l2_ch_file_t *)ctx->vp;
+    l2_result_t rc = L2_OK;
+    mode_t mask;
+
+    /* handle the impossible; close any lingering file if jittering */
+    if (cfg->fd != -1 && cfg->jitter == 1) {
+        close(cfg->fd);
+        cfg->fd = -1;
+    }
+
+    /* open channel file if jittering */
+    if (cfg->fd == -1 && cfg->jitter == 1) {
+        mask = umask(0);
+        cfg->fd = open(cfg->path, O_WRONLY|O_CREAT|O_APPEND, cfg->perm);
+        umask(mask);
+    }
+    if (cfg->fd == -1)
+        return L2_ERR_SYS;
 
     /* write message to channel file */
     if (write(cfg->fd, buf, buf_size) == -1)
-        return L2_ERR_SYS;
+        rc = L2_ERR_SYS;
 
-    return L2_OK;
+    /* close channel file if jittering */
+    if (cfg->jitter == 1) {
+        close(cfg->fd);
+        cfg->fd = -1;
+    }
+
+    return rc;
 }
 
 /* close channel */

CVSTrac 2.0.1