summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBjorn Bringert <bringert@android.com>2009-06-02 00:41:09 +0100
committerBjorn Bringert <bringert@android.com>2009-06-02 00:55:30 +0100
commit7be52b1a0e052635b361f9d8c186adbbcc981b7e (patch)
treeaffb0be0b9c7f03ddd8f4536d00c451774905d96
parent3c5a6f0bc8aefc4dacab8e95ba9017a7ac7d91f5 (diff)
downloadcore-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.h1
-rw-r--r--libcutils/ashmem-dev.c5
-rw-r--r--libcutils/ashmem-host.c20
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)?
+}