aboutsummaryrefslogtreecommitdiffstats
path: root/plugins/mozjs.cc
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/mozjs.cc')
-rw-r--r--plugins/mozjs.cc253
1 files changed, 0 insertions, 253 deletions
diff --git a/plugins/mozjs.cc b/plugins/mozjs.cc
deleted file mode 100644
index e10b297..0000000
--- a/plugins/mozjs.cc
+++ /dev/null
@@ -1,253 +0,0 @@
-/*
- *
- * PACrunner - Proxy configuration daemon
- *
- * Copyright (C) 2010-2011 Intel Corporation. All rights reserved.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
- * 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, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- *
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <errno.h>
-#include <unistd.h>
-#include <string.h>
-#include <pthread.h>
-
-#include <netdb.h>
-
-#pragma GCC diagnostic ignored "-Wredundant-decls"
-#pragma GCC diagnostic ignored "-Winvalid-offsetof"
-#include <jsapi.h>
-#pragma GCC diagnostic error "-Wredundant-decls"
-#pragma GCC diagnostic error "-Winvalid-offsetof"
-
-extern "C" {
-#include "pacrunner.h"
-#include "js.h"
-}
-
-static pthread_mutex_t mozjs_mutex = PTHREAD_MUTEX_INITIALIZER;
-
-struct pacrunner_mozjs {
- struct pacrunner_proxy *proxy;
- JSContext *jsctx;
- JSObject *jsobj;
- JSAutoCompartment *jsac;
-};
-
-static bool myipaddress(JSContext *jsctx, unsigned argc, jsval *vp)
-{
- struct pacrunner_mozjs *ctx = (pacrunner_mozjs *)JS_GetContextPrivate(jsctx);
- char address[NI_MAXHOST];
-
- DBG("");
-
- JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
-
- args.rval().setNull();
-
- if (!ctx)
- return true;
-
- if (__pacrunner_js_getipaddr(ctx->proxy, address, sizeof(address)) < 0)
- return true;
-
- DBG("address %s", address);
-
- args.rval().setString(JS_NewStringCopyZ(jsctx,address));
-
- return true;
-}
-
-static bool dnsresolve(JSContext *jsctx, unsigned argc, jsval *vp)
-{
- struct pacrunner_mozjs *ctx = (pacrunner_mozjs *)JS_GetContextPrivate(jsctx);
- char address[NI_MAXHOST];
- JS::CallArgs args = JS::CallArgsFromVp(argc,vp);
- char * host = JS_EncodeString(jsctx, args[0].toString());
-
- DBG("host %s", host);
-
- if (!ctx)
- goto out;
-
- if (__pacrunner_js_resolve(ctx->proxy, host, address, sizeof(address)) < 0)
- goto out;
-
- DBG("address %s", address);
-
- args.rval().setString(JS_NewStringCopyZ(jsctx,address));
-
- out:
- JS_free(jsctx, host);
- return true;
-
-}
-
-static JSClass jscls = {
- "global", JSCLASS_GLOBAL_FLAGS,
-};
-
-static JSRuntime *jsrun;
-
-static int create_object(struct pacrunner_proxy *proxy)
-{
- struct pacrunner_mozjs *ctx;
- const char *script;
-
- script = pacrunner_proxy_get_script(proxy);
- if (!script)
- return 0;
-
- ctx = (pacrunner_mozjs *)g_malloc0(sizeof(struct pacrunner_mozjs));
-
- ctx->proxy = proxy;
- ctx->jsctx = JS_NewContext(jsrun, 8 * 1024);
- if (!ctx->jsctx) {
- g_free(ctx);
- return -ENOMEM;
- }
- JS_SetContextPrivate(ctx->jsctx, ctx);
- __pacrunner_proxy_set_jsctx(proxy, ctx);
-
- JS::CompartmentOptions compart_opts;
- compart_opts.setVersion(JSVERSION_LATEST);
- ctx->jsobj = JS_NewGlobalObject(ctx->jsctx, &jscls, nullptr,
- JS::DontFireOnNewGlobalHook, compart_opts);
- JS::RootedObject jsobj(ctx->jsctx,ctx->jsobj);
-
- ctx->jsac = new JSAutoCompartment(ctx->jsctx, jsobj);
-
- if (!JS_InitStandardClasses(ctx->jsctx, jsobj))
- pacrunner_error("Failed to init JS standard classes");
-
- JS_DefineFunction(ctx->jsctx, jsobj, "myIpAddress", myipaddress, 0, 0);
- JS_DefineFunction(ctx->jsctx, jsobj, "dnsResolve", dnsresolve, 1, 0);
-
- JS::RootedValue rval(ctx->jsctx);
- JS::CompileOptions opts(ctx->jsctx);
- opts.setIntroductionType("pacrunner")
- .setUTF8(true)
- .setCompileAndGo(true);
-
- JS::Evaluate(ctx->jsctx, JS::HandleObject(jsobj), opts,
- __pacrunner_js_routines, strlen(__pacrunner_js_routines)
- , &rval);
-
- JS::Evaluate(ctx->jsctx, jsobj, opts, script, strlen(script), &rval);
-
- return 0;
-}
-
-static int mozjs_clear_proxy(struct pacrunner_proxy *proxy)
-{
- struct pacrunner_mozjs *ctx = (pacrunner_mozjs *)__pacrunner_proxy_get_jsctx(proxy);
-
- DBG("proxy %p ctx %p", proxy, ctx);
-
- if (!ctx)
- return -EINVAL;
-
- delete ctx->jsac;
- JS_DestroyContext(ctx->jsctx);
- __pacrunner_proxy_set_jsctx(proxy, NULL);
- g_free(ctx);
-
- return 0;
-}
-
-static int mozjs_set_proxy(struct pacrunner_proxy *proxy)
-{
- DBG("proxy %p", proxy);
- if (!proxy)
- return 0;
-
- mozjs_clear_proxy(proxy);
-
- return create_object(proxy);
-}
-
-static char * mozjs_execute(struct pacrunner_proxy *proxy, const char *url,
- const char *host)
-{
- struct pacrunner_mozjs *ctx = (pacrunner_mozjs *)__pacrunner_proxy_get_jsctx(proxy);
- bool result;
- char *answer, *g_answer;
- DBG("proxy %p ctx %p url %s host %s", proxy, ctx, url, host);
-
- if (!ctx)
- return NULL;
-
- pthread_mutex_lock(&mozjs_mutex);
-
- JS_BeginRequest(ctx->jsctx);
- JS::RootedValue rval(ctx->jsctx);
- JS::AutoValueArray<2> args(ctx->jsctx);
-
- args[0].setString(JS_NewStringCopyZ(ctx->jsctx, url));
- args[1].setString(JS_NewStringCopyZ(ctx->jsctx, host));
-
-
- JS::RootedObject jsobj(ctx->jsctx,ctx->jsobj);
-
- result = JS_CallFunctionName(ctx->jsctx, jsobj, "FindProxyForURL", args , &rval);
-
- JS_EndRequest(ctx->jsctx);
-
- JS_MaybeGC(ctx->jsctx);
-
- pthread_mutex_unlock(&mozjs_mutex);
-
- if (result) {
- answer = JS_EncodeString(ctx->jsctx, rval.toString());
- g_answer = g_strdup(answer);
- JS_free(ctx->jsctx, answer);
- return g_answer;
- }
-
- return NULL;
-}
-
-static struct pacrunner_js_driver mozjs_driver = {
- .name = "mozjs",
- .priority = PACRUNNER_JS_PRIORITY_DEFAULT,
- .set_proxy = mozjs_set_proxy,
- .clear_proxy = mozjs_clear_proxy,
- .execute = mozjs_execute,
-};
-
-static int mozjs_init(void)
-{
- DBG("");
- JS_Init();
- jsrun = JS_NewRuntime(JS::DefaultHeapMaxBytes, 8 * 1024 * 1024 );
-
- return pacrunner_js_driver_register(&mozjs_driver);
-}
-
-static void mozjs_exit(void)
-{
- DBG("");
-
- pacrunner_js_driver_unregister(&mozjs_driver);
-
- JS_DestroyRuntime(jsrun);
- JS_ShutDown();
-}
-
-PACRUNNER_PLUGIN_DEFINE(mozjs, mozjs_init, mozjs_exit)