| Index: ports/ipython-ppapi/kernel.cc
 | 
| diff --git a/ports/ipython-ppapi/kernel.cc b/ports/ipython-ppapi/kernel.cc
 | 
| new file mode 100644
 | 
| index 0000000000000000000000000000000000000000..e134179e2e53477db32f57bf4ce9ad6342a65339
 | 
| --- /dev/null
 | 
| +++ b/ports/ipython-ppapi/kernel.cc
 | 
| @@ -0,0 +1,173 @@
 | 
| +/* Copyright (c) 2014 Google Inc. All rights reserved.
 | 
| + * Use of this source code is governed by a BSD-style license that can be
 | 
| + * found in the LICENSE file. */
 | 
| +
 | 
| +#include <python2.7/Python.h>
 | 
| +#include <libtar.h>
 | 
| +#include <locale.h>
 | 
| +#include <stdio.h>
 | 
| +#include <fcntl.h>
 | 
| +#include <sys/mount.h>
 | 
| +#include <errno.h>
 | 
| +
 | 
| +#include "ppapi/cpp/var.h"
 | 
| +#include "ppapi/cpp/var_array.h"
 | 
| +#include "ppapi/cpp/var_dictionary.h"
 | 
| +#include "ppapi_simple/ps_interface.h"
 | 
| +
 | 
| +#include "nacl_io/nacl_io.h"
 | 
| +#include "ppapi_simple/ps_main.h"
 | 
| +#include "ppapi_simple/ps_instance.h"
 | 
| +
 | 
| +#ifdef __pnacl__
 | 
| +#define DATA_FILE "pydata_pnacl.tar"
 | 
| +#else
 | 
| +#error "Unknown arch"
 | 
| +#endif
 | 
| +
 | 
| +static int setup_unix_environment() {
 | 
| +    int ret = umount("/");
 | 
| +    if (ret) {
 | 
| +      printf("unmounting root fs failed\n");
 | 
| +      return 1;
 | 
| +    }
 | 
| +
 | 
| +    ret = mount("", "/", "memfs", 0, NULL);
 | 
| +    if (ret) {
 | 
| +      printf("mounting root fs failed\n");
 | 
| +      return 1;
 | 
| +    }
 | 
| +
 | 
| +    const char* data_url = getenv("NACL_DATA_URL");
 | 
| +    if (!data_url)
 | 
| +      data_url = "./";
 | 
| +    mkdir("/mnt/http", 0777);
 | 
| +    ret = mount(data_url, "/mnt/http", "httpfs", 0, "allow_cross_origin_requests:true allow_credentials:false");
 | 
| +    if (ret) {
 | 
| +      printf("mounting http filesystem failed\n");
 | 
| +      return 1;
 | 
| +    }
 | 
| +
 | 
| +    char filename[PATH_MAX];
 | 
| +    strcpy(filename, "/mnt/http/");
 | 
| +    strcat(filename, DATA_FILE);
 | 
| +    TAR* tar;
 | 
| +    ret = tar_open(&tar, filename, NULL, O_RDONLY, 0, 0);
 | 
| +    if (ret) {
 | 
| +      printf("error opening %s\n", filename);
 | 
| +      return 1;
 | 
| +    }
 | 
| +
 | 
| +    mkdir("/lib", 0777);
 | 
| +    ret = tar_extract_all(tar, (char *)"/");
 | 
| +    if (ret) {
 | 
| +      printf("error extracting %s\n", filename);
 | 
| +      return 1;
 | 
| +    }
 | 
| +
 | 
| +    ret = tar_close(tar);
 | 
| +
 | 
| +    setenv("PYTHONHOME", "", 1);
 | 
| +    return 0;
 | 
| +}
 | 
| +
 | 
