about summary refs log tree commit homepage
path: root/mgmt.c
diff options
context:
space:
mode:
Diffstat (limited to 'mgmt.c')
-rw-r--r--mgmt.c33
1 files changed, 23 insertions, 10 deletions
diff --git a/mgmt.c b/mgmt.c
index b80718c..6dd1b77 100644
--- a/mgmt.c
+++ b/mgmt.c
@@ -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);
                 }