23RCSID(
"$Id: 7a12416e129a840d433e7fa913ba6c5895bc9724 $")
25#include <freeradius-devel/missing.h>
31#if !defined(HAVE_CLOCK_GETTIME) && defined(__MACH__)
32# include <mach/mach_time.h>
35#ifndef HAVE_STRNCASECMP
39 unsigned char *p1, *p2;
42 p1 = (
unsigned char *)s1;
43 p2 = (
unsigned char *)s2;
47 if (*p1 == 0 && *p2 == 0)
52 if (islower(c1)) c1 = toupper(c1);
53 if (islower(c2)) c2 = toupper(c2);
55 if ((dif = c1 - c2) != 0)
65#ifndef HAVE_STRCASECMP
87 if (
n == 0)
return NULL;
89 memcpy(&p, &s,
sizeof(p));
90 for (p += (
n - 1); p >= (
uint8_t const *)s; p--)
if (*p == (
uint8_t)c)
return (
void *)p;
101 if (sscanf(cp,
"%d.%d.%d.%d", &a1, &a2, &a3, &a4) != 4)
104 inp->s_addr = htonl((a1 << 24) + (a2 << 16) + (a3 << 8) + a4);
130 if ((s = *stringp) == NULL)
137 if ((
sc = *spanp++) == c) {
152#ifndef HAVE_LOCALTIME_R
165 memcpy(result, localtime(l_clock),
sizeof(*result));
182char *
ctime_r(time_t
const *l_clock,
char *l_buf)
206struct tm *
gmtime_r(time_t
const *l_clock,
struct tm *result)
208 memcpy(result, gmtime(l_clock),
sizeof(*result));
222 if (dup_fd < 0)
return -1;
224 fp = fdopen(dup_fd,
"w");
238#if !defined(HAVE_CLOCK_GETTIME) && defined(__MACH__)
239int clock_gettime(
int clk_id,
struct timespec *t)
241 static mach_timebase_info_data_t timebase;
242 static bool done_init =
false;
247 pthread_mutex_lock(&mutex);
249 mach_timebase_info(&timebase);
252 pthread_mutex_unlock(&mutex);
259 case CLOCK_MONOTONIC:
262 time = mach_absolute_time();
263 double nanoseconds = ((double)time * (
double)timebase.numer)/((
double)timebase.denom);
264 double seconds = ((double)time * (
double)timebase.numer)/((
double)timebase.denom * 1e9);
266 t->tv_nsec = nanoseconds;
280#ifndef HAVE_INET_PTON
287 static char const digits[] =
"0123456789";
293 while (*p && ((off = strchr(digits, *p)) != NULL)) {
295 num += (off - digits);
297 if (num > 255)
return 0;
325 memcpy(dst, &tmp,
sizeof(tmp));
330# ifdef HAVE_STRUCT_SOCKADDR_IN6
344static int inet_pton6(
char const *src,
unsigned char *dst)
346 static char const xdigits_l[] =
"0123456789abcdef",
347 xdigits_u[] =
"0123456789ABCDEF";
348 uint8_t tmp[IN6ADDRSZ], *tp, *endp, *colonp;
349 char const *xdigits, *curtok;
353 memset((tp = tmp), 0, IN6ADDRSZ);
354 endp = tp + IN6ADDRSZ;
363 while ((ch = *src++) !=
'\0') {
366 if ((pch = strchr((xdigits = xdigits_l), ch)) == NULL)
367 pch = strchr((xdigits = xdigits_u), ch);
370 val |= (pch - xdigits);
384 if (tp + INT16SZ > endp)
386 *tp++ = (
uint8_t) (val >> 8) & 0xff;
392 if (ch ==
'.' && ((tp + INADDRSZ) <= endp) &&
393 inet_pton4(curtok, (
struct in_addr *) tp) > 0) {
401 if (tp + INT16SZ > endp)
403 *tp++ = (
uint8_t) (val >> 8) & 0xff;
406 if (colonp != NULL) {
411 int const n = tp - colonp;
414 for (i = 1; i <=
n; i++) {
415 endp[- i] = colonp[
n - i];
423 memcpy(dst, tmp, IN6ADDRSZ);
434 if (af == AF_INET)
return inet_pton4(src, dst);
436# ifdef HAVE_STRUCT_SOCKADDR_IN6
437 if (af == AF_INET6)
return inet_pton6(src, dst);
443#ifndef HAVE_INET_NTOP
448char const *
inet_ntop(
int af,
void const *src,
char *dst,
size_t cnt)
453 if (cnt <= INET_ADDRSTRLEN)
return NULL;
456 ipaddr[0], ipaddr[1],
457 ipaddr[2], ipaddr[3]);
465 if (af == AF_INET6) {
466 struct in6_addr const *ipaddr = src;
468 if (cnt <= INET6_ADDRSTRLEN)
return NULL;
470 snprintf(dst, cnt,
"%x:%x:%x:%x:%x:%x:%x:%x",
509 for (i = 0; i < vlen; i++) {
512 slen = sendmsg(
sockfd, &msgvec[i].msg_hdr, flags);
514 msgvec[i].msg_len = 0;
521 if (i == 0)
return -1;
524 msgvec[i].msg_len = (
unsigned int)slen;
534#ifndef HAVE_CLOSEFROM
548# define CLOSEFROM_DIR "/proc/self/fd"
549# elif defined(__APPLE__)
550# define CLOSEFROM_DIR "/dev/fd"
565 if (fcntl(fd, F_CLOSEM) == 0)
return;
569 maxfd = fcntl(fd, F_F_MAXFD);
570 if (maxfd >= 0)
goto do_close;
574 maxfd = sysconf(_SC_OPEN_MAX);
584 dir = opendir(CLOSEFROM_DIR);
590 while ((dp = readdir(dir)) != NULL) {
591 my_fd = strtol(dp->d_name, &endp, 10);
592 if (my_fd <= 0)
continue;
596 if (my_fd == dirfd(dir))
continue;
598 if ((my_fd >= fd) && (my_fd <= maxfd)) {
599 (void) close((
int) my_fd);
602 (void) closedir(dir);
611 if (fd > maxfd)
return;
616 for (i = fd; i < maxfd; i++) {
624#ifndef HAVE_MEMSET_EXPLICIT
626#ifdef HAVE_EXPLICIT_BZERO
632 if (!len)
return ptr;
634#ifdef HAVE_EXPLICIT_BZERO
635 explicit_bzero(ptr, len);
638 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))