diff options
Diffstat (limited to 'mgmt.c')
-rw-r--r-- | mgmt.c | 33 |
1 files changed, 23 insertions, 10 deletions
@@ -214,7 +214,7 @@ static enum mog_next mgmt_run(struct mog_fd *mfd, struct mog_rbuf *rbuf, return mgmt->wbuf ? MOG_NEXT_WAIT_WR : MOG_NEXT_ACTIVE; } -MOG_NOINLINE static char * +static char * mgmt_rbuf_grow(struct mog_fd *mfd, struct mog_rbuf **rbuf, size_t buf_len) { struct mog_mgmt *mgmt = &mfd->as.mgmt; @@ -223,6 +223,24 @@ mgmt_rbuf_grow(struct mog_fd *mfd, struct mog_rbuf **rbuf, size_t buf_len) return *rbuf ? (*rbuf)->rptr : NULL; } +MOG_NOINLINE static bool +mgmt_parse_continue(struct mog_fd *mfd, struct mog_rbuf **rbuf, + char **buf, size_t buf_len, off_t *off) +{ + struct mog_mgmt *mgmt = &mfd->as.mgmt; + + assert(mgmt->wbuf == NULL && + "tried to write (and failed) with partial req"); + if (mgmt->buf_off >= (*rbuf)->rcapa) { + *buf = mgmt_rbuf_grow(mfd, rbuf, buf_len); + if (!*buf) + return false; + } + + *off = mgmt->buf_off; + return true; +} + /* * this is the main event callback and called whenever mgmt * is pulled out of a queue (either idle or active) @@ -271,15 +289,10 @@ parse: syslog(LOG_ERR, "mgmt parser error"); return MOG_NEXT_CLOSE; case MOG_PARSER_CONTINUE: - assert(mgmt->wbuf == NULL && - "tried to write (and failed) with partial req"); - if (mgmt->buf_off >= rbuf->rcapa) { - buf = mgmt_rbuf_grow(mfd, &rbuf, buf_len); - if (!buf) - goto too_large; - } - off = mgmt->buf_off; - goto reread; + if (mgmt_parse_continue(mfd, &rbuf, &buf, buf_len, + &off)) + goto reread; + goto too_large; case MOG_PARSER_DONE: return mgmt_run(mfd, rbuf, buf, buf_len); } |