aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarcel Holtmann <marcel@holtmann.org>2010-09-21 14:30:32 +0900
committerMarcel Holtmann <marcel@holtmann.org>2010-09-21 14:30:32 +0900
commit1ee4011fb6801d8d0e138e57e315833b85adef2f (patch)
tree0c76627edff1963a89b50023c2d2fce76c8da3ac
parenta14762690f88123f334be04ffa6d383b69ace4dd (diff)
downloadpacrunner-1ee4011fb6801d8d0e138e57e315833b85adef2f.tar.gz
Use interface parameter to resolve myIpAddress
-rw-r--r--src/mozjs.c37
1 files changed, 30 insertions, 7 deletions
diff --git a/src/mozjs.c b/src/mozjs.c
index b17cda3..d05e3cd 100644
--- a/src/mozjs.c
+++ b/src/mozjs.c
@@ -28,8 +28,12 @@
#include <unistd.h>
#include <string.h>
#include <sys/stat.h>
+#include <sys/ioctl.h>
#include <sys/socket.h>
+
#include <netdb.h>
+#include <arpa/inet.h>
+#include <linux/if_arp.h>
#include <jsapi.h>
@@ -101,6 +105,31 @@ void __pacrunner_mozjs_clear(void)
current_pacfile = NULL;
}
+static int getaddr(const char *node, char *host, size_t hostlen)
+{
+ struct sockaddr_in addr;
+ struct ifreq ifr;
+ int sk, err;
+
+ sk = socket(PF_INET, SOCK_DGRAM, 0);
+ if (sk < 0)
+ return -EIO;
+
+ memset(&ifr, 0, sizeof(ifr));
+ strncpy(ifr.ifr_name, node, sizeof(ifr.ifr_name));
+
+ err = ioctl(sk, SIOCGIFADDR, &ifr);
+
+ close(sk);
+
+ if (err < 0)
+ return -EIO;
+
+ memcpy(&addr, &ifr.ifr_addr, sizeof(addr));
+ snprintf(host, hostlen, "%s", inet_ntoa(addr.sin_addr));
+
+ return 0;
+}
static int resolve(const char *node, char *host, size_t hostlen)
{
struct addrinfo *info;
@@ -123,19 +152,13 @@ static int resolve(const char *node, char *host, size_t hostlen)
static JSBool myipaddress(JSContext *ctx, JSObject *obj, uintN argc,
jsval *argv, jsval *rval)
{
- char hostname[HOST_NAME_MAX];
char address[NI_MAXHOST];
DBG("");
*rval = JSVAL_NULL;
- if (gethostname(hostname, sizeof(hostname)) < 0)
- return TRUE;
-
- DBG("hostname %s", hostname);
-
- if (resolve(hostname, address, sizeof(address)) < 0)
+ if (getaddr(current_interface, address, sizeof(address)) < 0)
return TRUE;
DBG("address %s", address);