diff options
author | Sergey Poznyakoff <gray@gnu.org.ua> | 2013-10-12 17:29:05 +0300 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org.ua> | 2013-10-12 17:29:05 +0300 |
commit | 66f3521c257d2777cbf9697716a9f2288254376c (patch) | |
tree | be3b4993d1b4bb515f67227bd0647dac4dbc08ff | |
parent | 60a356d55ed0aca4283ddc3134298936e45ad18b (diff) | |
download | vmod-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.c | 44 | ||||
-rw-r--r-- | src/pack.c | 24 | ||||
-rw-r--r-- | src/pack.h | 1 |
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; @@ -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 * @@ -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); |