--- 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 */
|