1
0
mirror of https://git.FreeBSD.org/ports.git synced 2024-12-16 03:24:07 +00:00
freebsd-ports/net/socketbind/files/socketbind.c
Edwin Groothuis fd7e8698ab socketbind - new port submission
This library allows you to bind any application which is
	dynamically linked with libc to certain IP address.  It
	provides convient way to bind socket's source IP to one of
	the multiple IP's available on computer.

PR:		ports/50147
Submitted by:	Gaspar Chilingarov <nm@web.am>
2003-04-01 00:49:48 +00:00

47 lines
1.0 KiB
C

#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <dlfcn.h>
static void *socket_p, *dl_handle;
static struct sockaddr_in bind_addr;
static int do_bind;
int socket(int domain, int type, int protocol) {
auto int res;
if (dl_handle == NULL) {
char *str;
dl_handle = dlopen("/usr/lib/libc.so", RTLD_LAZY);
if (dl_handle == NULL)
return -1;
socket_p = dlsym(dl_handle, "socket");
if (!socket_p)
return -1;
#ifdef DEBUG
printf("Loaded socket %x\n", socket_p);
#endif
if ((str = getenv("BINDTO")) != NULL) {
#ifdef DEBUG
printf("Thinking about bind\n");
#endif
if (ascii2addr(AF_INET, str, &bind_addr.sin_addr)) {
do_bind = 1;
bind_addr.sin_len = INET_ADDRSTRLEN;
bind_addr.sin_family = AF_INET;
#ifdef DEBUG
printf("WILL DO BIND %s, %x\n", str, bind_addr.sin_addr.s_addr);
#endif
}
}
}
res = ((int(*)(int a, int b, int c))socket_p)(domain, type, protocol);
if (do_bind) {
bind(res, (struct sockaddr*)&bind_addr, INET_ADDRSTRLEN);
}
return res;
};