Add kvasprintf()
Subsystems (2)
PATCH 1/1 Add kvasprintf()
Add a kvasprintf() function to compliment kasprintf().
[ No in-tree users yet, but I have some coming up. ]
Signed-off-by Jeremy Fitzhardinge <[email protected]>
Cc Andrew Morton <[email protected]>
Cc Keir Fraser <[email protected]>
--- include/linux/kernel.h | 1 + lib/vsprintf.c | 28 ++++++++++++++++++++-------- 2 files changed, 21 insertions(+), 8 deletions(-)
===================================================================
include/linux/kernel.h +1 -0
@@ -121,6 +121,7 @@ extern int vscnprintf(char *buf, size_t __attribute__ ((format (printf, 3, 0)));extern char *kasprintf (gfp_t gfp,const char *fmt, ...) __attribute__ ((format (printf,2 ,3 ))); +extern char *kvasprintf (gfp_t gfp,const char *fmt,va_list args);extern int sscanf (const char *,const char *, ...) __attribute__ ((format (scanf,2 ,3 )));
===================================================================
lib/vsprintf.c +20 -8
@@ -851,22 +851,34 @@ EXPORT_SYMBOL(sscanf);/* Simplified asprintf. */ -char *kasprintf (gfp_t gfp,const char *fmt, ...) -{ -va_list ap; +char *kvasprintf (gfp_t gfp,const char *fmt,va_list ap) +{unsigned int len;char *p; - -va_start (ap, fmt); - len =vsnprintf (NULL ,0 , fmt, ap); -va_end (ap); +va_list aq; + +va_copy (aq, ap); + len =vsnprintf (NULL ,0 , fmt, aq); +va_end (aq); p =kmalloc (len+1 , gfp);if (!p)return NULL ; + +vsnprintf (p, len+1 , fmt, ap); + +return p; +} + +char *kasprintf (gfp_t gfp,const char *fmt, ...) +{ +va_list ap; +char *p; +va_start (ap, fmt); -vsnprintf (p, len+1 , fmt, ap); + p =kvasprintf (gfp, fmt, ap);va_end (ap); +return p; }