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>
36 char *strsep(char **str
, const char *delims
)
46 while (**str
!= '\0') {
47 if (strchr(delims
, **str
)) {
55 /* There is no other token */
63 int setenv(const char *name
, const char *value
, int overwrite
)
68 buflen
= strlen(name
) + strlen(value
) + 2;
71 if (!overwrite
&& getenv(name
))
74 snprintf(buf
, buflen
, "%s=%s", name
, value
);
81 int unsetenv(const char *name
)
83 return setenv(name
, "", 0);
87 #ifndef HAVE_STRCASESTR
88 static char *upper(const char *orig
, char *buf
, int bufsize
)
92 while (i
< (bufsize
- 1) && orig
[i
]) {
93 buf
[i
] = toupper(orig
[i
]);
102 char *strcasestr(const char *haystack
, const char *needle
)
105 int u1len
= strlen(haystack
) + 1, u2len
= strlen(needle
) + 1;
112 /* Needle bigger than haystack */
115 offset
= strstr(upper(haystack
, u1
, u1len
), upper(needle
, u2
, u2len
));
117 /* Return the offset into the original string */
118 return ((char *)((unsigned long)haystack
+ (unsigned long)(offset
- u1
)));
126 #endif /* !HAVE_STRCASESTR */
129 size_t strnlen(const char *s
, size_t n
)
133 for (len
= 0; len
< n
; len
++)
139 #endif /* !HAVE_STRNLEN */
141 #if !defined(HAVE_STRNDUP) && !defined(__AST_DEBUG_MALLOC)
142 char *strndup(const char *s
, size_t n
)
144 size_t len
= strnlen(s
, n
);
145 char *new = malloc(len
+ 1);
151 return memcpy(new, s
, len
);
153 #endif /* !defined(HAVE_STRNDUP) && !defined(__AST_DEBUG_MALLOC) */
155 #if !defined(HAVE_VASPRINTF) && !defined(__AST_DEBUG_MALLOC)
156 int vasprintf(char **strp
, const char *fmt
, va_list ap
)
164 size
= vsnprintf(&s
, 1, fmt
, ap2
);
166 *strp
= malloc(size
+ 1);
169 vsnprintf(*strp
, size
+ 1, fmt
, ap
);
173 #endif /* !defined(HAVE_VASPRINTF) && !defined(__AST_DEBUG_MALLOC) */
176 * Based on Code from bsd-asprintf from OpenSSH
177 * Copyright (c) 2004 Darren Tucker.
179 * Based originally on asprintf.c from OpenBSD:
180 * Copyright (c) 1997 Todd C. Miller <Todd.Miller@courtesan.com>
182 * Permission to use, copy, modify, and distribute this software for any
183 * purpose with or without fee is hereby granted, provided that the above
184 * copyright notice and this permission notice appear in all copies.
186 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
187 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
188 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
189 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
190 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
191 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
192 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
194 #if !defined(HAVE_ASPRINTF) && !defined(__AST_DEBUG_MALLOC)
195 int asprintf(char **str
, const char *fmt
, ...)
202 ret
= vasprintf(str
, fmt
, ap
);
207 #endif /* !defined(HAVE_ASPRINTF) && !defined(__AST_DEBUG_MALLOC) */
211 #define LONG_MIN (-9223372036854775807L-1L)
212 /* min value of a "long int" */
215 #define LONG_MAX 9223372036854775807L
216 /* max value of a "long int" */
220 * Convert a string to a quad integer.
222 * \note Ignores `locale' stuff. Assumes that the upper and lower case
223 * alphabets and digits are each contiguous.
225 uint64_t strtoq(const char *nptr
, char **endptr
, int base
)
230 uint64_t qbase
, cutoff
;
231 int neg
, any
, cutlim
;
234 * Skip white space and pick up leading +/- sign if any.
235 * If base is 0, allow 0x for hex and 0 for octal, else
236 * assume decimal; if base is already 16, allow 0x.
241 } while (isspace(c
));
250 if ((base
== 0 || base
== 16) &&
251 c
== '\0' && (*s
== 'x' || *s
== 'X')) {
257 base
= c
== '\0' ? 8 : 10;
260 * Compute the cutoff value between legal numbers and illegal
261 * numbers. That is the largest legal value, divided by the
262 * base. An input number that is greater than this value, if
263 * followed by a legal input character, is too big. One that
264 * is equal to this value may be valid or not; the limit
265 * between valid and invalid numbers is then based on the last
266 * digit. For instance, if the range for quads is
267 * [-9223372036854775808..9223372036854775807] and the input base
268 * is 10, cutoff will be set to 922337203685477580 and cutlim to
269 * either 7 (neg==0) or 8 (neg==1), meaning that if we have
270 * accumulated a value > 922337203685477580, or equal but the
271 * next digit is > 7 (or 8), the number is too big, and we will
272 * return a range error.
274 * Set any if any `digits' consumed; make it negative to indicate
277 qbase
= (unsigned)base
;
278 cutoff
= neg
? (uint64_t)-(LONG_MIN
+ LONG_MAX
) + LONG_MAX
: LONG_MAX
;
279 cutlim
= cutoff
% qbase
;
281 for (acc
= 0, any
= 0;; c
= *s
++) {
287 c
-= isupper(c
) ? 'A' - 10 : 'a' - 10;
292 if (any
< 0 || acc
> cutoff
|| (acc
== cutoff
&& c
> cutlim
))
301 acc
= neg
? LONG_MIN
: LONG_MAX
;
305 *((const char **)endptr
) = any
? s
- 1 : nptr
;
308 #endif /* !HAVE_STRTOQ */
310 #ifndef HAVE_GETLOADAVG
312 /*! \brief Alternative method of getting load avg on Linux only */
313 int getloadavg(double *list
, int nelem
)
316 double avg
[3] = { 0.0, 0.0, 0.0 };
319 if ((LOADAVG
= fopen("/proc/loadavg", "r"))) {
320 fscanf(LOADAVG
, "%lf %lf %lf", &avg
[0], &avg
[1], &avg
[2]);
325 for (i
= 0; (i
< nelem
) && (i
< 3); i
++) {
332 /*! \brief Return something that won't cancel the call, but still return -1, in case
333 * we correct the implementation to check return value */
334 int getloadavg(double *list
, int nelem
)
338 for (i
= 0; i
< nelem
; i
++) {
344 #endif /* !HAVE_GETLOADAVG */
350 * Copyright (c) 1998 Todd C. Miller <Todd.Miller@courtesan.com>
351 * All rights reserved.
353 * Redistribution and use in source and binary forms, with or without
354 * modification, are permitted provided that the following conditions
356 * 1. Redistributions of source code must retain the above copyright
357 * notice, this list of conditions and the following disclaimer.
358 * 2. Redistributions in binary form must reproduce the above copyright
359 * notice, this list of conditions and the following disclaimer in the
360 * documentation and/or other materials provided with the distribution.
361 * 3. The name of the author may not be used to endorse or promote products
362 * derived from this software without specific prior written permission.
364 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
365 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
366 * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
367 * THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
368 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
369 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
370 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
371 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
372 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
373 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
377 * Appends src to string dst of size siz (unlike strncat, siz is the
378 * full size of dst, not space left). At most siz-1 characters
379 * will be copied. Always NUL terminates (unless siz <= strlen(dst)).
380 * Returns strlen(src) + MIN(siz, strlen(initial dst)).
381 * If retval >= siz, truncation occurred.
384 size_t strlcat(char *dst
, const char *src
, size_t siz
)
386 register char *d
= dst
;
387 register const char *s
= src
;
388 register size_t n
= siz
;
391 /* Find the end of dst and adjust bytes left but don't go past end */
392 while (n
-- != 0 && *d
!= '\0')
398 return dlen
+ strlen(s
);
409 return dlen
+ (s
- src
); /* count does not include NUL */
411 #endif /* HAVE_STRLCAT */
416 * Copyright (c) 1998 Todd C. Miller <Todd.Miller@courtesan.com>
417 * All rights reserved.
419 * Redistribution and use in source and binary forms, with or without
420 * modification, are permitted provided that the following conditions
422 * 1. Redistributions of source code must retain the above copyright
423 * notice, this list of conditions and the following disclaimer.
424 * 2. Redistributions in binary form must reproduce the above copyright
425 * notice, this list of conditions and the following disclaimer in the
426 * documentation and/or other materials provided with the distribution.
427 * 3. The name of the author may not be used to endorse or promote products
428 * derived from this software without specific prior written permission.
430 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
431 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
432 * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
433 * THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
434 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
435 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
436 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
437 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
438 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
439 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
443 * Copy src to string dst of size siz. At most siz-1 characters
444 * will be copied. Always NUL terminates (unless siz == 0).
445 * Returns strlen(src); if retval >= siz, truncation occurred.
448 size_t strlcpy(char *dst
, const char *src
, size_t siz
)
450 register char *d
= dst
;
451 register const char *s
= src
;
452 register size_t n
= siz
;
454 /* Copy as many bytes as will fit */
455 if (n
!= 0 && --n
!= 0) {
457 if ((*d
++ = *s
++) == 0)
462 /* Not enough room in dst, add NUL and traverse rest of src */
465 *d
= '\0'; /* NUL-terminate dst */
470 return s
- src
- 1; /* count does not include NUL */
472 #endif /* HAVE_STRLCPY */