Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8f237272 authored by Casey Dahlin's avatar Casey Dahlin Committed by Gerrit Code Review
Browse files

Merge "Add support for file descriptors and vectors thereof"

parents 49b5443a 06673e38
Loading
Loading
Loading
Loading
+21 −0
Original line number Original line Diff line number Diff line
@@ -20,6 +20,7 @@
#include <vector>
#include <vector>


#include <cutils/native_handle.h>
#include <cutils/native_handle.h>
#include <nativehelper/ScopedFd.h>
#include <utils/Errors.h>
#include <utils/Errors.h>
#include <utils/RefBase.h>
#include <utils/RefBase.h>
#include <utils/String16.h>
#include <utils/String16.h>
@@ -154,6 +155,17 @@ public:
    // will be closed once the parcel is destroyed.
    // will be closed once the parcel is destroyed.
    status_t            writeDupFileDescriptor(int fd);
    status_t            writeDupFileDescriptor(int fd);


    // Place a file descriptor into the parcel.  This will not affect the
    // semantics of the smart file descriptor. A new descriptor will be
    // created, and will be closed when the parcel is destroyed.
    status_t            writeUniqueFileDescriptor(
                            const ScopedFd& fd);

    // Place a vector of file desciptors into the parcel. Each descriptor is
    // dup'd as in writeDupFileDescriptor
    status_t            writeUniqueFileDescriptorVector(
                            const std::vector<ScopedFd>& val);

    // Writes a blob to the parcel.
    // Writes a blob to the parcel.
    // If the blob is small, then it is stored in-place, otherwise it is
    // If the blob is small, then it is stored in-place, otherwise it is
    // transferred by way of an anonymous shared memory region.  Prefer sending
    // transferred by way of an anonymous shared memory region.  Prefer sending
@@ -250,6 +262,15 @@ public:
    // in the parcel, which you do not own -- use dup() to get your own copy.
    // in the parcel, which you do not own -- use dup() to get your own copy.
    int                 readFileDescriptor() const;
    int                 readFileDescriptor() const;


    // Retrieve a smart file descriptor from the parcel.
    status_t            readUniqueFileDescriptor(
                            ScopedFd* val) const;


    // Retrieve a vector of smart file descriptors from the parcel.
    status_t            readUniqueFileDescriptorVector(
                            std::vector<ScopedFd>* val) const;

    // Reads a blob from the parcel.
    // Reads a blob from the parcel.
    // The caller should call release() on the blob after reading its contents.
    // The caller should call release() on the blob after reading its contents.
    status_t            readBlob(size_t len, ReadableBlob* outBlob) const;
    status_t            readBlob(size_t len, ReadableBlob* outBlob) const;
+35 −7
Original line number Original line Diff line number Diff line
@@ -980,12 +980,20 @@ status_t Parcel::writeDupFileDescriptor(int fd)
        return -errno;
        return -errno;
    }
    }
    status_t err = writeFileDescriptor(dupFd, true /*takeOwnership*/);
    status_t err = writeFileDescriptor(dupFd, true /*takeOwnership*/);
    if (err) {
    if (err != OK) {
        close(dupFd);
        close(dupFd);
    }
    }
    return err;
    return err;
}
}


status_t Parcel::writeUniqueFileDescriptor(const ScopedFd& fd) {
    return writeDupFileDescriptor(fd.get());
}

status_t Parcel::writeUniqueFileDescriptorVector(const std::vector<ScopedFd>& val) {
    return writeTypedVector(val, &Parcel::writeUniqueFileDescriptor);
}

status_t Parcel::writeBlob(size_t len, bool mutableCopy, WritableBlob* outBlob)
status_t Parcel::writeBlob(size_t len, bool mutableCopy, WritableBlob* outBlob)
{
{
    if (len > INT32_MAX) {
    if (len > INT32_MAX) {
@@ -1601,16 +1609,36 @@ native_handle* Parcel::readNativeHandle() const
int Parcel::readFileDescriptor() const
int Parcel::readFileDescriptor() const
{
{
    const flat_binder_object* flat = readObject(true);
    const flat_binder_object* flat = readObject(true);
    if (flat) {

        switch (flat->type) {
    if (flat && flat->type == BINDER_TYPE_FD) {
            case BINDER_TYPE_FD:
                //ALOGI("Returning file descriptor %ld from parcel %p", flat->handle, this);
        return flat->handle;
        return flat->handle;
    }
    }

    return BAD_TYPE;
}
}

status_t Parcel::readUniqueFileDescriptor(ScopedFd* val) const
{
    int got = readFileDescriptor();

    if (got == BAD_TYPE) {
        return BAD_TYPE;
        return BAD_TYPE;
    }
    }


    val->reset(dup(got));

    if (val->get() < 0) {
        return BAD_VALUE;
    }

    return OK;
}


status_t Parcel::readUniqueFileDescriptorVector(std::vector<ScopedFd>* val) const {
    return readTypedVector(val, &Parcel::readUniqueFileDescriptor);
}

status_t Parcel::readBlob(size_t len, ReadableBlob* outBlob) const
status_t Parcel::readBlob(size_t len, ReadableBlob* outBlob) const
{
{
    int32_t blobType;
    int32_t blobType;