Kernel - add ksnrprintf() and friends.
authorMatthew Dillon <dillon@apollo.backplane.com>
Sun, 30 Aug 2009 03:44:30 +0000 (20:44 -0700)
committerMatthew Dillon <dillon@apollo.backplane.com>
Sun, 30 Aug 2009 03:44:30 +0000 (20:44 -0700)
* Add ksnrprintf(), kvsnrprintf(), kvasnrprintf(), and kvasfree(),
  functions to replace unbounded uses of kvcprintf().

sys/kern/subr_prf.c
sys/sys/systm.h

index 8281a31..85d50b6 100644 (file)
@@ -447,6 +447,57 @@ kvsnprintf(char *str, size_t size, const char *format, __va_list ap)
        return (retval);
 }
 
+int
+ksnrprintf(char *str, size_t size, int radix, const char *format, ...)
+{
+       int retval;
+       __va_list ap;
+
+       __va_start(ap, format);
+       retval = kvsnrprintf(str, size, radix, format, ap);
+       __va_end(ap);
+       return(retval);
+}
+
+int
+kvsnrprintf(char *str, size_t size, int radix, const char *format, __va_list ap)
+{
+       struct snprintf_arg info;
+       int retval;
+
+       info.str = str;
+       info.remain = size;
+       retval = kvcprintf(format, snprintf_func, &info, radix, ap);
+       if (info.remain >= 1)
+               *info.str++ = '\0';
+       return (retval);
+}
+
+int
+kvasnrprintf(char **strp, size_t size, int radix,
+            const char *format, __va_list ap)
+{
+       struct snprintf_arg info;
+       int retval;
+
+       *strp = kmalloc(size, M_TEMP, M_WAITOK);
+       info.str = *strp;
+       info.remain = size;
+       retval = kvcprintf(format, snprintf_func, &info, radix, ap);
+       if (info.remain >= 1)
+               *info.str++ = '\0';
+       return (retval);
+}
+
+void
+kvasfree(char **strp)
+{
+       if (*strp) {
+               kfree(*strp, M_TEMP);
+               *strp = NULL;
+       }
+}
+
 static void
 snprintf_func(int ch, void *arg)
 {
index c568957..6c9ad66 100644 (file)
@@ -183,14 +183,22 @@ int       kprintf (const char *, ...) __printflike(1, 2);
 int    kprintf0(const char *, ...) __printflike(1, 2);
 void   krateprintf (struct krate *, const char *, ...) __printflike(2, 3);
 int    ksnprintf (char *, size_t, const char *, ...) __printflike(3, 4);
+int    ksnrprintf (char *, size_t, int, const char *, ...) __printflike(4, 5);
 int    ksprintf (char *buf, const char *, ...) __printflike(2, 3);
 int    uprintf (const char *, ...) __printflike(1, 2);
 int    kvprintf (const char *, __va_list) __printflike(1, 0);
-int    kvsnprintf (char *, size_t, const char *, __va_list) __printflike(3, 0);
-int     kvsprintf (char *buf, const char *, __va_list) __printflike(2, 0);
+int    kvsnprintf (char *, size_t, const char *,
+                       __va_list) __printflike(3, 0);
+int    kvsnrprintf (char *, size_t, int, const char *,
+                       __va_list) __printflike(4, 0);
+int    kvasnrprintf (char **, size_t, int, const char *,
+                       __va_list) __printflike(4, 0);
+int     kvsprintf (char *buf, const char *,
+                       __va_list) __printflike(2, 0);
 int    ttyprintf (struct tty *, const char *, ...) __printflike(2, 3);
 int    ksscanf (const char *, char const *, ...);
 int    kvsscanf (const char *, char const *, __va_list);
+void   kvasfree(char **);
 
 long   strtol (const char *, char **, int);
 u_long strtoul (const char *, char **, int);