| +extern "C" {
 | 
| +
 | 
| +  static PyObject * post_json_message(PyObject * self, PyObject * args) {
 | 
| +    char * stream;
 | 
| +    char * json;
 | 
| +    if (!PyArg_ParseTuple(args, "ss", &stream, &json)) {
 | 
| +      return NULL;
 | 
| +    }
 | 
| +
 | 
| +    pp::VarDictionary message;
 | 
| +    message.Set("stream", pp::Var(stream));
 | 
| +    message.Set("json", pp::Var(json));
 | 
| +
 | 
| +    const PPB_Messaging * messaging = PSInterfaceMessaging();
 | 
| +    PP_Instance instance = PSGetInstanceId();
 | 
| +    messaging->PostMessage(instance, message.pp_var());
 | 
| +
 | 
| +    Py_RETURN_NONE;
 | 
| +  }
 | 
| +
 | 
| +  static PyObject * acquire_json_message_wait(PyObject *self, PyObject * args) {
 | 
| +    if (!PyArg_ParseTuple(args, "")) {
 | 
| +      return NULL;
 | 
| +    }
 | 
| +
 | 
| +    const PPB_Messaging * messaging = PSInterfaceMessaging();
 | 
| +    PP_Instance instance = PSGetInstanceId();
 | 
| +    PSEventSetFilter(PSE_INSTANCE_HANDLEMESSAGE);
 | 
| +    PSEvent *event = PSEventWaitAcquire();
 | 
| +    if (event->type != PSE_INSTANCE_HANDLEMESSAGE)
 | 
| +      Py_RETURN_NONE;
 | 
| +
 | 
| +    pp::Var message(event->as_var);
 | 
| +
 | 
| +    if (!message.is_dictionary())
 | 
| +      Py_RETURN_NONE;
 | 
| +
 | 
| +    pp::VarDictionary request(message);
 | 
| +    pp::Var json(request.Get("json"));
 | 
| +    if (!json.is_string())
 | 
| +      Py_RETURN_NONE;
 | 
| +
 | 
| +    return PyString_FromString(json.AsString().c_str());
 | 
| +  }
 | 
| +
 | 
| +}
 | 
| +
 | 
| +static PyMethodDef PPMessageMethods[] = {
 | 
| +  {
 | 
| +    "_PostJSONMessage",
 | 
| +    post_json_message,
 | 
| +    METH_VARARGS,
 | 
| +    "Post a message encoded as JSON"
 | 
| +  },
 | 
| +  {
 | 
| +    "_AcquireJSONMessageWait",
 | 
| +    acquire_json_message_wait,
 | 
| +    METH_VARARGS,
 | 
| +    "Acquire a message encoded as JSON (blocking)"},
 | 
| +  {NULL, NULL, 0, NULL}
 | 
| +};
 | 
| +
 | 
| +int ipython_kernel_main(int argc, char **argv) {
 | 
| +  printf("Setting up unix environment...\n");
 | 
| +  if (setup_unix_environment()) {
 | 
| +    printf("Error: %s\n", strerror(errno));
 | 
| +    return -1;
 | 
| +  }
 | 
| +  printf("done\n");
 | 
| +
 | 
| +  // Initialize Pepper API
 | 
| +  PSInterfaceInit();
 | 
| +
 | 
| +  int quit = 0;
 | 
| +
 | 
| +  while(!quit) {
 | 
| +    // Initialize Python interpreter
 | 
| +    Py_Initialize();
 | 
| +
 | 
| +    // Load module that provides access to Pepper messaging API
 | 
| +    // from within the interpreter
 | 
| +    Py_InitModule("ppmessage", PPMessageMethods);
 | 
| +
 | 
| +     // Run the interpreter main loop.
 | 
| +    const char * main_filename = "/mnt/http/kernel.py";
 | 
| +    FILE *main = fopen(main_filename, "r");
 | 
| +    if (main == NULL) {
 | 
| +      printf("failed to load interpreter code\n");
 | 
| +      return -1;
 | 
| +    }
 | 
| +
 | 
| +    quit = PyRun_SimpleFileEx(main, main_filename, 1);
 | 
| +
 | 
| +    Py_Finalize();
 | 
| +  }
 | 
| +
 | 
| +  return 0;
 | 
| +}
 | 
| +
 | 
| +PPAPI_SIMPLE_REGISTER_MAIN(ipython_kernel_main)
 | 
| 
 |