summaryrefslogtreecommitdiffstats
path: root/force-ip-protocol-ipv4-or-ipv6.c
blob: bd366ff8162ff0a628ac524535f520df4182e8f3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
/*
   force-ip-protocol
   Copyright (C) 2023 Thorsten Alteholz

   This program is free software: you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation, version 2 of the License.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program.  If not, see <http://www.gnu.org/licenses/>.

   usage: LD_PRELOAD=/path/to/library.so program args ...
 */

#include <config.h>

#ifdef HAVE_SYS_SOCKET_H
 #include <sys/socket.h>
#endif

#ifdef HAVE_NETDB_H
 #include <netdb.h>
#endif

#ifdef HAVE_DLFCN_H
 #include <dlfcn.h>
#endif

int getaddrinfo(const char *hostname, const char *servname,
		const struct addrinfo *hints, struct addrinfo **res)
{
	int (*getaddrinfo_org)();
	struct addrinfo *hints2 = (struct addrinfo *) hints;

	getaddrinfo_org = dlsym(RTLD_NEXT, "getaddrinfo");
#if defined USE_IPV4
	hints2->ai_family = PF_INET;
#elif defined USE_IPV6
	hints2->ai_family = PF_INET6;
#else
#error You must define either USE_IPV4 or USE_IPV6.
#endif

	return (getaddrinfo_org(hostname, servname, hints2, res));
}