diff options
author | bungeman@google.com <bungeman@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2013-06-03 17:10:35 +0000 |
---|---|---|
committer | bungeman@google.com <bungeman@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2013-06-03 17:10:35 +0000 |
commit | 11c9a55afd95078d14ab8cd7c1c5c0032af2a498 (patch) | |
tree | 3479a58fe5e8e8dfc687f6a76412b049773e3c8f /src/ports/SkOSFile_posix.cpp | |
parent | 135ece137b471219eea06a652069b86a3b6ec349 (diff) |
Add SkData::NewFromFD.
Chromium needs a SkStream backed by a file descriptor.
Skia already has the code and can do the work, this change exposes the
functionality in Skia in a clean way.
https://codereview.chromium.org/15941025/
git-svn-id: http://skia.googlecode.com/svn/trunk@9408 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'src/ports/SkOSFile_posix.cpp')
-rw-r--r-- | src/ports/SkOSFile_posix.cpp | 29 |
1 files changed, 23 insertions, 6 deletions
diff --git a/src/ports/SkOSFile_posix.cpp b/src/ports/SkOSFile_posix.cpp index c9da4db6b8..72a1b59335 100644 --- a/src/ports/SkOSFile_posix.cpp +++ b/src/ports/SkOSFile_posix.cpp @@ -7,6 +7,8 @@ #include "SkOSFile.h" +#include "SkTemplates.h" + #include <stdio.h> #include <sys/mman.h> #include <sys/stat.h> @@ -42,16 +44,18 @@ void sk_fmunmap(const void* addr, size_t length) { munmap(const_cast<void*>(addr), length); } -void* sk_fmmap(SkFILE* f, size_t* size) { - size_t fileSize = sk_fgetsize(f); - if (0 == fileSize) { +void* sk_fdmmap(int fd, size_t* size) { + struct stat status; + if (0 != fstat(fd, &status)) { return NULL; } - - int fd = fileno((FILE*)f); - if (fd < 0) { + if (!S_ISREG(status.st_mode)) { + return NULL; + } + if (!SkTFitsIn<size_t>(status.st_size)) { return NULL; } + size_t fileSize = static_cast<size_t>(status.st_size); void* addr = mmap(NULL, fileSize, PROT_READ, MAP_PRIVATE, fd, 0); if (MAP_FAILED == addr) { @@ -61,3 +65,16 @@ void* sk_fmmap(SkFILE* f, size_t* size) { *size = fileSize; return addr; } + +int sk_fileno(SkFILE* f) { + return fileno((FILE*)f); +} + +void* sk_fmmap(SkFILE* f, size_t* size) { + int fd = sk_fileno(f); + if (fd < 0) { + return NULL; + } + + return sk_fdmmap(fd, size); +} |