[stgt] [PATCH 2/6] mgmt and concat_buf: added concat_buf api to util.h

FUJITA Tomonori fujita.tomonori at lab.ntt.co.jp
Thu Jan 12 01:04:13 CET 2012


On Wed, 11 Jan 2012 15:29:51 +0200
Alexander Nezhinsky <alexandern at mellanox.com> wrote:

> Added concat_buf api to util.h, as inline functions to avoid duplication in
> tgtadm.c. Should consider separation into a separate file in the future.
> 
> concat_printf() is based on FILE* produced by open_memstream(). This mechanism
> takes care of the dynamic allocation and possible re-allocatin of memory on
> the as-needed basis.
> 
> Signed-off-by: Alexander Nezhinsky <alexandern at mellanox.com>
> ---
>  usr/util.h |   63 +++++++++++++++++++++++++++++++++++++++++++++++++----------
>  1 files changed, 52 insertions(+), 11 deletions(-)

Looks great, thanks a lot!


> diff --git a/usr/util.h b/usr/util.h
> index 8abdb94..275f6f9 100644
> --- a/usr/util.h
> +++ b/usr/util.h
> @@ -8,6 +8,8 @@
>  #include <signal.h>
>  #include <syscall.h>
>  #include <unistd.h>
> +#include <stdarg.h>
> +#include <stdio.h>
>  #include <limits.h>
>  #include <linux/types.h>
>  
> @@ -88,17 +90,6 @@ static inline int between(uint32_t seq1, uint32_t seq2, uint32_t seq3)
>  	return seq3 - seq2 >= seq1 - seq2;
>  }
>  
> -#define shprintf(total, buf, rest, fmt, args...)			\
> -do {									\
> -	int len;							\
> -	len = snprintf(buf, rest, fmt, ##args);				\
> -	if (len > rest)							\
> -		goto overflow;						\
> -	buf += len;							\
> -	total += len;							\
> -	rest -= len;							\
> -} while (0)
> -
>  extern unsigned long pagesize, pageshift;
>  
>  #if defined(__NR_signalfd) && defined(USE_SIGNALFD)
> @@ -151,4 +142,54 @@ struct signalfd_siginfo {
>  	ret;						\
>  })
>  
> +struct concat_buf {
> +	FILE *streamf;
> +	int err;
> +	int used;
> +	int *size;
> +};

What are 'used' and '*size' for? 


> +static inline void concat_buf_init(struct concat_buf *b, char **buf, int *size)
> +{
> +	b->streamf = open_memstream(buf, (size_t *)size);
> +	b->err = b->streamf ? 0 : errno;
> +	b->used = 0;
> +	b->size = size;
> +}
> +
> +static inline int concat_printf(struct concat_buf *b, const char *format, ...)
> +{
> +	va_list args;
> +	int nprinted;
> +
> +	if (!b->err) {
> +		va_start(args, format);
> +		nprinted = vfprintf(b->streamf, format, args);
> +		if (nprinted >= 0)
> +			b->used += nprinted;
> +		else {
> +			b->err = nprinted;
> +			fclose(b->streamf);
> +			b->streamf = NULL;
> +		}
> +		va_end(args);
> +	}
> +	return b->err;
> +}
> +
> +static inline const char *concat_delim(struct concat_buf *b, const char *delim)
> +{
> +	return !b->used ? "" : delim;
> +}
> +
> +static inline int concat_buf_finish(struct concat_buf *b)
> +{
> +	if (b->streamf) {
> +		fclose(b->streamf);
> +		b->streamf = NULL;
> +		(*b->size) ++; /* account for trailing NULL char */
> +	}
> +	return b->err;
> +}
> +
>  #endif
> -- 
> 1.7.3.2
> 
> --
> To unsubscribe from this list: send the line "unsubscribe stgt" in
> the body of a message to majordomo at vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
--
To unsubscribe from this list: send the line "unsubscribe stgt" in
the body of a message to majordomo at vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html



More information about the stgt mailing list