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
27 char *strsep(char **str
, const char *delims
)
37 while (**str
!= '\0') {
38 if (strchr(delims
, **str
)) {
46 /* There is no other token */
54 int setenv(const char *name
, const char *value
, int overwrite
)
59 buflen
= strlen(name
) + strlen(value
) + 2;
62 if (!overwrite
&& getenv(name
))
65 snprintf(buf
, buflen
, "%s=%s", name
, value
);
72 int unsetenv(const char *name
)
74 return setenv(name
, "", 0);
78 #ifndef HAVE_STRCASESTR
79 static char *upper(const char *orig
, char *buf
, int bufsize
)
83 while (i
< (bufsize
- 1) && orig
[i
]) {
84 buf
[i
] = toupper(orig
[i
]);
93 char *strcasestr(const char *haystack
, const char *needle
)
96 int u1len
= strlen(haystack
) + 1, u2len
= strlen(needle
) + 1;
103 /* Needle bigger than haystack */
106 offset
= strstr(upper(haystack
, u1
, u1len
), upper(needle
, u2
, u2len
));
108 /* Return the offset into the original string */
109 return ((char *)((unsigned long)haystack
+ (unsigned long)(offset
- u1
)));
117 #endif /* !HAVE_STRCASESTR */
120 size_t strnlen(const char *s
, size_t n
)
124 for (len
= 0; len
< n
; len
++)
130 #endif /* !HAVE_STRNLEN */
132 #if !defined(HAVE_STRNDUP) && !defined(__AST_DEBUG_MALLOC)
133 char *strndup(const char *s
, size_t n
)
135 size_t len
= strnlen(s
, n
);
136 char *new = malloc(len
+ 1);
142 return memcpy(new, s
, len
);
144 #endif /* !defined(HAVE_STRNDUP) && !defined(__AST_DEBUG_MALLOC) */
146 #if !defined(HAVE_VASPRINTF) && !defined(__AST_DEBUG_MALLOC)
147 int vasprintf(char **strp
, const char *fmt
, va_list ap
)
155 size
= vsnprintf(&s
, 1, fmt
, ap2
);
157 *strp
= malloc(size
+ 1);
160 vsnprintf(*strp
, size
+ 1, fmt
, ap
);
164 #endif /* !defined(HAVE_VASPRINTF) && !defined(__AST_DEBUG_MALLOC) */
167 * Based on Code from bsd-asprintf from OpenSSH
168 * Copyright (c) 2004 Darren Tucker.
170 * Based originally on asprintf.c from OpenBSD:
171 * Copyright (c) 1997 Todd C. Miller <Todd.Miller@courtesan.com>
173 * Permission to use, copy, modify, and distribute this software for any
174 * purpose with or without fee is hereby granted, provided that the above
175 * copyright notice and this permission notice appear in all copies.
177 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
178 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
179 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
180 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
181 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
182 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
183 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
185 #if !defined(HAVE_ASPRINTF) && !defined(__AST_DEBUG_MALLOC)
186 int asprintf(char **str
, const char *fmt
, ...)
193 ret
= vasprintf(str
, fmt
, ap
);
198 #endif /* !defined(HAVE_ASPRINTF) && !defined(__AST_DEBUG_MALLOC) */
202 #define LONG_MIN (-9223372036854775807L-1L)
203 /* min value of a "long int" */
206 #define LONG_MAX 9223372036854775807L
207 /* max value of a "long int" */
211 * Convert a string to a quad integer.
213 * \note Ignores `locale' stuff. Assumes that the upper and lower case
214 * alphabets and digits are each contiguous.
216 uint64_t strtoq(const char *nptr
, char **endptr
, int base
)
221 uint64_t qbase
, cutoff
;
222 int neg
, any
, cutlim
;
225 * Skip white space and pick up leading +/- sign if any.
226 * If base is 0, allow 0x for hex and 0 for octal, else
227 * assume decimal; if base is already 16, allow 0x.
232 } while (isspace(c
));
241 if ((base
== 0 || base
== 16) &&
242 c
== '\0' && (*s
== 'x' || *s
== 'X')) {
248 base
= c
== '\0' ? 8 : 10;
251 * Compute the cutoff value between legal numbers and illegal
252 * numbers. That is the largest legal value, divided by the
253 * base. An input number that is greater than this value, if
254 * followed by a legal input character, is too big. One that
255 * is equal to this value may be valid or not; the limit
256 * between valid and invalid numbers is then based on the last
257 * digit. For instance, if the range for quads is
258 * [-9223372036854775808..9223372036854775807] and the input base
259 * is 10, cutoff will be set to 922337203685477580 and cutlim to
260 * either 7 (neg==0) or 8 (neg==1), meaning that if we have
261 * accumulated a value > 922337203685477580, or equal but the
262 * next digit is > 7 (or 8), the number is too big, and we will
263 * return a range error.
265 * Set any if any `digits' consumed; make it negative to indicate
268 qbase
= (unsigned)base
;
269 cutoff
= neg
? (uint64_t)-(LONG_MIN
+ LONG_MAX
) + LONG_MAX
: LONG_MAX
;
270 cutlim
= cutoff
% qbase
;
272 for (acc
= 0, any
= 0;; c
= *s
++) {
278 c
-= isupper(c
) ? 'A' - 10 : 'a' - 10;
283 if (any
< 0 || acc
> cutoff
|| (acc
== cutoff
&& c
> cutlim
))
292 acc
= neg
? LONG_MIN
: LONG_MAX
;
296 *((const char **)endptr
) = any
? s
- 1 : nptr
;
299 #endif /* !HAVE_STRTOQ */
301 #ifndef HAVE_GETLOADAVG
303 /*! \brief Alternative method of getting load avg on Linux only */
304 int getloadavg(double *list
, int nelem
)
307 double avg
[3] = { 0.0, 0.0, 0.0 };
310 if ((LOADAVG
= fopen("/proc/loadavg", "r"))) {
311 fscanf(LOADAVG
, "%lf %lf %lf", &avg
[0], &avg
[1], &avg
[2]);
316 for (i
= 0; (i
< nelem
) && (i
< 3); i
++) {
323 /*! \brief Return something that won't cancel the call, but still return -1, in case
324 * we correct the implementation to check return value */
325 int getloadavg(double *list
, int nelem
)
329 for (i
= 0; i
< nelem
; i
++) {
335 #endif /* !HAVE_GETLOADAVG */
341 * Copyright (c) 1998 Todd C. Miller <Todd.Miller@courtesan.com>
342 * All rights reserved.
344 * Redistribution and use in source and binary forms, with or without
345 * modification, are permitted provided that the following conditions
347 * 1. Redistributions of source code must retain the above copyright
348 * notice, this list of conditions and the following disclaimer.
349 * 2. Redistributions in binary form must reproduce the above copyright
350 * notice, this list of conditions and the following disclaimer in the
351 * documentation and/or other materials provided with the distribution.
352 * 3. The name of the author may not be used to endorse or promote products
353 * derived from this software without specific prior written permission.
355 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
356 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
357 * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
358 * THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
359 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
360 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
361 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
362 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
363 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
364 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
368 * Appends src to string dst of size siz (unlike strncat, siz is the
369 * full size of dst, not space left). At most siz-1 characters
370 * will be copied. Always NUL terminates (unless siz <= strlen(dst)).
371 * Returns strlen(src) + MIN(siz, strlen(initial dst)).
372 * If retval >= siz, truncation occurred.
375 size_t strlcat(char *dst
, const char *src
, size_t siz
)
377 register char *d
= dst
;
378 register const char *s
= src
;
379 register size_t n
= siz
;
382 /* Find the end of dst and adjust bytes left but don't go past end */
383 while (n
-- != 0 && *d
!= '\0')
389 return dlen
+ strlen(s
);
400 return dlen
+ (s
- src
); /* count does not include NUL */
402 #endif /* HAVE_STRLCAT */
407 * Copyright (c) 1998 Todd C. Miller <Todd.Miller@courtesan.com>
408 * All rights reserved.
410 * Redistribution and use in source and binary forms, with or without
411 * modification, are permitted provided that the following conditions
413 * 1. Redistributions of source code must retain the above copyright
414 * notice, this list of conditions and the following disclaimer.
415 * 2. Redistributions in binary form must reproduce the above copyright
416 * notice, this list of conditions and the following disclaimer in the
417 * documentation and/or other materials provided with the distribution.
418 * 3. The name of the author may not be used to endorse or promote products
419 * derived from this software without specific prior written permission.
421 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
422 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
423 * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
424 * THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
425 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
426 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
427 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
428 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
429 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
430 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
434 * Copy src to string dst of size siz. At most siz-1 characters
435 * will be copied. Always NUL terminates (unless siz == 0).
436 * Returns strlen(src); if retval >= siz, truncation occurred.
439 size_t strlcpy(char *dst
, const char *src
, size_t siz
)
441 register char *d
= dst
;
442 register const char *s
= src
;
443 register size_t n
= siz
;
445 /* Copy as many bytes as will fit */
446 if (n
!= 0 && --n
!= 0) {
448 if ((*d
++ = *s
++) == 0)
453 /* Not enough room in dst, add NUL and traverse rest of src */
456 *d
= '\0'; /* NUL-terminate dst */
461 return s
- src
- 1; /* count does not include NUL */
463 #endif /* HAVE_STRLCPY */