23RCSID(
"$Id: b058182245a8cd0add623d4fda058eafca54f86c $")
25#include <freeradius-devel/missing.h>
30#if !defined(HAVE_CLOCK_GETTIME) && defined(__MACH__)
31# include <mach/mach_time.h>
34#ifndef HAVE_STRNCASECMP
38 unsigned char *p1, *p2;
41 p1 = (
unsigned char *)s1;
42 p2 = (
unsigned char *)s2;
46 if (*p1 == 0 && *p2 == 0)
51 if (islower(c1)) c1 = toupper(c1);
52 if (islower(c2)) c2 = toupper(c2);
54 if ((dif = c1 - c2) != 0)
64#ifndef HAVE_STRCASECMP
86 if (
n == 0)
return NULL;
88 memcpy(&p, &s,
sizeof(p));
89 for (p += (
n - 1); p >= (
uint8_t const *)s; p--)
if (*p == (
uint8_t)c)
return (
void *)p;
100 if (sscanf(cp,
"%d.%d.%d.%d", &a1, &a2, &a3, &a4) != 4)
103 inp->s_addr = htonl((a1 << 24) + (a2 << 16) + (a3 << 8) + a4);
129 if ((s = *stringp) == NULL)
136 if ((
sc = *spanp++) == c) {
151#ifndef HAVE_LOCALTIME_R
164 memcpy(result, localtime(l_clock),
sizeof(*result));
181char *
ctime_r(time_t
const *l_clock,
char *l_buf)
205struct tm *
gmtime_r(time_t
const *l_clock,
struct tm *result)
207 memcpy(result, gmtime(l_clock),
sizeof(*result));
221 if (dup_fd < 0)
return -1;
223 fp = fdopen(dup_fd,
"w");
237#if !defined(HAVE_CLOCK_GETTIME) && defined(__MACH__)
238int clock_gettime(
int clk_id,
struct timespec *t)
240 static mach_timebase_info_data_t timebase;
241 static bool done_init =
false;
246 pthread_mutex_lock(&mutex);
248 mach_timebase_info(&timebase);
251 pthread_mutex_unlock(&mutex);
258 case CLOCK_MONOTONIC:
261 time = mach_absolute_time();
262 double nanoseconds = ((double)time * (
double)timebase.numer)/((
double)timebase.denom);
263 double seconds = ((double)time * (
double)timebase.numer)/((
double)timebase.denom * 1e9);
265 t->tv_nsec = nanoseconds;
279#ifndef HAVE_INET_PTON
286 static char const digits[] =
"0123456789";
292 while (*p && ((off = strchr(digits, *p)) != NULL)) {
294 num += (off - digits);
296 if (num > 255)
return 0;
324 memcpy(dst, &tmp,
sizeof(tmp));
329# ifdef HAVE_STRUCT_SOCKADDR_IN6
343static int inet_pton6(
char const *src,
unsigned char *dst)
345 static char const xdigits_l[] =
"0123456789abcdef",
346 xdigits_u[] =
"0123456789ABCDEF";
347 uint8_t tmp[IN6ADDRSZ], *tp, *endp, *colonp;
348 char const *xdigits, *curtok;
352 memset((tp = tmp), 0, IN6ADDRSZ);
353 endp = tp + IN6ADDRSZ;
362 while ((ch = *src++) !=
'\0') {
365 if ((pch = strchr((xdigits = xdigits_l), ch)) == NULL)
366 pch = strchr((xdigits = xdigits_u), ch);
369 val |= (pch - xdigits);
383 if (tp + INT16SZ > endp)
385 *tp++ = (
uint8_t) (val >> 8) & 0xff;
391 if (ch ==
'.' && ((tp + INADDRSZ) <= endp) &&
392 inet_pton4(curtok, (
struct in_addr *) tp) > 0) {
400 if (tp + INT16SZ > endp)
402 *tp++ = (
uint8_t) (val >> 8) & 0xff;
405 if (colonp != NULL) {
410 int const n = tp - colonp;
413 for (i = 1; i <=
n; i++) {
414 endp[- i] = colonp[
n - i];
422 memcpy(dst, tmp, IN6ADDRSZ);
433 if (af == AF_INET)
return inet_pton4(src, dst);
435# ifdef HAVE_STRUCT_SOCKADDR_IN6
436 if (af == AF_INET6)
return inet_pton6(src, dst);
442#ifndef HAVE_INET_NTOP
447char const *
inet_ntop(
int af,
void const *src,
char *dst,
size_t cnt)
452 if (cnt <= INET_ADDRSTRLEN)
return NULL;
455 ipaddr[0], ipaddr[1],
456 ipaddr[2], ipaddr[3]);
464 if (af == AF_INET6) {
465 struct in6_addr const *ipaddr = src;
467 if (cnt <= INET6_ADDRSTRLEN)
return NULL;
469 snprintf(dst, cnt,
"%x:%x:%x:%x:%x:%x:%x:%x",
508 for (i = 0; i < vlen; i++) {
511 slen = sendmsg(
sockfd, &msgvec[i].msg_hdr, flags);
513 msgvec[i].msg_len = 0;
520 if (i == 0)
return -1;
523 msgvec[i].msg_len = (
unsigned int)slen;
533#ifndef HAVE_CLOSEFROM
547# define CLOSEFROM_DIR "/proc/self/fd"
548# elif defined(__APPLE__)
549# define CLOSEFROM_DIR "/dev/fd"
564 if (fcntl(fd, F_CLOSEM) == 0)
return;
568 maxfd = fcntl(fd, F_F_MAXFD);
569 if (maxfd >= 0)
goto do_close;
573 maxfd = sysconf(_SC_OPEN_MAX);
583 dir = opendir(CLOSEFROM_DIR);
589 while ((dp = readdir(dir)) != NULL) {
590 my_fd = strtol(dp->d_name, &endp, 10);
591 if (my_fd <= 0)
continue;
595 if (my_fd == dirfd(dir))
continue;
597 if ((my_fd >= fd) && (my_fd <= maxfd)) {
598 (void) close((
int) my_fd);
601 (void) closedir(dir);
610 if (fd > maxfd)
return;
615 for (i = fd; i < maxfd; i++) {
623#ifndef HAVE_MEMSET_EXPLICIT
625#ifdef HAVE_EXPLICIT_BZERO
631 if (!len)
return ptr;
633#ifdef HAVE_EXPLICIT_BZERO
634 explicit_bzero(ptr, len);
637 volatile unsigned char *
volatile p = (
volatile unsigned char *
volatile) ptr;
strcpy(log_entry->msg, buffer)
void * memset_explicit(void *ptr, int ch, size_t len)
int inet_pton(int af, char const *src, void *dst)
char const * inet_ntop(int af, void const *src, char *dst, size_t cnt)
int strncasecmp(char *s1, char *s2, int n)
int vdprintf(int fd, char const *format, va_list args)
void * memrchr(void const *s, int c, size_t n)
GNU libc extension on some platforms.
char * strsep(char **stringp, char const *delim)
int strcasecmp(char *s1, char *s2)
struct tm * gmtime_r(time_t const *l_clock, struct tm *result)
struct tm * localtime_r(time_t const *l_clock, struct tm *result)
int sendmmsg(int sockfd, struct mmsghdr *msgvec, unsigned int vlen, int flags)
Emulates the real sendmmsg in userland.
int inet_aton(char const *cp, struct in_addr *inp)
char * ctime_r(time_t const *l_clock, char *l_buf)
static int inet_pton4(char const *src, struct in_addr *dst)
static uint16_t fr_nbo_to_uint16(uint8_t const data[static sizeof(uint16_t)])
Read an unsigned 16bit integer from wire format (big endian)
static const uchar sc[16]
PUBLIC int snprintf(char *string, size_t length, char *format, va_alist)
int format(printf, 5, 0))