From 06673e38983baad380e818c5493b7faccf3b2393 Mon Sep 17 00:00:00 2001 From: Casey Dahlin Date: Mon, 23 Nov 2015 13:24:23 -0800 Subject: Add support for file descriptors and vectors thereof We use ScopedFd from nativehelper to manage the lifetime. Test: Passes AIDL unit and integration tests. Full build completes and runs. Bug: 25242023 Signed-off-by: Casey Dahlin Change-Id: I22c87ed1cb3bd4bf667b372ea4a2e9fcd4dd986a --- libs/binder/Parcel.cpp | 42 +++++++++++++++++++++++++++++++++++------- 1 file changed, 35 insertions(+), 7 deletions(-) (limited to 'libs') diff --git a/libs/binder/Parcel.cpp b/libs/binder/Parcel.cpp index 03348da773..94968218e0 100644 --- a/libs/binder/Parcel.cpp +++ b/libs/binder/Parcel.cpp @@ -980,12 +980,20 @@ status_t Parcel::writeDupFileDescriptor(int fd) return -errno; } status_t err = writeFileDescriptor(dupFd, true /*takeOwnership*/); - if (err) { + if (err != OK) { close(dupFd); } return err; } +status_t Parcel::writeUniqueFileDescriptor(const ScopedFd& fd) { + return writeDupFileDescriptor(fd.get()); +} + +status_t Parcel::writeUniqueFileDescriptorVector(const std::vector& val) { + return writeTypedVector(val, &Parcel::writeUniqueFileDescriptor); +} + status_t Parcel::writeBlob(size_t len, bool mutableCopy, WritableBlob* outBlob) { if (len > INT32_MAX) { @@ -1601,16 +1609,36 @@ native_handle* Parcel::readNativeHandle() const int Parcel::readFileDescriptor() const { const flat_binder_object* flat = readObject(true); - if (flat) { - switch (flat->type) { - case BINDER_TYPE_FD: - //ALOGI("Returning file descriptor %ld from parcel %p", flat->handle, this); - return flat->handle; - } + + if (flat && flat->type == BINDER_TYPE_FD) { + return flat->handle; } + return BAD_TYPE; } +status_t Parcel::readUniqueFileDescriptor(ScopedFd* val) const +{ + int got = readFileDescriptor(); + + if (got == BAD_TYPE) { + return BAD_TYPE; + } + + val->reset(dup(got)); + + if (val->get() < 0) { + return BAD_VALUE; + } + + return OK; +} + + +status_t Parcel::readUniqueFileDescriptorVector(std::vector* val) const { + return readTypedVector(val, &Parcel::readUniqueFileDescriptor); +} + status_t Parcel::readBlob(size_t len, ReadableBlob* outBlob) const { int32_t blobType; -- cgit v1.2.3-59-g8ed1b