From d37b07a40813cdc8541fe6449739679bf3818b97 Mon Sep 17 00:00:00 2001 From: David Woodhouse Date: Tue, 16 Aug 2016 17:01:34 +0100 Subject: js: add __pacrunner_js_getipaddr() function Remove the duplicate definitions from mozjs and v8 plugins --- plugins/mozjs.c | 36 +----------------------------------- plugins/v8.cc | 35 +---------------------------------- src/js.h | 2 ++ src/js_funcs.c | 44 ++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 48 insertions(+), 69 deletions(-) diff --git a/plugins/mozjs.c b/plugins/mozjs.c index b980d9d..2720cac 100644 --- a/plugins/mozjs.c +++ b/plugins/mozjs.c @@ -26,12 +26,9 @@ #include #include #include -#include #include #include -#include -#include #pragma GCC diagnostic ignored "-Wredundant-decls" #include @@ -48,32 +45,6 @@ struct pacrunner_mozjs { JSObject *jsobj; }; -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; @@ -96,7 +67,6 @@ static int resolve(const char *node, char *host, size_t hostlen) static JSBool myipaddress(JSContext *jsctx, uintN argc, jsval *vp) { struct pacrunner_mozjs *ctx = JS_GetContextPrivate(jsctx); - const char *interface; char address[NI_MAXHOST]; DBG(""); @@ -106,11 +76,7 @@ static JSBool myipaddress(JSContext *jsctx, uintN argc, jsval *vp) if (!ctx) return JS_TRUE; - interface = pacrunner_proxy_get_interface(ctx->proxy); - if (!interface) - return JS_TRUE; - - if (getaddr(interface, address, sizeof(address)) < 0) + if (__pacrunner_js_getipaddr(ctx->proxy, address, sizeof(address)) < 0) return JS_TRUE; DBG("address %s", address); diff --git a/plugins/v8.cc b/plugins/v8.cc index ebb88a6..954239d 100644 --- a/plugins/v8.cc +++ b/plugins/v8.cc @@ -27,11 +27,8 @@ #include #include #include -#include #include -#include -#include #include @@ -51,32 +48,6 @@ static gboolean v8_gc(gpointer user_data) return !v8::V8::IdleNotification(); } -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; @@ -106,11 +77,7 @@ static v8::Handle myipaddress(const v8::Arguments& args) if (current_proxy == NULL) return v8::ThrowException(v8::String::New("No current proxy")); - interface = pacrunner_proxy_get_interface(current_proxy); - if (interface == NULL) - return v8::ThrowException(v8::String::New("Error fetching interface")); - - if (getaddr(interface, address, sizeof(address)) < 0) + if (__pacrunner_js_getipaddr(current_proxy, address, sizeof(address)) < 0) return v8::ThrowException(v8::String::New("Error fetching IP address")); DBG("address %s", address); diff --git a/src/js.h b/src/js.h index f14e796..9941a0b 100644 --- a/src/js.h +++ b/src/js.h @@ -36,4 +36,6 @@ int pacrunner_js_driver_register(struct pacrunner_js_driver *driver); void pacrunner_js_driver_unregister(struct pacrunner_js_driver *driver); /* Common functions for JS plugins */ +int __pacrunner_js_getipaddr(struct pacrunner_proxy *proxy, char *host, + size_t hostlen); extern const char __pacrunner_js_routines[]; diff --git a/src/js_funcs.c b/src/js_funcs.c index 6e9cf1e..d8204e5 100644 --- a/src/js_funcs.c +++ b/src/js_funcs.c @@ -23,6 +23,50 @@ #include #endif +#include +#include +#include +#include +#include + +#include +#include + +#include "pacrunner.h" +#include "js.h" + +int __pacrunner_js_getipaddr(struct pacrunner_proxy *proxy, char *host, + size_t hostlen) +{ + const char *interface; + struct sockaddr_in addr; + struct ifreq ifr; + int sk, err; + + interface = pacrunner_proxy_get_interface(proxy); + if (!interface) + return -EINVAL; + + sk = socket(PF_INET, SOCK_DGRAM, 0); + if (sk < 0) + return -EIO; + + memset(&ifr, 0, sizeof(ifr)); + strncpy(ifr.ifr_name, interface, 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; +} + const char __pacrunner_js_routines[] = "function dnsDomainIs(host, domain) {\n" \ " return (host.length >= domain.length &&\n" \ -- cgit 1.2.3-korg