Blame view

lib/kasprintf.c 1.39 KB
b24413180   Greg Kroah-Hartman   License cleanup: ...
1
  // SPDX-License-Identifier: GPL-2.0
96e3e18ee   Sam Ravnborg   lib: move kasprin...
2
3
4
5
6
7
8
  /*
   *  linux/lib/kasprintf.c
   *
   *  Copyright (C) 1991, 1992  Linus Torvalds
   */
  
  #include <stdarg.h>
8bc3bcc93   Paul Gortmaker   lib: reduce the u...
9
  #include <linux/export.h>
5a0e3ad6a   Tejun Heo   include cleanup: ...
10
  #include <linux/slab.h>
96e3e18ee   Sam Ravnborg   lib: move kasprin...
11
12
13
14
15
16
  #include <linux/types.h>
  #include <linux/string.h>
  
  /* Simplified asprintf. */
  char *kvasprintf(gfp_t gfp, const char *fmt, va_list ap)
  {
8e2a2bfdb   Rasmus Villemoes   lib/kasprintf.c: ...
17
  	unsigned int first, second;
96e3e18ee   Sam Ravnborg   lib: move kasprin...
18
19
20
21
  	char *p;
  	va_list aq;
  
  	va_copy(aq, ap);
8e2a2bfdb   Rasmus Villemoes   lib/kasprintf.c: ...
22
  	first = vsnprintf(NULL, 0, fmt, aq);
96e3e18ee   Sam Ravnborg   lib: move kasprin...
23
  	va_end(aq);
8e2a2bfdb   Rasmus Villemoes   lib/kasprintf.c: ...
24
  	p = kmalloc_track_caller(first+1, gfp);
96e3e18ee   Sam Ravnborg   lib: move kasprin...
25
26
  	if (!p)
  		return NULL;
8e2a2bfdb   Rasmus Villemoes   lib/kasprintf.c: ...
27
28
29
  	second = vsnprintf(p, first+1, fmt, ap);
  	WARN(first != second, "different return values (%u and %u) from vsnprintf(\"%s\", ...)",
  	     first, second, fmt);
96e3e18ee   Sam Ravnborg   lib: move kasprin...
30
31
32
33
  
  	return p;
  }
  EXPORT_SYMBOL(kvasprintf);
0a9df786a   Rasmus Villemoes   lib/kasprintf.c: ...
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
  /*
   * If fmt contains no % (or is exactly %s), use kstrdup_const. If fmt
   * (or the sole vararg) points to rodata, we will then save a memory
   * allocation and string copy. In any case, the return value should be
   * freed using kfree_const().
   */
  const char *kvasprintf_const(gfp_t gfp, const char *fmt, va_list ap)
  {
  	if (!strchr(fmt, '%'))
  		return kstrdup_const(fmt, gfp);
  	if (!strcmp(fmt, "%s"))
  		return kstrdup_const(va_arg(ap, const char*), gfp);
  	return kvasprintf(gfp, fmt, ap);
  }
  EXPORT_SYMBOL(kvasprintf_const);
96e3e18ee   Sam Ravnborg   lib: move kasprin...
49
50
51
52
53
54
55
56
57
58
59
60
  char *kasprintf(gfp_t gfp, const char *fmt, ...)
  {
  	va_list ap;
  	char *p;
  
  	va_start(ap, fmt);
  	p = kvasprintf(gfp, fmt, ap);
  	va_end(ap);
  
  	return p;
  }
  EXPORT_SYMBOL(kasprintf);