blob: 9701bbd248512d8057a42ba79e0cc0da745a324e [file] [log] [blame]
// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include <fcntl.h>
#include "base/files/file_util.h"
#include "base/message_loop/message_loop.h"
#include "mojo/application/content_handler_factory.h"
#include "mojo/data_pipe_utils/data_pipe_utils.h"
#include "mojo/message_pump/message_pump_mojo.h"
#include "mojo/nacl/nonsfi/nexe_launcher_nonsfi.h"
#include "mojo/public/c/system/main.h"
#include "mojo/public/cpp/application/application_impl_base.h"
#include "mojo/public/cpp/application/run_application.h"
namespace nacl {
namespace content_handler {
class NaClContentHandler : public mojo::ApplicationImplBase,
public mojo::ContentHandlerFactory::Delegate {
public:
NaClContentHandler() {}
private:
// Overridden from ApplicationImplBase:
bool OnAcceptConnection(
mojo::ServiceProviderImpl* service_provider_impl) override {
service_provider_impl->AddService<mojo::ContentHandler>(
mojo::ContentHandlerFactory::GetInterfaceRequestHandler(this));
return true;
}
// Overridden from ContentHandlerFactory::Delegate:
void RunApplication(
mojo::InterfaceRequest<mojo::Application> application_request,
mojo::URLResponsePtr response) override {
// Needed to use Mojo interfaces on this thread.
base::MessageLoop loop(mojo::common::MessagePumpMojo::Create());
// Acquire the nexe.
base::ScopedFILE nexe_fp =
mojo::common::BlockingCopyToTempFile(response->body.Pass());
CHECK(nexe_fp) << "Could not redirect nexe to temp file";
FILE* nexe_file_stream = nexe_fp.release();
int fd = fileno(nexe_file_stream);
CHECK_NE(fd, -1) << "Could not open the stream pointer's file descriptor";
fd = dup(fd);
CHECK_NE(fd, -1) << "Could not dup the file descriptor";
CHECK_EQ(fclose(nexe_file_stream), 0) << "Failed to close temp file";
MojoHandle handle =
application_request.PassMessagePipe().release().value();
// MojoLaunchNexeNonsfi takes ownership of the fd.
MojoLaunchNexeNonsfi(fd, handle, false /* enable_translation_irt */);
}
DISALLOW_COPY_AND_ASSIGN(NaClContentHandler);
};
} // namespace content_handler
} // namespace nacl
MojoResult MojoMain(MojoHandle application_request) {
nacl::content_handler::NaClContentHandler nacl_content_handler;
return mojo::RunMainApplication(application_request, &nacl_content_handler);
}