diff options
author | Bjorn Bringert <bringert@android.com> | 2009-06-02 00:41:09 +0100 |
---|---|---|
committer | Bjorn Bringert <bringert@android.com> | 2009-06-02 00:55:30 +0100 |
commit | 7be52b1a0e052635b361f9d8c186adbbcc981b7e (patch) | |
tree | affb0be0b9c7f03ddd8f4536d00c451774905d96 | |
parent | 3c5a6f0bc8aefc4dacab8e95ba9017a7ac7d91f5 (diff) | |
download | core-7be52b1a0e052635b361f9d8c186adbbcc981b7e.tar.gz core-7be52b1a0e052635b361f9d8c186adbbcc981b7e.tar.bz2 core-7be52b1a0e052635b361f9d8c186adbbcc981b7e.zip |
Added ashmem_get_size_region() function.
This is needed by the MemoryFile changes in
https://android-git.corp.google.com/g/2714
where it is used to find out whether a file descriptor
refers to an ashmem region.
-rw-r--r-- | include/cutils/ashmem.h | 1 | ||||
-rw-r--r-- | libcutils/ashmem-dev.c | 5 | ||||
-rw-r--r-- | libcutils/ashmem-host.c | 20 |
3 files changed, 26 insertions, 0 deletions
diff --git a/include/cutils/ashmem.h b/include/cutils/ashmem.h index fd71352eb..0683bf255 100644 --- a/include/cutils/ashmem.h +++ b/include/cutils/ashmem.h @@ -18,6 +18,7 @@ int ashmem_create_region(const char *name, size_t size); int ashmem_set_prot_region(int fd, int prot); int ashmem_pin_region(int fd, size_t offset, size_t len); int ashmem_unpin_region(int fd, size_t offset, size_t len); +int ashmem_get_size_region(int fd); #ifdef __cplusplus } diff --git a/libcutils/ashmem-dev.c b/libcutils/ashmem-dev.c index 5e158af71..8b71f87de 100644 --- a/libcutils/ashmem-dev.c +++ b/libcutils/ashmem-dev.c @@ -83,3 +83,8 @@ int ashmem_unpin_region(int fd, size_t offset, size_t len) struct ashmem_pin pin = { offset, len }; return ioctl(fd, ASHMEM_UNPIN, &pin); } + +int ashmem_get_size_region(int fd) +{ + return ioctl(fd, ASHMEM_GET_SIZE, NULL); +} diff --git a/libcutils/ashmem-host.c b/libcutils/ashmem-host.c index dbb52bc47..f03e13037 100644 --- a/libcutils/ashmem-host.c +++ b/libcutils/ashmem-host.c @@ -92,3 +92,23 @@ int ashmem_unpin_region(int fd, size_t offset, size_t len) { return ASHMEM_IS_UNPINNED; } + +int ashmem_get_size_region(int fd) +{ + struct stat buf; + int result; + + result = fstat(fd, &buf); + if (result == -1) { + return -1; + } + + // Check if this is an "ashmem" region. + // TODO: This is very hacky, and can easily break. We need some reliable indicator. + if (!(buf.st_nlink == 0 && S_ISREG(buf.st_mode))) { + errno = ENOTTY; + return -1; + } + + return (int)buf.st_size; // TODO: care about overflow (> 2GB file)? +} |