2 libloc - A library to determine the location of someone on the Internet
4 Copyright (C) 2022 IPFire Development Team <info@ipfire.org>
6 This library is free software; you can redistribute it and/or
7 modify it under the terms of the GNU Lesser General Public
8 License as published by the Free Software Foundation; either
9 version 2.1 of the License, or (at your option) any later version.
11 This library is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 Lesser General Public License for more details.
17 #include <arpa/inet.h>
18 #include <netinet/in.h>
21 #include <libloc/address.h>
23 #define LOC_ADDRESS_BUFFERS 6
24 #define LOC_ADDRESS_BUFFER_LENGTH INET6_ADDRSTRLEN
26 static char __loc_address_buffers
[LOC_ADDRESS_BUFFERS
][LOC_ADDRESS_BUFFER_LENGTH
+ 1];
27 static int __loc_address_buffer_idx
= 0;
29 static const char* __loc_address6_str(const struct in6_addr
* address
, char* buffer
, size_t length
) {
30 return inet_ntop(AF_INET6
, address
, buffer
, length
);
33 static const char* __loc_address4_str(const struct in6_addr
* address
, char* buffer
, size_t length
) {
34 struct in_addr address4
= {
35 .s_addr
= address
->s6_addr32
[3],
38 return inet_ntop(AF_INET
, &address4
, buffer
, length
);
41 const char* loc_address_str(const struct in6_addr
* address
) {
46 char* buffer
= __loc_address_buffers
[__loc_address_buffer_idx
++];
48 // Prevent index from overflow
49 __loc_address_buffer_idx
%= LOC_ADDRESS_BUFFERS
;
51 if (IN6_IS_ADDR_V4MAPPED(address
))
52 return __loc_address4_str(address
, buffer
, LOC_ADDRESS_BUFFER_LENGTH
);
54 return __loc_address6_str(address
, buffer
, LOC_ADDRESS_BUFFER_LENGTH
);