28 #define ASTMM_LIBC ASTMM_IGNORE 33 #include <sys/resource.h> 34 #include <sys/types.h> 41 #define POLL_SIZE 1024 44 char *
strsep(
char **
str,
const char *delims)
54 while (**str !=
'\0') {
55 if (strchr(delims, **str)) {
76 if (!overwrite && getenv(
name))
79 buflen = strlen(
name) + strlen(
value) + 2;
82 snprintf(buf, buflen,
"%s=%s",
name,
value);
91 return setenv(name,
"", 0);
95 #ifndef HAVE_STRCASESTR 96 static char *upper(
const char *orig,
char *
buf,
int bufsize)
100 while (i < (bufsize - 1) && orig[i]) {
101 buf[i] = toupper(orig[i]);
110 char *
strcasestr(
const char *haystack,
const char *needle)
114 int u1len = strlen(haystack) + 1, u2len = strlen(needle) + 1;
122 offset = strstr(upper(haystack, u1, u1len), upper(needle, u2, u2len));
125 return ((
char *)((
unsigned long)haystack + (
unsigned long)(offset - u1)));
133 size_t strnlen(
const char *s,
size_t n)
137 for (len = 0; len < n; len++)
145 #if !defined(HAVE_STRNDUP) 146 char *
strndup(
const char *s,
size_t n)
149 char *
new =
malloc(len + 1);
155 return memcpy(
new, s, len);
159 #if !defined(HAVE_VASPRINTF) 160 int vasprintf(
char **strp,
const char *fmt, va_list ap)
168 size = vsnprintf(&s, 1, fmt, ap2);
173 vsnprintf(*strp, size + 1, fmt, ap);
179 #ifndef HAVE_TIMERSUB 180 void timersub(
struct timeval *tvend,
struct timeval *tvstart,
struct timeval *tvdiff)
182 tvdiff->tv_sec = tvend->tv_sec - tvstart->tv_sec;
183 tvdiff->tv_usec = tvend->tv_usec - tvstart->tv_usec;
184 if (tvdiff->tv_usec < 0) {
186 tvdiff->tv_usec += 1000000;
211 #if !defined(HAVE_ASPRINTF) 228 #define LONG_MIN (-9223372036854775807L-1L) 232 #define LONG_MAX 9223372036854775807L 242 uint64_t
strtoq(
const char *nptr,
char **endptr,
int base)
247 uint64_t qbase, cutoff;
248 int neg, any, cutlim;
258 }
while (isspace(c));
267 if ((base == 0 || base == 16) &&
268 c ==
'\0' && (*s ==
'x' || *s ==
'X')) {
274 base = c ==
'\0' ? 8 : 10;
294 qbase = (unsigned)base;
295 cutoff = neg ? (uint64_t)-(LONG_MIN + LONG_MAX) + LONG_MAX : LONG_MAX;
296 cutlim = cutoff % qbase;
298 for (acc = 0, any = 0;; c = *s++) {
304 c -= isupper(c) ?
'A' - 10 :
'a' - 10;
309 if (any < 0 || acc > cutoff || (acc == cutoff && c > cutlim))
318 acc = neg ? LONG_MIN : LONG_MAX;
322 *((
const char **)endptr) = any ? s - 1 : nptr;
327 #ifndef HAVE_GETLOADAVG 333 double avg[3] = { 0.0, 0.0, 0.0 };
336 if ((LOADAVG = fopen(
"/proc/loadavg",
"r"))) {
337 fscanf(LOADAVG,
"%lf %lf %lf", &avg[0], &avg[1], &avg[2]);
342 for (i = 0; (i < nelem) && (i < 3); i++) {
355 for (i = 0; i < nelem; i++) {
366 #if BYTE_ORDER == BIG_ENDIAN 368 #elif BYTE_ORDER == LITTLE_ENDIAN 375 (((uint64_t)
number.c[0]) << 56) |
376 (((uint64_t)
number.c[1]) << 48) |
377 (((uint64_t)
number.c[2]) << 40) |
378 (((uint64_t)
number.c[3]) << 32) |
379 (((uint64_t)
number.c[4]) << 24) |
380 (((uint64_t)
number.c[5]) << 16) |
381 (((uint64_t)
number.c[6]) << 8) |
382 (((uint64_t)
number.c[7]) << 0);
384 #error "Unknown byte order" 392 #if BYTE_ORDER == BIG_ENDIAN 394 #elif BYTE_ORDER == LITTLE_ENDIAN 401 (((uint64_t)
number.c[0]) << 56) |
402 (((uint64_t)
number.c[1]) << 48) |
403 (((uint64_t)
number.c[2]) << 40) |
404 (((uint64_t)
number.c[3]) << 32) |
405 (((uint64_t)
number.c[4]) << 24) |
406 (((uint64_t)
number.c[5]) << 16) |
407 (((uint64_t)
number.c[6]) << 8) |
408 (((uint64_t)
number.c[7]) << 0);
410 #error "Unknown byte order" 416 int ffsll(
long long n)
419 for (i = 0; i < 64; i++) {
420 if ((1LL << i) & n) {
428 #ifndef HAVE_CLOSEFROM 435 struct pollfd fds[POLL_SIZE];
436 int fd=n, loopmax, i;
437 #ifndef STRICT_COMPAT 442 if (getrlimit(RLIMIT_NOFILE, &rl) == -1) {
448 maxfd = sysconf (_SC_OPEN_MAX);
451 if (maxfd == -1 || maxfd > 65536) {
466 loopmax = maxfd - fd;
467 if (loopmax > POLL_SIZE) {
470 for (i = 0; i < loopmax; i++) {
474 poll(fds, loopmax, 0);
475 for (i = 0; i < loopmax; i++) {
476 if (fds[i].revents == POLLNVAL) {
486 flags = fcntl(fds[i].fd, F_GETFD);
487 if (flags == -1 &&
errno == EBADF) {
490 fcntl(fds[i].fd, F_SETFD, flags | FD_CLOEXEC);
517 #define MKTEMP_NAME 0 518 #define MKTEMP_FILE 1 521 #define TEMPCHARS "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_." 522 #define NUM_CHARS (sizeof(TEMPCHARS) - 1) 524 static int mktemp_internal(
char *path,
int slen,
int mode)
526 char *start, *cp, *ep;
527 const char *tempchars = TEMPCHARS;
528 unsigned int r, tries;
534 if (len == 0 || slen >= len) {
538 ep = path + len - slen;
541 for (start = ep; start > path && start[-1] ==
'X'; start--) {
542 if (tries < INT_MAX / NUM_CHARS) {
549 for (cp = start; cp != ep; cp++) {
556 if (lstat(path, &sb) != 0) {
557 return (
errno == ENOENT ? 0 : -1);
561 fd = open(path, O_CREAT | O_EXCL | O_RDWR, S_IRUSR | S_IWUSR);
562 if (fd != -1 ||
errno != EEXIST) {
567 if (mkdir(path, S_IRUSR | S_IWUSR | S_IXUSR) == 0) {
570 if (
errno != EEXIST) {
583 return mktemp_internal(path, 0, MKTEMP_DIR) ?
NULL : path;
591 return (
float)(int)((x) - 0.5);
593 return (
float)(int)((x) + 0.5);
Asterisk main include file. File version handling, generic pbx functions.
size_t strnlen(const char *, size_t)
char * strndup(const char *, size_t)
int vasprintf(char **strp, const char *fmt, va_list ap)
void timersub(struct timeval *tvend, struct timeval *tvstart, struct timeval *tvdiff)
long int ast_random(void)
#define ast_alloca(size)
call __builtin_alloca to ensure we get gcc builtin semantics
char * mkdtemp(char *template_s)
static int len(struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t buflen)
char * strcasestr(const char *, const char *)
uint64_t htonll(uint64_t host64)
char * strsep(char **str, const char *delims)
int getloadavg(double *list, int nelem)
int setenv(const char *name, const char *value, int overwrite)
int asprintf(char **str, const char *fmt,...)
uint64_t ntohll(uint64_t net64)
uint64_t strtoq(const char *nptr, char **endptr, int base)
int unsetenv(const char *name)