opt: test HAVE_SYS_TERMIOS_H via #if
[ccan] / ccan / opt / usage.c
index d9b2ee59cc3e4ba9a10df5a5eb358a74b5b4fb89..ff0545591ed4050a5153aa5c8d6db2041a1295e4 100644 (file)
@@ -1,6 +1,10 @@
 /* Licensed under GPLv3+ - see LICENSE file for details */
 #include <ccan/opt/opt.h>
+#if HAVE_SYS_TERMIOS_H
 #include <sys/ioctl.h>
+#include <sys/termios.h> /* Required on Solaris for struct winsize */
+#endif
+#include <sys/unistd.h> /* Required on Solaris for ioctl */
 #include <string.h>
 #include <stdlib.h>
 #include <stdio.h>
@@ -15,19 +19,24 @@ const char opt_hidden[1];
 
 static unsigned int get_columns(void)
 {
-       struct winsize w;
+       int ws_col = 0;
        const char *env = getenv("COLUMNS");
 
-       w.ws_col = 0;
        if (env)
-               w.ws_col = atoi(env);
-       if (!w.ws_col)
-               if (ioctl(0, TIOCGWINSZ, &w) == -1)
-                       w.ws_col = 0;
-       if (!w.ws_col)
-               w.ws_col = 80;
-
-       return w.ws_col;
+               ws_col = atoi(env);
+
+#ifdef TIOCGWINSZ
+       if (!ws_col)
+       {
+               struct winsize w;
+               if (ioctl(0, TIOCGWINSZ, &w) != -1)
+                       ws_col = w.ws_col;
+       }
+#endif
+       if (!ws_col)
+               ws_col = 80;
+
+       return ws_col;
 }
 
 /* Return number of chars of words to put on this line.
@@ -58,7 +67,7 @@ static char *add_str_len(char *base, size_t *len, size_t *max,
                         const char *str, size_t slen)
 {
        if (slen >= *max - *len)
-               base = realloc(base, *max = (*max * 2 + slen + 1));
+               base = opt_alloc.realloc(base, *max = (*max * 2 + slen + 1));
        memcpy(base + *len, str, slen);
        *len += slen;
        return base;
@@ -72,7 +81,7 @@ static char *add_str(char *base, size_t *len, size_t *max, const char *str)
 static char *add_indent(char *base, size_t *len, size_t *max, size_t indent)
 {
        if (indent >= *max - *len)
-               base = realloc(base, *max = (*max * 2 + indent + 1));
+               base = opt_alloc.realloc(base, *max = (*max * 2 + indent + 1));
        memset(base + *len, ' ', indent);
        *len += indent;
        return base;