Many Solaris fixes - this moves some of the stuff from utils.c to strcompat.c
authorJason Parker <jparker@digium.com>
Fri, 15 Sep 2006 17:16:00 +0000 (17:16 +0000)
committerJason Parker <jparker@digium.com>
Fri, 15 Sep 2006 17:16:00 +0000 (17:16 +0000)
Every OS uses strcompat now - this was done on purpose.

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@42982 65c4cc65-6c06-0410-ace0-fbb531ad65f3

agi/Makefile
configure
configure.ac
include/asterisk/autoconfig.h.in
include/asterisk/compat.h
include/asterisk/strings.h
include/asterisk/utils.h
main/Makefile
main/strcompat.c
main/utils.c
utils/Makefile

index c2e1c20..08de2f7 100644 (file)
 AGIS=agi-test.agi eagi-test eagi-sphinx-test jukebox.agi
 
 ifeq ($(OSARCH),SunOS)
-  LIBS+=-lsocket -lnsl ../main/strcompat.o
+  LIBS+=-lsocket -lnsl
 endif
 
 include $(ASTTOPDIR)/Makefile.rules
 
 all: $(AGIS)
 
-eagi-test: eagi-test.o
+eagi-test: eagi-test.o strcompat.o
 
 eagi-sphinx-test: eagi-sphinx-test.o
 
+$(eval $(call ast_make_o_c,strcompat.o,../main/strcompat.c))
+
 install: all
        mkdir -p $(DESTDIR)$(AGI_DIR)
        for x in $(AGIS); do $(INSTALL) -m 755 $$x $(DESTDIR)$(AGI_DIR) ; done
index 86fa048..c7e0e5f 100755 (executable)
--- a/configure
+++ b/configure
@@ -1,5 +1,5 @@
 #! /bin/sh
-# From configure.ac Revision: 41181 .
+# From configure.ac Revision: 41505 .
 # Guess values for system-dependent variables and create Makefiles.
 # Generated by GNU Autoconf 2.60.
 #
@@ -13436,7 +13436,8 @@ done
 
 
 
