OSSP CVS Repository

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

Check-in Number: 3468
Date: 2003-Jun-30 14:54:05 (local)
2003-Jun-30 12:54:05 (UTC)
User:thl
Branch:
Comment: add jitter option to file channel
Tickets:
Inspections:
Files:
ossp-pkg/fsl/fsl.pod      1.30 -> 1.31     11 inserted, 6 deleted
ossp-pkg/l2/l2_ch_file.c      1.27 -> 1.28     42 inserted, 5 deleted

ossp-pkg/fsl/fsl.pod 1.30 -> 1.31

--- fsl.pod      2003/06/30 11:13:08     1.30
+++ fsl.pod      2003/06/30 12:54:05     1.31
@@ -203,16 +203,21 @@
 messages poured in from upper channels to this file. If the file at
 the given path already exists, additional data is either appended
 (I<append>=1 or I<trunc>=0>) or the existing file is truncated
-(I<append>=0 or I<trunc>=1>). The desired permissions of the file can be
-set.  Both append and trunc work equally well but append is obsolete and
-might be removed in the future.  Both options can be specified together
-as long as they are set different. L2 versions which know the trunc
-option default to append mode while previous versions only having the
-append option defaulted to truncate mode.
+(I<append>=0 or I<trunc>=1>). If I<jitter> is set the logfile will be
+opened and closed for every write operation. This makes log file
+rotation easy at the price of performance. The desired permissions of
+the logfile can be set through I<perm>.
+
+Note that both append and trunc work equally well but append is obsolete
+and might be removed in the future.  Both options can be specified
+together as long as they are set different. L2 versions which know the
+trunc option default to append mode while previous versions limited to
+support only the append option defaulted to truncate mode.
 
  o file   (STR path            m
            INT append          o [0=no|1=yes]          =1
            INT trunc           o [0=no|1=yes]          =0
+           INT jitter          o [0=no|1=yes]          =0
            INT perm            o [octal]               =0644
            )
 


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