Index: ossp-pkg/fsl/fsl.pod RCS File: /v/ossp/cvs/ossp-pkg/fsl/fsl.pod,v rcsdiff -q -kk '-r1.30' '-r1.31' -u '/v/ossp/cvs/ossp-pkg/fsl/fsl.pod,v' 2>/dev/null --- 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=1 or I=0>) or the existing file is truncated -(I=0 or I=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=0 or I=1>). If I 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. + +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 ) Index: ossp-pkg/l2/l2_ch_file.c RCS File: /v/ossp/cvs/ossp-pkg/l2/l2_ch_file.c,v rcsdiff -q -kk '-r1.27' '-r1.28' -u '/v/ossp/cvs/ossp-pkg/l2/l2_ch_file.c,v' 2>/dev/null --- 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 */