From bfcdc4969510997fe81debf52982641febfa1bdf Mon Sep 17 00:00:00 2001 From: Brian Koropoff Date: Tue, 15 Mar 2011 15:35:14 +0800 Subject: [SHELL] Port to Solaris - Solaris lacks paths.h and the various _PATH_* #defines. Check for them in configure.ac and fall back on the usual suspects when they are missing. - Older Solaris lacks isblank(), and versions that have it use a macro. Check for the declaration in configure.ac and fall back on a naive version when missing. - Older Solaris does not support %jd (intmax_t) in format strings, but it does support the PRIdMAX macro from inttypes.h. Do a configure check for PRIdMAX and use it in the code. If it doesn't exist, define it to "lld" when sizeof(long long) equals sizeof(intmax_t) as this is more likely to work on older systems. Otherwise, use "jd" and hope for the best. - Older Solaris lacks stdint.h, but inttypes.h provides the same types and works on all platforms I've tried dash on, so just use it instead. - Older Solaris doesn't like it when vsnprintf() is passed a NULL buffer (in violation of the POSIX spec, of course). Pass a 1-byte dummy buffer instead. - Solaris lacks tempfile and mktemp programs. Fall back on a "good-enough" custom function in mkbuiltins. Signed-off-by: Brian Koropoff Signed-off-by: Herbert Xu --- src/output.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) (limited to 'src/output.c') diff --git a/src/output.c b/src/output.c index 2f9b5c4..f62e7ea 100644 --- a/src/output.c +++ b/src/output.c @@ -378,6 +378,20 @@ xvsnprintf(char *outbuf, size_t length, const char *fmt, va_list ap) { int ret; +#ifdef __sun + /* + * vsnprintf() on older versions of Solaris returns -1 when + * passed a length of 0. To avoid this, use a dummy + * 1-character buffer instead. + */ + char dummy[1]; + + if (length == 0) { + outbuf = dummy; + length = sizeof(dummy); + } +#endif + INTOFF; ret = vsnprintf(outbuf, length, fmt, ap); INTON; -- cgit 1.4.1