-for ac_func in atexit bzero dup2 endpwent floor ftruncate getcwd gethostbyname gethostname gettimeofday inet_ntoa isascii localtime_r memchr memmove memset mkdir munmap pow putenv re_comp regcomp rint select setenv socket sqrt strcasecmp strchr strcspn strdup strerror strncasecmp strndup strnlen strrchr strsep strspn strstr strtol unsetenv utime strtoq strcasestr asprintf vasprintf
+
+for ac_func in asprintf atexit bzero dup2 endpwent floor ftruncate getcwd gethostbyname gethostname getloadavg gettimeofday inet_ntoa isascii localtime_r memchr memmove memset mkdir munmap pow putenv re_comp regcomp rint select setenv socket sqrt strcasecmp strcasestr strchr strcspn strdup strerror strncasecmp strndup strnlen strrchr strsep strspn strstr strtol strtoq unsetenv utime vasprintf
 do
 as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
 { echo "$as_me:$LINENO: checking for $ac_func" >&5
index aba1b98..8071493 100644 (file)
@@ -239,7 +239,7 @@ AC_FUNC_STRNLEN
 AC_FUNC_STRTOD
 AC_FUNC_UTIME_NULL
 AC_FUNC_VPRINTF
-AC_CHECK_FUNCS([atexit bzero dup2 endpwent floor ftruncate getcwd gethostbyname gethostname gettimeofday inet_ntoa isascii localtime_r memchr memmove memset mkdir munmap pow putenv re_comp regcomp rint select setenv socket sqrt strcasecmp strchr strcspn strdup strerror strncasecmp strndup strnlen strrchr strsep strspn strstr strtol unsetenv utime strtoq strcasestr asprintf vasprintf])
+AC_CHECK_FUNCS([asprintf atexit bzero dup2 endpwent floor ftruncate getcwd gethostbyname gethostname getloadavg gettimeofday inet_ntoa isascii localtime_r memchr memmove memset mkdir munmap pow putenv re_comp regcomp rint select setenv socket sqrt strcasecmp strcasestr strchr strcspn strdup strerror strncasecmp strndup strnlen strrchr strsep strspn strstr strtol strtoq unsetenv utime vasprintf])
 
 AC_MSG_CHECKING(for compiler atomic operations)
 AC_LINK_IFELSE(
index 87273bd..7a0a9a0 100644 (file)
 /* Define to 1 if you have the `gethostname' function. */
 #undef HAVE_GETHOSTNAME
 
+/* Define to 1 if you have the `getloadavg' function. */
+#undef HAVE_GETLOADAVG
+
 /* Define to 1 if you have the `getpagesize' function. */
 #undef HAVE_GETPAGESIZE
 
index 8c2c6c4..ad4cfc6 100644 (file)
 
 #include <inttypes.h>
 #include <sys/types.h>
+#include <stdarg.h>
 
-#ifndef HAVE_STRSEP
-char* strsep(char** str, const char* delims);
+#if !defined(HAVE_ASPRINTF) && !defined(__AST_DEBUG_MALLOC)
+int asprintf(char **str, const char *fmt, ...);
+#endif
+
+#ifndef HAVE_GETLOADAVG
+int getloadavg(double *list, int nelem);
 #endif
 
 #ifndef HAVE_SETENV
 int setenv(const char *name, const char *value, int overwrite);
 #endif
 
+#ifndef HAVE_STRCASESTR
+char *strcasestr(const char *, const char *);
+#endif
+
+#if !defined(HAVE_STRNDUP) && !defined(__AST_DEBUG_MALLOC)
+char *strndup(const char *, size_t);
+#endif
+
+#ifndef HAVE_STRNLEN
+size_t strnlen(const char *, size_t);
+#endif
+
+#ifndef HAVE_STRSEP
+char* strsep(char** str, const char* delims);
+#endif
+
+#ifndef HAVE_STRTOQ
+uint64_t strtoq(const char *nptr, char **endptr, int base);
+#endif
+
 #ifndef HAVE_UNSETENV
 int unsetenv(const char *name);
 #endif
 
+#if !defined(HAVE_VASPRINTF) && !defined(__AST_DEBUG_MALLOC)
+int vasprintf(char **strp, const char *fmt, va_list ap);
+#endif
+
 #ifdef SOLARIS
 #define __BEGIN_DECLS
 #define __END_DECLS
index 6750a27..fad6f27 100644 (file)
@@ -256,28 +256,4 @@ struct ast_realloca {
                (ra)->ptr; \
        })
 
-#ifndef HAVE_STRCASESTR
-char *strcasestr(const char *, const char *);
-#endif
-
-#if !defined(HAVE_STRNDUP) && !defined(__AST_DEBUG_MALLOC)
-char *strndup(const char *, size_t);
-#endif
-
-#ifndef HAVE_STRNLEN
-size_t strnlen(const char *, size_t);
-#endif
-
-#if !defined(HAVE_VASPRINTF) && !defined(__AST_DEBUG_MALLOC)
-int vasprintf(char **strp, const char *fmt, va_list ap);
-#endif
-
-#if !defined(HAVE_ASPRINTF) && !defined(__AST_DEBUG_MALLOC) 
-int asprintf(char **str, const char *fmt, ...);
-#endif
-
-#ifndef HAVE_STRTOQ
-uint64_t strtoq(const char *nptr, char **endptr, int base);
-#endif
-
 #endif /* _ASTERISK_STRINGS_H */
index 41ca933..2fe5a87 100644 (file)
@@ -264,10 +264,6 @@ int ast_pthread_create_stack(pthread_t *thread, pthread_attr_t *attr, void *(*st
 */
 char *ast_process_quotes_and_slashes(char *start, char find, char replace_with);
 
-#ifndef HAVE_GETLOADAVG
-int getloadavg(double *list, int nelem);
-#endif
-
 #ifdef linux
 #define ast_random random
 #else
index e2ae65e..037a10a 100644 (file)
@@ -25,7 +25,8 @@ OBJS= io.o sched.o logger.o frame.o loader.o config.o channel.o \
        astmm.o enum.o srv.o dns.o aescrypt.o aestab.o aeskey.o \
        utils.o plc.o jitterbuf.o dnsmgr.o devicestate.o \
        netsock.o slinfactory.o ast_expr2.o ast_expr2f.o \
-       cryptostub.o sha1.o http.o fixedjitterbuf.o abstract_jb.o
+       cryptostub.o sha1.o http.o fixedjitterbuf.o abstract_jb.o \
+       strcompat.o
 
 # we need to link in the objects statically, not as a library, because
 # otherwise modules will not have them available if none of the static
@@ -89,7 +90,6 @@ endif
 
 ifeq ($(OSARCH),SunOS)
   AST_LIBS+=-lpthread -ldl -lnsl -lsocket -lresolv -L/opt/ssl/lib -L/usr/local/ssl/lib
-  OBJS+=strcompat.o
   ASTLINK=
 endif
 
index 59da2d2..38643fd 100644 (file)
 #include "asterisk.h"
 
 #include <sys/types.h>
+#include <ctype.h>
 #include <stdio.h>
+#include <stdlib.h>
+#include <alloca.h>
+#include <string.h>
 
 #ifndef HAVE_STRSEP
 char *strsep(char **str, const char *delims)
@@ -75,3 +79,262 @@ int unsetenv(const char *name)
        return setenv(name, "", 0);
 }
 #endif
+
+#ifndef HAVE_STRCASESTR
+static char *upper(const char *orig, char *buf, int bufsize)
+{
+       int i = 0;
+
+       while (i < (bufsize - 1) && orig[i]) {
+               buf[i] = toupper(orig[i]);
+               i++;
+       }
+
+       buf[i] = '\0';
+
+       return buf;
+}
+
+char *strcasestr(const char *haystack, const char *needle)
+{
+       char *u1, *u2;
+       int u1len = strlen(haystack) + 1, u2len = strlen(needle) + 1;
+
+       u1 = alloca(u1len);
+       u2 = alloca(u2len);
+       if (u1 && u2) {
+               char *offset;
+               if (u2len > u1len) {
+                       /* Needle bigger than haystack */
+                       return NULL;
+               }
+               offset = strstr(upper(haystack, u1, u1len), upper(needle, u2, u2len));
+               if (offset) {
+                       /* Return the offset into the original string */
+                       return ((char *)((unsigned long)haystack + (unsigned long)(offset - u1)));
+               } else {
+                       return NULL;
+               }
+       } else {
+               return NULL;
+       }
+}
+#endif /* !HAVE_STRCASESTR */
+
+#ifndef HAVE_STRNLEN
+size_t strnlen(const char *s, size_t n)
+{
+       size_t len;
+
+       for (len = 0; len < n; len++)
+               if (s[len] == '\0')
+                       break;
+
+       return len;
+}
+#endif /* !HAVE_STRNLEN */
+
+#if !defined(HAVE_STRNDUP) && !defined(__AST_DEBUG_MALLOC)
+char *strndup(const char *s, size_t n)
+{
+       size_t len = strnlen(s, n);
+       char *new = malloc(len + 1);
+
+       if (!new)
+               return NULL;
+
+       new[len] = '\0';
+       return memcpy(new, s, len);
+}
+#endif /* !defined(HAVE_STRNDUP) && !defined(__AST_DEBUG_MALLOC) */
+
+#if !defined(HAVE_VASPRINTF) && !defined(__AST_DEBUG_MALLOC)
+int vasprintf(char **strp, const char *fmt, va_list ap)
+{
+       int size;
+       va_list ap2;
+       char s;
+
+       *strp = NULL;
+       va_copy(ap2, ap);
+       size = vsnprintf(&s, 1, fmt, ap2);
+       va_end(ap2);
+       *strp = malloc(size + 1);
+       if (!*strp)
+               return -1;
+       vsnprintf(*strp, size + 1, fmt, ap);
+
+       return size;
+}
+#endif /* !defined(HAVE_VASPRINTF) && !defined(__AST_DEBUG_MALLOC) */
+
+/*
+ * Based on Code from bsd-asprintf from OpenSSH
+ * Copyright (c) 2004 Darren Tucker.
+ *
+ * Based originally on asprintf.c from OpenBSD:
+ * Copyright (c) 1997 Todd C. Miller <Todd.Miller@courtesan.com>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+#if !defined(HAVE_ASPRINTF) && !defined(__AST_DEBUG_MALLOC) 
+int asprintf(char **str, const char *fmt, ...)
+{
+        va_list ap;
+        int ret;
+
+        *str = NULL;
+        va_start(ap, fmt);
+        ret = vasprintf(str, fmt, ap);
+        va_end(ap);
+
+        return ret;
+}
+#endif /* !defined(HAVE_ASPRINTF) && !defined(__AST_DEBUG_MALLOC) */
+
+#ifndef HAVE_STRTOQ
+#ifndef LONG_MIN
+#define LONG_MIN        (-9223372036854775807L-1L)
+                                        /* min value of a "long int" */
+#endif
+#ifndef LONG_MAX
+#define LONG_MAX        9223372036854775807L
+                                        /* max value of a "long int" */
+#endif
+
+/*! \brief
+ * Convert a string to a quad integer.
+ *
+ * \note Ignores `locale' stuff.  Assumes that the upper and lower case
+ * alphabets and digits are each contiguous.
+ */
+uint64_t strtoq(const char *nptr, char **endptr, int base)
+{
+        const char *s;
+        uint64_t acc;
+        unsigned char c;
+        uint64_t qbase, cutoff;
+        int neg, any, cutlim;
+
+        /*
+         * Skip white space and pick up leading +/- sign if any.
+         * If base is 0, allow 0x for hex and 0 for octal, else
+         * assume decimal; if base is already 16, allow 0x.
+         */
+        s = nptr;
+        do {
+                c = *s++;
+        } while (isspace(c));
+        if (c == '-') {
+                neg = 1;
+                c = *s++;
+        } else {
+                neg = 0;
+                if (c == '+')
+                        c = *s++;
+        }
+        if ((base == 0 || base == 16) &&
+            c == '\0' && (*s == 'x' || *s == 'X')) {
+                c = s[1];
+                s += 2;
+                base = 16;
+        }
+        if (base == 0)
+                base = c == '\0' ? 8 : 10;
+
+        /*
+         * Compute the cutoff value between legal numbers and illegal
+         * numbers.  That is the largest legal value, divided by the
+         * base.  An input number that is greater than this value, if
+         * followed by a legal input character, is too big.  One that
+         * is equal to this value may be valid or not; the limit
+         * between valid and invalid numbers is then based on the last
+         * digit.  For instance, if the range for quads is
+         * [-9223372036854775808..9223372036854775807] and the input base
+         * is 10, cutoff will be set to 922337203685477580 and cutlim to
+         * either 7 (neg==0) or 8 (neg==1), meaning that if we have
+         * accumulated a value > 922337203685477580, or equal but the
+         * next digit is > 7 (or 8), the number is too big, and we will
+         * return a range error.
+         *
+         * Set any if any `digits' consumed; make it negative to indicate
+         * overflow.
+         */
+        qbase = (unsigned)base;
+        cutoff = neg ? (uint64_t)-(LONG_MIN + LONG_MAX) + LONG_MAX : LONG_MAX;
+        cutlim = cutoff % qbase;
+        cutoff /= qbase;
+        for (acc = 0, any = 0;; c = *s++) {
+                if (!isascii(c))
+                        break;
+                if (isdigit(c))
+                        c -= '\0';
+                else if (isalpha(c))
+                        c -= isupper(c) ? 'A' - 10 : 'a' - 10;
+                else
+                        break;
+                if (c >= base)
+                        break;
+                if (any < 0 || acc > cutoff || (acc == cutoff && c > cutlim))
+                        any = -1;
+                else {
+                        any = 1;
+                        acc *= qbase;
+                        acc += c;
+                }
+        }
+        if (any < 0) {
+                acc = neg ? LONG_MIN : LONG_MAX;
+        } else if (neg)
+                acc = -acc;
+        if (endptr != 0)
+                *((const char **)endptr) = any ? s - 1 : nptr;
+        return acc;
+}
+#endif /* !HAVE_STRTOQ */
+
+#ifndef HAVE_GETLOADAVG
+#ifdef linux
+/*! \brief Alternative method of getting load avg on Linux only */
+int getloadavg(double *list, int nelem)
+{
+       FILE *LOADAVG;
+       double avg[3] = { 0.0, 0.0, 0.0 };
+       int i, res = -1;
+
+       if ((LOADAVG = fopen("/proc/loadavg", "r"))) {
+               fscanf(LOADAVG, "%lf %lf %lf", &avg[0], &avg[1], &avg[2]);
+               res = 0;
+               fclose(LOADAVG);
+       }
+
+       for (i = 0; (i < nelem) && (i < 3); i++) {
+               list[i] = avg[i];
+       }
+
+       return res;
+}
+#else /* !linux */
+/*! \brief Return something that won't cancel the call, but still return -1, in case
+ * we correct the implementation to check return value */
+int getloadavg(double *list, int nelem)
+{
+       int i;
+
+       for (i = 0; i < nelem; i++) {
+               list[i] = 0.1;
+       }
+       return -1;
+}
+#endif /* linux */
+#endif /* !HAVE_GETLOADAVG */
index edb4102..22e5027 100644 (file)
@@ -750,266 +750,6 @@ struct timeval ast_tvsub(struct timeval a, struct timeval b)
 }
 #undef ONE_MILLION
 
-#ifndef HAVE_STRCASESTR
-static char *upper(const char *orig, char *buf, int bufsize)
-{
-       int i = 0;
-
-       while (i < (bufsize - 1) && orig[i]) {
-               buf[i] = toupper(orig[i]);
-               i++;
-       }
-
-       buf[i] = '\0';
-
-       return buf;
-}
-
-char *strcasestr(const char *haystack, const char *needle)
-{
-       char *u1, *u2;
-       int u1len = strlen(haystack) + 1, u2len = strlen(needle) + 1;
-
-       u1 = alloca(u1len);
-       u2 = alloca(u2len);
-       if (u1 && u2) {
-               char *offset;
-               if (u2len > u1len) {
-                       /* Needle bigger than haystack */
-                       return NULL;
-               }
-               offset = strstr(upper(haystack, u1, u1len), upper(needle, u2, u2len));
-               if (offset) {
-                       /* Return the offset into the original string */
-                       return ((char *)((unsigned long)haystack + (unsigned long)(offset - u1)));
-               } else {
-                       return NULL;
-               }
-       } else {
-               ast_log(LOG_ERROR, "Out of memory\n");
-               return NULL;
-       }
-}
-#endif /* !HAVE_STRCASESTR */
-
-#ifndef HAVE_STRNLEN
-size_t strnlen(const char *s, size_t n)
-{
-       size_t len;
-
-       for (len = 0; len < n; len++)
-               if (s[len] == '\0')
-                       break;
-
-       return len;
-}
-#endif /* !HAVE_STRNLEN */
-
-#if !defined(HAVE_STRNDUP) && !defined(__AST_DEBUG_MALLOC)
-char *strndup(const char *s, size_t n)
-{
-       size_t len = strnlen(s, n);
-       char *new = ast_malloc(len + 1);
-
-       if (!new)
-               return NULL;
-
-       new[len] = '\0';
-       return memcpy(new, s, len);
-}
-#endif /* !defined(HAVE_STRNDUP) && !defined(__AST_DEBUG_MALLOC) */
-
-#if !defined(HAVE_VASPRINTF) && !defined(__AST_DEBUG_MALLOC)
-int vasprintf(char **strp, const char *fmt, va_list ap)
-{
-       int size;
-       va_list ap2;
-       char s;
-
-       *strp = NULL;
-       va_copy(ap2, ap);
-       size = vsnprintf(&s, 1, fmt, ap2);
-       va_end(ap2);
-       *strp = ast_malloc(size + 1);
-       if (!*strp)
-               return -1;
-       vsnprintf(*strp, size + 1, fmt, ap);
-
-       return size;
-}
-#endif /* !defined(HAVE_VASPRINTF) && !defined(__AST_DEBUG_MALLOC) */
-
-/*
- * Based on Code from bsd-asprintf from OpenSSH
- * Copyright (c) 2004 Darren Tucker.
- *
- * Based originally on asprintf.c from OpenBSD:
- * Copyright (c) 1997 Todd C. Miller <Todd.Miller@courtesan.com>
- *
- * Permission to use, copy, modify, and distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
- * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
- * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
- * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
-#if !defined(HAVE_ASPRINTF) && !defined(__AST_DEBUG_MALLOC) 
-int asprintf(char **str, const char *fmt, ...)
-{
-        va_list ap;
-        int ret;
-
-        *str = NULL;
-        va_start(ap, fmt);
-        ret = vasprintf(str, fmt, ap);
-        va_end(ap);
-
-        return ret;
-}
-#endif /* !defined(HAVE_ASPRINTF) && !defined(__AST_DEBUG_MALLOC) */
-
-#ifndef HAVE_STRTOQ
-#ifndef LONG_MIN
-#define LONG_MIN        (-9223372036854775807L-1L)
-                                        /* min value of a "long int" */
-#endif
-#ifndef LONG_MAX
-#define LONG_MAX        9223372036854775807L
-                                        /* max value of a "long int" */
-#endif
-
-/*! \brief
- * Convert a string to a quad integer.
- *
- * \note Ignores `locale' stuff.  Assumes that the upper and lower case
- * alphabets and digits are each contiguous.
- */
-uint64_t strtoq(const char *nptr, char **endptr, int base)
-{
-        const char *s;
-        uint64_t acc;
-        unsigned char c;
-        uint64_t qbase, cutoff;
-        int neg, any, cutlim;
-
-        /*
-         * Skip white space and pick up leading +/- sign if any.
-         * If base is 0, allow 0x for hex and 0 for octal, else
-         * assume decimal; if base is already 16, allow 0x.
-         */
-        s = nptr;
-        do {
-                c = *s++;
-        } while (isspace(c));
-        if (c == '-') {
-                neg = 1;
-                c = *s++;
-        } else {
-                neg = 0;
-                if (c == '+')
-                        c = *s++;
-        }
-        if ((base == 0 || base == 16) &&
-            c == '\0' && (*s == 'x' || *s == 'X')) {
-                c = s[1];
-                s += 2;
-                base = 16;
-        }
-        if (base == 0)
-                base = c == '\0' ? 8 : 10;
-
-        /*
-         * Compute the cutoff value between legal numbers and illegal
-         * numbers.  That is the largest legal value, divided by the
-         * base.  An input number that is greater than this value, if
-         * followed by a legal input character, is too big.  One that
-         * is equal to this value may be valid or not; the limit
-         * between valid and invalid numbers is then based on the last
-         * digit.  For instance, if the range for quads is
-         * [-9223372036854775808..9223372036854775807] and the input base
-         * is 10, cutoff will be set to 922337203685477580 and cutlim to
-         * either 7 (neg==0) or 8 (neg==1), meaning that if we have
-         * accumulated a value > 922337203685477580, or equal but the
-         * next digit is > 7 (or 8), the number is too big, and we will
-         * return a range error.
-         *
-         * Set any if any `digits' consumed; make it negative to indicate
-         * overflow.
-         */
-        qbase = (unsigned)base;
-        cutoff = neg ? (uint64_t)-(LONG_MIN + LONG_MAX) + LONG_MAX : LONG_MAX;
-        cutlim = cutoff % qbase;
-        cutoff /= qbase;
-        for (acc = 0, any = 0;; c = *s++) {
-                if (!isascii(c))
-                        break;
-                if (isdigit(c))
-                        c -= '\0';
-                else if (isalpha(c))
-                        c -= isupper(c) ? 'A' - 10 : 'a' - 10;
-                else
-                        break;
-                if (c >= base)
-                        break;
-                if (any < 0 || acc > cutoff || (acc == cutoff && c > cutlim))
-                        any = -1;
-                else {
-                        any = 1;
-                        acc *= qbase;
-                        acc += c;
-                }
-        }
-        if (any < 0) {
-                acc = neg ? LONG_MIN : LONG_MAX;
-        } else if (neg)
-                acc = -acc;
-        if (endptr != 0)
-                *((const char **)endptr) = any ? s - 1 : nptr;
-        return acc;
-}
-#endif /* !HAVE_STRTOQ */
-
-#ifndef HAVE_GETLOADAVG
-#ifdef linux
-/*! \brief Alternative method of getting load avg on Linux only */
-int getloadavg(double *list, int nelem)
-{
-       FILE *LOADAVG;
-       double avg[3] = { 0.0, 0.0, 0.0 };
-       int i, res = -1;
-
-       if ((LOADAVG = fopen("/proc/loadavg", "r"))) {
-               fscanf(LOADAVG, "%lf %lf %lf", &avg[0], &avg[1], &avg[2]);
-               res = 0;
-               fclose(LOADAVG);
-       }
-
-       for (i = 0; (i < nelem) && (i < 3); i++) {
-               list[i] = avg[i];
-       }
-
-       return res;
-}
-#else /* !linux */
-/*! \brief Return something that won't cancel the call, but still return -1, in case
- * we correct the implementation to check return value */
-int getloadavg(double *list, int nelem)
-{
-       int i;
-
-       for (i = 0; i < nelem; i++) {
-               list[i] = 0.1;
-       }
-       return -1;
-}
-#endif /* linux */
-#endif /* !defined(_BSD_SOURCE) */
-
 /*! \brief glibc puts a lock inside random(3), so that the results are thread-safe.
  * BSD libc (and others) do not. */
 #ifndef linux
index d59bfec..5eae26d 100644 (file)
@@ -16,7 +16,7 @@
 UTILS:=astman smsq stereorize streamplayer aelparse muted
 
 ifeq (${OSARCH},SunOS)
-  LIBS+=../main/strcompat.o -lsocket -lnsl
+  LIBS+=-lsocket -lnsl
 endif
 
 ifeq ($(POPT_LIB),)
@@ -57,6 +57,8 @@ astman: LIBS+=-lnewt -lslang -ldl
 $(eval $(call ast_make_final,stereorize,stereorize.o frame.o))
 stereorize: LIBS+=-lm
 
+$(eval $(call ast_make_o_c,strcompat.o,../main/strcompat.c))
+
 ../main/ast_expr2.c:
        @echo "   [BISON] ../main/ast_expr2.y -> $@"
        @bison -o $@ -d --name-prefix=ast_yy ../main/ast_expr2.y
@@ -81,7 +83,7 @@ aelbison.o: CFLAGS+=-I../pbx
 $(eval $(call ast_make_o_c,pbx_ael.o,../pbx/pbx_ael.c))
 pbx_ael.o: CFLAGS+=-DSTANDALONE_AEL
 
-$(eval $(call ast_make_final,aelparse,aelflex.o aelbison.o pbx_ael.o ael_main.o ast_expr2f.o ast_expr2.o))
+$(eval $(call ast_make_final,aelparse,aelflex.o aelbison.o pbx_ael.o ael_main.o ast_expr2f.o ast_expr2.o strcompat.o))
 
 $(eval $(call ast_make_o_c,ael_main.o,ael_main.c ../include/asterisk/ael_structs.h))
 
@@ -92,7 +94,7 @@ testexpr2s: ../main/ast_expr2f.c ../main/ast_expr2.c ../main/ast_expr2.h
        rm ast_expr2.o ast_expr2f.o 
        ./testexpr2s expr2.testinput
 
-smsq: smsq.o
+smsq: smsq.o strcompat.o
 smsq: LIBS+=$(POPT_LIB)
 
 streamplayer: streamplayer.o