diff --git a/include/platform.h b/include/platform.h index a1ec17a7b..860143f7f 100644 --- a/include/platform.h +++ b/include/platform.h @@ -194,6 +194,9 @@ typedef unsigned long long int uintmax_t; * libbb. This would require a platform.c. It's not going to be cleaned * out of the tree, so stop saying it should be. */ #define fdprintf dprintf +#ifdef __dietlibc__ +int dprintf(int fd, const char *format, ...); +#endif /* Don't use lchown with glibc older than 2.1.x ... uC-libc lacks it */ #if (defined __GLIBC__ && __GLIBC__ <= 2 && __GLIBC_MINOR__ < 1) || \ diff --git a/libbb/xfuncs.c b/libbb/xfuncs.c index 313e32814..4790aa140 100644 --- a/libbb/xfuncs.c +++ b/libbb/xfuncs.c @@ -411,6 +411,37 @@ char *xasprintf(const char *format, ...) return string_ptr; } +#ifdef __dietlibc__ +int dprintf(int fd, const char *format, ...) +{ + va_list p; + int r; + char *string_ptr; + +#if 1 + // GNU extension + va_start(p, format); + r = vasprintf(&string_ptr, format, p); + va_end(p); +#else + // Bloat for systems that haven't got the GNU extension. + va_start(p, format); + r = vsnprintf(NULL, 0, format, p); + va_end(p); + string_ptr = xmalloc(r+1); + va_start(p, format); + r = vsnprintf(string_ptr, r+1, format, p); + va_end(p); +#endif + + if (r >= 0) { + full_write(fd, string_ptr, r); + free(string_ptr); + } + return r; +} +#endif + // Die with an error message if we can't copy an entire FILE * to stdout, then // close that file. void xprint_and_close_file(FILE *file) diff --git a/networking/nc.c b/networking/nc.c index 5fd9242cc..b2a4596d6 100644 --- a/networking/nc.c +++ b/networking/nc.c @@ -104,7 +104,7 @@ int nc_main(int argc, char **argv) if (!lport) { socklen_t len = sizeof(address); - getsockname(sfd, &address, &len); + getsockname(sfd, (struct sockaddr *) &address, &len); fdprintf(2, "%d\n", SWAP_BE16(address.sin_port)); } repeatyness: