aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Poznyakoff <gray@gnu.org.ua>2013-10-12 17:29:05 +0300
committerSergey Poznyakoff <gray@gnu.org.ua>2013-10-12 17:29:05 +0300
commit66f3521c257d2777cbf9697716a9f2288254376c (patch)
treebe3b4993d1b4bb515f67227bd0647dac4dbc08ff
parent60a356d55ed0aca4283ddc3134298936e45ad18b (diff)
downloadvmod-binlog-66f3521c257d2777cbf9697716a9f2288254376c.tar.gz
vmod-binlog-66f3521c257d2777cbf9697716a9f2288254376c.tar.bz2
Fix processing repeat counts in packinnext.
* src/binlog.c (vmod_start): call packinit. * src/pack.c (packinst) <cur>: New member. (packinnext): Correctly process repeat counts. (packout): Likewise. (packinit): New function. * src/pack.h (packinit): New proto.
-rw-r--r--src/binlog.c44
-rw-r--r--src/pack.c24
-rw-r--r--src/pack.h1
3 files changed, 42 insertions, 27 deletions
diff --git a/src/binlog.c b/src/binlog.c
index b2d9f87..325f337 100644
--- a/src/binlog.c
+++ b/src/binlog.c
@@ -47,25 +47,25 @@ enum binlog_state {
struct binlog_config {
- size_t size; /* maximum file size */
- unsigned interval; /* file rotation interval */
- char *pattern; /* file name pattern */
- int umask; /* umask for new files and directories */
- char *dir; /* root storage directory */
- int dd; /* directory descriptor */
- char *fname; /* current file name */
- int fd; /* current file descriptor */
+ size_t size; /* maximum file size */
+ unsigned interval; /* file rotation interval */
+ char *pattern; /* file name pattern */
+ int umask; /* umask for new files and directories */
+ char *dir; /* root storage directory */
+ int dd; /* directory descriptor */
+ char *fname; /* current file name */
+ int fd; /* current file descriptor */
struct binlog_file_header *base; /* mmap base */
- char *recbase; /* record base */
- size_t recnum; /* number of records in recbase */
- size_t recsize; /* record size */
- time_t stoptime; /* when to rotate the current file */
+ char *recbase; /* record base */
+ size_t recnum; /* number of records in recbase */
+ size_t recsize; /* record size */
+ time_t stoptime; /* when to rotate the current file */
pthread_mutex_t mutex;
- int debug;
- int flags;
-
- char *dataspec;
- struct packinst *inst_head;
- struct packinst *inst_cur;
- struct packenv *env;
- enum binlog_state state;
- time_t timestamp;
+ int debug; /* debug level */
+ int flags; /* flags (see BLF_* defines above) */
+
+ char *dataspec; /* data format specification */
+ struct packinst *inst_head; /* compiled dataspec */
+ struct packinst *inst_cur; /* current instruction */
+ struct packenv *env; /* pack environment */
+ enum binlog_state state; /* binlog machine state */
+ time_t timestamp; /* timestamp for the entry being built */
};
@@ -498,3 +498,3 @@ vmod_start(struct sess *sp, struct vmod_priv *priv)
conf->state = state_start;
- conf->inst_cur = conf->inst_head;
+ conf->inst_cur = packinit(conf->inst_head);
conf->timestamp = ts;
diff --git a/src/pack.c b/src/pack.c
index 12dc19d..2e7e7a6 100644
--- a/src/pack.c
+++ b/src/pack.c
@@ -71,2 +71,3 @@ struct packinst {
int rep;
+ int cur;
};
@@ -511,6 +512,8 @@ packinnext(struct packinst *pi, struct packenv *env)
pi->spec->packer(env, pi->spec, pi->rep);
- else
- for (i = 0; i < pi->rep; i++)
- pi->spec->packer(env, pi->spec, 1);
- return pi->next;
+ else {
+ pi->spec->packer(env, pi->spec, 1);
+ if (++pi->cur < pi->rep)
+ return pi;
+ }
+ return packinit(pi->next);
}
@@ -526,4 +529,7 @@ packout(struct packinst *pi, struct packenv *env)
else
- for (i = 0; i < pi->rep; i++)
+ for (i = 0; i < pi->rep; i++) {
+ if (i > 0)
+ fputc(' ', env->fp);
pi->spec->unpacker(env, pi->spec, 1);
+ }
if (pi->next)
@@ -543,2 +549,10 @@ packsize(struct packinst *pi)
+struct packinst *
+packinit(struct packinst *inst)
+{
+ if (inst)
+ inst->cur = 0;
+ return inst;
+}
+
struct packenv *
diff --git a/src/pack.h b/src/pack.h
index 70a2488..36e20ec 100644
--- a/src/pack.h
+++ b/src/pack.h
@@ -32,2 +32,3 @@ struct packinst *packcomp(const char *s, char **endp);
void packfree(struct packinst *pi);
+struct packinst *packinit(struct packinst *pi);
void packin(struct packinst *pi, struct packenv *env);

Return to:

Send suggestions and report system problems to the System administrator.