On Fri, Sep 10, 2021 at 01:41:13PM +0200, [email protected] wrote:
> From: Martin Wilck <[email protected]>
> 
> Move the actual execution of the handler out of parse_cmd(). For now,
> we do it in uxsock_trigger().
> 
Reviewed-by: Benjamin Marzinski <[email protected]>
> Signed-off-by: Martin Wilck <[email protected]>
> ---
>  multipathd/uxlsnr.c | 47 ++++++++++++++++++++++++++++-----------------
>  1 file changed, 29 insertions(+), 18 deletions(-)
> 
> diff --git a/multipathd/uxlsnr.c b/multipathd/uxlsnr.c
> index 65cb5ca..cfff0ae 100644
> --- a/multipathd/uxlsnr.c
> +++ b/multipathd/uxlsnr.c
> @@ -293,11 +293,9 @@ static void handle_inotify(int fd, struct 
> watch_descriptors *wds)
>  
>  static const struct timespec ts_zero = { .tv_sec = 0, };
>  
> -static int parse_cmd (struct client *c, void *data, int timeout)
> +static int parse_cmd(struct client *c)
>  {
>       int r;
> -     struct handler * h;
> -     struct timespec tmo;
>  
>       r = get_cmdvec(c->cmd, &c->cmdvec);
>  
> @@ -308,26 +306,35 @@ static int parse_cmd (struct client *c, void *data, int 
> timeout)
>               return 0;
>       }
>  
> -     h = find_handler_for_cmdvec(c->cmdvec);
> +     c->handler = find_handler_for_cmdvec(c->cmdvec);
>  
> -     if (!h || !h->fn) {
> +     if (!c->handler || !c->handler->fn) {
>               genhelp_handler(c->cmd, EINVAL, &c->reply);
>               if (get_strbuf_len(&c->reply) == 0)
>                       r = EINVAL;
> -             goto free_cmdvec;
> +             else
> +                     r = 0;
>       }
>  
> -     /*
> -      * execute handler
> -      */
> +     return r;
> +}
> +
> +static int execute_handler(struct client *c, struct vectors *vecs, int 
> timeout)
> +{
> +     int r;
> +     struct timespec tmo;
> +
> +     if (!c->handler)
> +             return EINVAL;
> +
>       if (clock_gettime(CLOCK_REALTIME, &tmo) == 0) {
>               tmo.tv_sec += timeout;
>       } else {
>               tmo.tv_sec = 0;
>       }
> -     if (h->locked) {
> +
> +     if (c->handler->locked) {
>               int locked = 0;
> -             struct vectors * vecs = (struct vectors *)data;
>  
>               pthread_cleanup_push(cleanup_lock, &vecs->lock);
>               if (tmo.tv_sec) {
> @@ -339,15 +346,11 @@ static int parse_cmd (struct client *c, void *data, int 
> timeout)
>               if (r == 0) {
>                       locked = 1;
>                       pthread_testcancel();
> -                     r = h->fn(c->cmdvec, &c->reply, data);
> +                     r = c->handler->fn(c->cmdvec, &c->reply, vecs);
>               }
>               pthread_cleanup_pop(locked);
>       } else
> -             r = h->fn(c->cmdvec, &c->reply, data);
> -
> -free_cmdvec:
> -     free_keys(c->cmdvec);
> -     c->cmdvec = NULL;
> +             r = c->handler->fn(c->cmdvec, &c->reply, vecs);
>  
>       return r;
>  }
> @@ -367,7 +370,15 @@ static int uxsock_trigger(struct client *c, void 
> *trigger_data)
>               return r;
>       }
>  
> -     r = parse_cmd(c, vecs, uxsock_timeout / 1000);
> +     r = parse_cmd(c);
> +
> +     if (r == 0 && c->handler)
> +             r = execute_handler(c, vecs, uxsock_timeout / 1000);
> +
> +     if (c->cmdvec) {
> +             free_keys(c->cmdvec);
> +             c->cmdvec = NULL;
> +     }
>  
>       if (r > 0) {
>               if (r == ETIMEDOUT)
> -- 
> 2.33.0

--
dm-devel mailing list
[email protected]
https://listman.redhat.com/mailman/listinfo/dm-devel

Reply via email to