2 * Asterisk -- An open source telephony toolkit.
4 * Copyright (C) 1999 - 2006, Digium, Inc.
6 * See http://www.asterisk.org for more information about
7 * the Asterisk project. Please do not directly contact
8 * any of the maintainers of this project for assistance;
9 * the project provides a web site, mailing lists and IRC
10 * channels for your use.
12 * This program is free software, distributed under the terms of
13 * the GNU General Public License Version 2. See the LICENSE file
14 * at the top of the source tree.
19 * \brief Compatibility functions for strsep and strtoq missing on Solaris
24 #include <sys/types.h>
35 char *strsep(char **str, const char *delims)
45 while (**str != '\0') {
46 if (strchr(delims, **str)) {
54 /* There is no other token */
62 int setenv(const char *name, const char *value, int overwrite)
67 buflen = strlen(name) + strlen(value) + 2;
70 if (!overwrite && getenv(name))
73 snprintf(buf, buflen, "%s=%s", name, value);
80 int unsetenv(const char *name)
82 return setenv(name, "", 0);
86 #ifndef HAVE_STRCASESTR
87 static char *upper(const char *orig, char *buf, int bufsize)
91 while (i < (bufsize - 1) && orig[i]) {
92 buf[i] = toupper(orig[i]);
101 char *strcasestr(const char *haystack, const char *needle)
104 int u1len = strlen(haystack) + 1, u2len = strlen(needle) + 1;
111 /* Needle bigger than haystack */
114 offset = strstr(upper(haystack, u1, u1len), upper(needle, u2, u2len));
116 /* Return the offset into the original string */
117 return ((char *)((unsigned long)haystack + (unsigned long)(offset - u1)));
125 #endif /* !HAVE_STRCASESTR */
128 size_t strnlen(const char *s, size_t n)
132 for (len = 0; len < n; len++)
138 #endif /* !HAVE_STRNLEN */
140 #if !defined(HAVE_STRNDUP) && !defined(__AST_DEBUG_MALLOC)
141 char *strndup(const char *s, size_t n)
143 size_t len = strnlen(s, n);
144 char *new = malloc(len + 1);
150 return memcpy(new, s, len);
152 #endif /* !defined(HAVE_STRNDUP) && !defined(__AST_DEBUG_MALLOC) */
154 #if !defined(HAVE_VASPRINTF) && !defined(__AST_DEBUG_MALLOC)
155 int vasprintf(char **strp, const char *fmt, va_list ap)
163 size = vsnprintf(&s, 1, fmt, ap2);
165 *strp = malloc(size + 1);
168 vsnprintf(*strp, size + 1, fmt, ap);
172 #endif /* !defined(HAVE_VASPRINTF) && !defined(__AST_DEBUG_MALLOC) */
175 * Based on Code from bsd-asprintf from OpenSSH
176 * Copyright (c) 2004 Darren Tucker.
178 * Based originally on asprintf.c from OpenBSD:
179 * Copyright (c) 1997 Todd C. Miller <Todd.Miller@courtesan.com>
181 * Permission to use, copy, modify, and distribute this software for any
182 * purpose with or without fee is hereby granted, provided that the above
183 * copyright notice and this permission notice appear in all copies.
185 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
186 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
187 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
188 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
189 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
190 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
191 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
193 #if !defined(HAVE_ASPRINTF) && !defined(__AST_DEBUG_MALLOC)
194 int asprintf(char **str, const char *fmt, ...)
201 ret = vasprintf(str, fmt, ap);
206 #endif /* !defined(HAVE_ASPRINTF) && !defined(__AST_DEBUG_MALLOC) */
210 #define LONG_MIN (-9223372036854775807L-1L)
211 /* min value of a "long int" */
214 #define LONG_MAX 9223372036854775807L
215 /* max value of a "long int" */
219 * Convert a string to a quad integer.
221 * \note Ignores `locale' stuff. Assumes that the upper and lower case
222 * alphabets and digits are each contiguous.
224 uint64_t strtoq(const char *nptr, char **endptr, int base)
229 uint64_t qbase, cutoff;
230 int neg, any, cutlim;
233 * Skip white space and pick up leading +/- sign if any.
234 * If base is 0, allow 0x for hex and 0 for octal, else
235 * assume decimal; if base is already 16, allow 0x.
240 } while (isspace(c));
249 if ((base == 0 || base == 16) &&
250 c == '\0' && (*s == 'x' || *s == 'X')) {
256 base = c == '\0' ? 8 : 10;
259 * Compute the cutoff value between legal numbers and illegal
260 * numbers. That is the largest legal value, divided by the
261 * base. An input number that is greater than this value, if
262 * followed by a legal input character, is too big. One that
263 * is equal to this value may be valid or not; the limit
264 * between valid and invalid numbers is then based on the last
265 * digit. For instance, if the range for quads is
266 * [-9223372036854775808..9223372036854775807] and the input base
267 * is 10, cutoff will be set to 922337203685477580 and cutlim to
268 * either 7 (neg==0) or 8 (neg==1), meaning that if we have
269 * accumulated a value > 922337203685477580, or equal but the
270 * next digit is > 7 (or 8), the number is too big, and we will
271 * return a range error.
273 * Set any if any `digits' consumed; make it negative to indicate
276 qbase = (unsigned)base;
277 cutoff = neg ? (uint64_t)-(LONG_MIN + LONG_MAX) + LONG_MAX : LONG_MAX;
278 cutlim = cutoff % qbase;
280 for (acc = 0, any = 0;; c = *s++) {
286 c -= isupper(c) ? 'A' - 10 : 'a' - 10;
291 if (any < 0 || acc > cutoff || (acc == cutoff && c > cutlim))
300 acc = neg ? LONG_MIN : LONG_MAX;
304 *((const char **)endptr) = any ? s - 1 : nptr;
307 #endif /* !HAVE_STRTOQ */
309 #ifndef HAVE_GETLOADAVG
311 /*! \brief Alternative method of getting load avg on Linux only */
312 int getloadavg(double *list, int nelem)
315 double avg[3] = { 0.0, 0.0, 0.0 };
318 if ((LOADAVG = fopen("/proc/loadavg", "r"))) {
319 fscanf(LOADAVG, "%lf %lf %lf", &avg[0], &avg[1], &avg[2]);
324 for (i = 0; (i < nelem) && (i < 3); i++) {
331 /*! \brief Return something that won't cancel the call, but still return -1, in case
332 * we correct the implementation to check return value */
333 int getloadavg(double *list, int nelem)
337 for (i = 0; i < nelem; i++) {
343 #endif /* !HAVE_GETLOADAVG */
349 * Copyright (c) 1998 Todd C. Miller <Todd.Miller@courtesan.com>
350 * All rights reserved.
352 * Redistribution and use in source and binary forms, with or without
353 * modification, are permitted provided that the following conditions
355 * 1. Redistributions of source code must retain the above copyright
356 * notice, this list of conditions and the following disclaimer.
357 * 2. Redistributions in binary form must reproduce the above copyright
358 * notice, this list of conditions and the following disclaimer in the
359 * documentation and/or other materials provided with the distribution.
360 * 3. The name of the author may not be used to endorse or promote products
361 * derived from this software without specific prior written permission.
363 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
364 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
365 * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
366 * THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
367 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
368 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
369 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
370 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
371 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
372 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
376 * Appends src to string dst of size siz (unlike strncat, siz is the
377 * full size of dst, not space left). At most siz-1 characters
378 * will be copied. Always NUL terminates (unless siz <= strlen(dst)).
379 * Returns strlen(src) + MIN(siz, strlen(initial dst)).
380 * If retval >= siz, truncation occurred.
383 size_t strlcat(char *dst, const char *src, size_t siz)
385 register char *d = dst;
386 register const char *s = src;
387 register size_t n = siz;
390 /* Find the end of dst and adjust bytes left but don't go past end */
391 while (n-- != 0 && *d != '\0')
397 return dlen + strlen(s);
408 return dlen + (s - src); /* count does not include NUL */
410 #endif /* HAVE_STRLCAT */
415 * Copyright (c) 1998 Todd C. Miller <Todd.Miller@courtesan.com>
416 * All rights reserved.
418 * Redistribution and use in source and binary forms, with or without
419 * modification, are permitted provided that the following conditions
421 * 1. Redistributions of source code must retain the above copyright
422 * notice, this list of conditions and the following disclaimer.
423 * 2. Redistributions in binary form must reproduce the above copyright
424 * notice, this list of conditions and the following disclaimer in the
425 * documentation and/or other materials provided with the distribution.
426 * 3. The name of the author may not be used to endorse or promote products
427 * derived from this software without specific prior written permission.
429 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
430 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
431 * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
432 * THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
433 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
434 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
435 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
436 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
437 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
438 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
442 * Copy src to string dst of size siz. At most siz-1 characters
443 * will be copied. Always NUL terminates (unless siz == 0).
444 * Returns strlen(src); if retval >= siz, truncation occurred.
447 size_t strlcpy(char *dst, const char *src, size_t siz)
449 register char *d = dst;
450 register const char *s = src;
451 register size_t n = siz;
453 /* Copy as many bytes as will fit */
454 if (n != 0 && --n != 0) {
456 if ((*d++ = *s++) == 0)
461 /* Not enough room in dst, add NUL and traverse rest of src */
464 *d = '\0'; /* NUL-terminate dst */
469 return s - src - 1; /* count does not include NUL */
471 #endif /* HAVE_STRLCPY */