Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/rofl0r/proxychains-ng.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrofl0r <rofl0r@users.noreply.github.com>2022-01-25 17:51:27 +0300
committerrofl0r <rofl0r@users.noreply.github.com>2022-01-25 18:42:55 +0300
commit07c15a02f6890f56aa0b9341c27fc889956ab114 (patch)
tree4c336f272824f93811a9902faa2d910af0577e4a
parent2cc014995e9ad038e2553a455ed914d1ad32fe49 (diff)
add configure check for non-POSIX compliant getnameinfo signature
- glibc < 2.14 uses "unsigned" instead of "int" for flags - openbsd and freebsd use "size_t" instead of socklen_t for servlen and nodelen, while still using socklen_t for salen. closes #430
-rwxr-xr-xconfigure16
-rw-r--r--src/core.h2
-rw-r--r--src/libproxychains.c4
3 files changed, 19 insertions, 3 deletions
diff --git a/configure b/configure
index 4c8bcbc..0102eb2 100755
--- a/configure
+++ b/configure
@@ -175,6 +175,22 @@ ishaiku() {
check_compile 'whether C compiler works' '' 'int main() {return 0;}' || fail 'error: install a C compiler and library'
+if ! check_compile 'whether getnameinfo() servlen argument is POSIX compliant (socklen_t)' "-DGN_NODELEN_T=socklen_t -DGN_SERVLEN_T=socklen_t -DGN_FLAGS_T=int" \
+'#define _GNU_SOURCE\n#include <netdb.h>\nint getnameinfo(const struct sockaddr *, socklen_t, char *, socklen_t, char *, socklen_t, int);int main() {\nreturn 0;}' ; then
+ # GLIBC < 2.14
+ if ! check_compile 'whether getnameinfo() flags argument is unsigned' "-DGN_NODELEN_T=socklen_t -DGN_SERVLEN_T=socklen_t -DGN_FLAGS_T=unsigned" \
+ '#define _GNU_SOURCE\n#include <netdb.h>\nint getnameinfo(const struct sockaddr *, socklen_t, char *, socklen_t, char *, socklen_t, unsigned);int main() {\nreturn 0;}' ; then
+ if ! check_compile 'whether getnameinfo() servlen argument is size_t' "-DGN_NODELEN_T=socklen_t -DGN_SERVLEN_T=size_t -DGN_FLAGS_T=int" \
+ '#define _GNU_SOURCE\n#include <netdb.h>\nint getnameinfo(const struct sockaddr *, socklen_t, char *, socklen_t, char *, size_t, int);int main() {\nreturn 0;}' ; then
+ # OpenBSD & FreeBSD
+ if ! check_compile 'whether getnameinfo() servlen and nodelen argument is size_t' "-DGN_NODELEN_T=size_t -DGN_SERVLEN_T=size_t -DGN_FLAGS_T=int" \
+ '#define _GNU_SOURCE\n#include <netdb.h>\nint getnameinfo(const struct sockaddr *, socklen_t, char *, size_t, char *, size_t, int);int main() {\nreturn 0;}' ; then
+ fail "failed to detect getnameinfo signature"
+ fi
+ fi
+ fi
+fi
+
check_compile 'whether we have GNU-style getservbyname_r()' "-DHAVE_GNU_GETSERVBYNAME_R" \
'#define _GNU_SOURCE\n#include <netdb.h>\nint main() {\nstruct servent *se = 0;struct servent se_buf;char buf[1024];\ngetservbyname_r("foo", (void*) 0, &se_buf, buf, sizeof(buf), &se);\nreturn 0;}'
diff --git a/src/core.h b/src/core.h
index 31f3003..3045b86 100644
--- a/src/core.h
+++ b/src/core.h
@@ -109,7 +109,7 @@ typedef int (*getaddrinfo_t)(const char *, const char *, const struct addrinfo *
struct addrinfo **);
typedef int (*getnameinfo_t) (const struct sockaddr *, socklen_t, char *,
- socklen_t, char *, socklen_t, int);
+ GN_NODELEN_T, char *, GN_SERVLEN_T, GN_FLAGS_T);
typedef ssize_t (*sendto_t) (int sockfd, const void *buf, size_t len, int flags,
const struct sockaddr *dest_addr, socklen_t addrlen);
diff --git a/src/libproxychains.c b/src/libproxychains.c
index 001ffcd..578ff84 100644
--- a/src/libproxychains.c
+++ b/src/libproxychains.c
@@ -729,8 +729,8 @@ HOOKFUNC(void, freeaddrinfo, struct addrinfo *res) {
}
HOOKFUNC(int, getnameinfo, const struct sockaddr *sa, socklen_t salen,
- char *host, socklen_t hostlen, char *serv,
- socklen_t servlen, int flags)
+ char *host, GN_NODELEN_T hostlen, char *serv,
+ GN_SERVLEN_T servlen, GN_FLAGS_T flags)
{
INIT();
PFUNC();