blob: 24ce546916cc49fe9c6e9abaf013234205383737 [file] [log] [blame]
// Copyright 2014 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 "ppapi/proxy/file_mapping_resource.h"
#include <stdio.h>
#include <sys/mman.h>
#include <unistd.h>
#include "ppapi/c/pp_errors.h"
namespace ppapi {
namespace proxy {
namespace {
int32_t ErrnoToPPError(int error_code) {
switch (error_code) {
case EACCES:
return PP_ERROR_NOACCESS;
case EAGAIN:
return PP_ERROR_NOMEMORY;
case EINVAL:
return PP_ERROR_BADARGUMENT;
case ENFILE:
case ENOMEM:
return PP_ERROR_NOMEMORY;
default:
return PP_ERROR_FAILED;
}
}
} // namespace
// static
FileMappingResource::MapResult FileMappingResource::DoMapBlocking(
scoped_refptr<FileIOResource::FileHolder> file_holder,
void* address_hint,
int64_t length,
uint32_t map_protection,
uint32_t map_flags,
int64_t offset) {
int prot_for_mmap = 0;
if (map_protection & PP_FILEMAPPROTECTION_READ)
prot_for_mmap |= PROT_READ;
if (map_protection & PP_FILEMAPPROTECTION_WRITE)
prot_for_mmap |= PROT_WRITE;
if (prot_for_mmap == 0)
prot_for_mmap = PROT_NONE;
int flags_for_mmap = 0;
if (map_flags & PP_FILEMAPFLAG_SHARED)
flags_for_mmap |= MAP_SHARED;
if (map_flags & PP_FILEMAPFLAG_PRIVATE)
flags_for_mmap |= MAP_PRIVATE;
if (map_flags & PP_FILEMAPFLAG_FIXED)
flags_for_mmap |= MAP_FIXED;
MapResult map_result;
map_result.address =
mmap(address_hint,
static_cast<size_t>(length),
prot_for_mmap,
flags_for_mmap,
file_holder->file()->GetPlatformFile(),
static_cast<off_t>(offset));
if (map_result.address != MAP_FAILED)
map_result.result = PP_OK;
else
map_result.result = ErrnoToPPError(errno);
return map_result;
}
// static
int32_t FileMappingResource::DoUnmapBlocking(const void* address,
int64_t length) {
if (munmap(const_cast<void*>(address), static_cast<size_t>(length)))
return ErrnoToPPError(errno);
return PP_OK;
}
// static
int64_t FileMappingResource::DoGetMapPageSize() {
return getpagesize();
}
} // namespace proxy
} // namespace ppapi