// 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 #include #include #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 handle, 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(length), prot_for_mmap, flags_for_mmap, handle->raw_handle(), static_cast(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(address), static_cast(length))) return ErrnoToPPError(errno); return PP_OK; } // static int64_t FileMappingResource::DoGetMapPageSize() { return getpagesize(); } } // namespace proxy } // namespace ppapi