2
2
* misc.c Various miscellaneous functions.
4
* Version: $Id: misc.c,v 1.82 2008/01/10 10:13:04 aland Exp $
6
6
* This library is free software; you can redistribute it and/or
7
7
* modify it under the terms of the GNU Lesser General Public
60
60
int rad_lockfd(int fd, int lock_len)
62
#if defined(F_LOCK) && !defined(BSD)
63
63
return lockf(fd, F_LOCK, lock_len);
64
64
#elif defined(LOCK_EX)
65
65
lock_len = lock_len; /* -Wunused */
412
412
hints.ai_family = af;
414
414
if ((error = getaddrinfo(src, NULL, &hints, &res)) != 0) {
415
librad_log("ip_nton: %s", gai_strerror(error));
415
fr_strerror_printf("ip_hton: %s", gai_strerror(error));
462
462
const char *ip_ntoh(const fr_ipaddr_t *src, char *dst, size_t cnt)
464
464
struct sockaddr_storage ss;
465
struct sockaddr_in *s4;
471
if (!fr_dns_lookups) {
472
472
return inet_ntop(src->af, &(src->ipaddr), dst, cnt);
476
memset(&ss, 0, sizeof(ss));
479
s4 = (struct sockaddr_in *)&ss;
480
len = sizeof(struct sockaddr_in);
481
s4->sin_family = AF_INET;
483
memcpy(&s4->sin_addr, &src->ipaddr.ip4addr, 4);
486
#ifdef HAVE_STRUCT_SOCKADDR_IN6
489
struct sockaddr_in6 *s6;
491
s6 = (struct sockaddr_in6 *)&ss;
492
len = sizeof(struct sockaddr_in6);
493
s6->sin6_family = AF_INET6;
494
s6->sin6_flowinfo = 0;
496
memcpy(&s6->sin6_addr, &src->ipaddr.ip6addr, 16);
505
if ((error = getnameinfo((struct sockaddr *)&ss, len, dst, cnt, NULL, 0,
475
if (!fr_ipaddr2sockaddr(src, 0, &ss, &salen)) {
479
if ((error = getnameinfo((struct sockaddr *)&ss, salen, dst, cnt, NULL, 0,
506
480
NI_NUMERICHOST | NI_NUMERICSERV)) != 0) {
507
librad_log("ip_ntoh: %s", gai_strerror(error));
481
fr_strerror_printf("ip_ntoh: %s", gai_strerror(error));
589
int fr_ipaddr2sockaddr(const fr_ipaddr_t *ipaddr, int port,
590
struct sockaddr_storage *sa, socklen_t *salen)
592
if (ipaddr->af == AF_INET) {
593
struct sockaddr_in s4;
597
memset(&s4, 0, sizeof(s4));
598
s4.sin_family = AF_INET;
599
s4.sin_addr = ipaddr->ipaddr.ip4addr;
600
s4.sin_port = htons(port);
601
memset(sa, 0, sizeof(*sa));
602
memcpy(sa, &s4, sizeof(s4));
604
#ifdef HAVE_STRUCT_SOCKADDR_IN6
605
} else if (ipaddr->af == AF_INET6) {
606
struct sockaddr_in6 s6;
610
memset(&s6, 0, sizeof(s6));
611
s6.sin6_family = AF_INET6;
612
s6.sin6_addr = ipaddr->ipaddr.ip6addr;
613
s6.sin6_port = htons(port);
614
memset(sa, 0, sizeof(*sa));
615
memcpy(sa, &s6, sizeof(s6));
625
int fr_sockaddr2ipaddr(const struct sockaddr_storage *sa, socklen_t salen,
626
fr_ipaddr_t *ipaddr, int * port)
629
* FIXME: Check salen against sizeof socket structures.
631
salen = salen; /* -Wunused */
633
if (sa->ss_family == AF_INET) {
634
struct sockaddr_in s4;
636
memcpy(&s4, sa, sizeof(s4));
637
ipaddr->af = AF_INET;
638
ipaddr->ipaddr.ip4addr = s4.sin_addr;
639
if (port) *port = ntohs(s4.sin_port);
641
#ifdef HAVE_STRUCT_SOCKADDR_IN6
642
} else if (sa->ss_family == AF_INET6) {
643
struct sockaddr_in6 s6;
645
memcpy(&s6, sa, sizeof(s6));
646
ipaddr->af = AF_INET6;
647
ipaddr->ipaddr.ip6addr = s6.sin6_addr;
648
if (port) *port = ntohs(s6.sin6_port);