summaryrefslogtreecommitdiff
path: root/lib/printf.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/printf.c')
-rw-r--r--lib/printf.c22
1 files changed, 11 insertions, 11 deletions
diff --git a/lib/printf.c b/lib/printf.c
index 4bcffe56..0e3b4d93 100644
--- a/lib/printf.c
+++ b/lib/printf.c
@@ -118,8 +118,10 @@ static char * number(char * str, long num, int base, int size, int precision,
*
* This functions acts like ordinary sprintf() except that it checks
* available space to avoid buffer overflows and it allows some more
- * format specifiers: |%I| for formatting of IP addresses and |%M| for
- * error messages (uses strerror() to translate @errno code to
+ * format specifiers: |%I| for formatting of IP addresses (any non-zero
+ * width is automatically replaced by standard IP address width which
+ * depends on whether we use IPv4 or IPv6; |%#I| gives hexadecimal format)
+ * and |%m| resp. |%M| for error messages (uses strerror() to translate @errno code to
* message text). On the other hand, it doesn't support floating
* point numbers.
*
@@ -133,6 +135,7 @@ int bvsnprintf(char *buf, int size, const char *fmt, va_list args)
int i, base;
char *str, *start;
const char *s;
+ char ipbuf[STD_ADDRESS_P_LENGTH+1];
int flags; /* flags to number() */
@@ -264,18 +267,15 @@ int bvsnprintf(char *buf, int size, const char *fmt, va_list args)
/* IP address */
case 'I':
- if (size < STD_ADDRESS_P_LENGTH)
- return -1;
if (flags & SPECIAL)
- str = ip_ntox(va_arg(args, ip_addr), str);
+ ip_ntox(va_arg(args, ip_addr), ipbuf);
else {
- len = ip_ntop(va_arg(args, ip_addr), str) - str;
- str += len;
- if (field_width >= 0)
- while (len++ < STD_ADDRESS_P_LENGTH)
- *str++ = ' ';
+ ip_ntop(va_arg(args, ip_addr), ipbuf);
+ if (field_width > 0)
+ field_width = STD_ADDRESS_P_LENGTH;
}
- continue;
+ s = ipbuf;
+ goto str;
/* integer number formats - set up the flags and "break" */
case 'o':