void nsFileInputStream::Serialize(InputStreamParams& aParams, FileDescriptorArray& aFileDescriptors) { FileInputStreamParams params; if (mFD) { FileHandleType fd = FileHandleType(PR_FileDesc2NativeHandle(mFD)); NS_ASSERTION(fd, "This should never be null!"); DebugOnly<FileDescriptor*> dbgFD = aFileDescriptors.AppendElement(fd); NS_ASSERTION(dbgFD->IsValid(), "Sending an invalid file descriptor!"); params.fileDescriptorIndex() = aFileDescriptors.Length() - 1; Close(); } else { NS_WARNING("This file has not been opened (or could not be opened). " "Sending an invalid file descriptor to the other process!"); params.fileDescriptorIndex() = UINT32_MAX; } int32_t behaviorFlags = mBehaviorFlags; // The receiving process (or thread) is going to have an open file // descriptor automatically so transferring this flag is meaningless. behaviorFlags &= ~nsIFileInputStream::DEFER_OPEN; params.behaviorFlags() = behaviorFlags; params.ioFlags() = mIOFlags; aParams = params; }
void nsTemporaryFileInputStream::Serialize(InputStreamParams& aParams, FileDescriptorArray& aFileDescriptors) { TemporaryFileInputStreamParams params; MutexAutoLock lock(mFileDescOwner->FileMutex()); MOZ_ASSERT(mFileDescOwner->mFD); if (!mClosed) { FileHandleType fd = FileHandleType(PR_FileDesc2NativeHandle(mFileDescOwner->mFD)); NS_ASSERTION(fd, "This should never be null!"); DebugOnly<FileDescriptor*> dbgFD = aFileDescriptors.AppendElement(fd); NS_ASSERTION(dbgFD->IsValid(), "Sending an invalid file descriptor!"); params.fileDescriptorIndex() = aFileDescriptors.Length() - 1; Close(); } else { NS_WARNING("The stream is already closed. " "Sending an invalid file descriptor to the other process!"); params.fileDescriptorIndex() = UINT32_MAX; } params.startPos() = mCurPos; params.endPos() = mEndPos; aParams = params; }
bool nsTemporaryFileInputStream::Deserialize(const InputStreamParams& aParams, const FileDescriptorArray& aFileDescriptors) { const TemporaryFileInputStreamParams& params = aParams.get_TemporaryFileInputStreamParams(); uint32_t fileDescriptorIndex = params.fileDescriptorIndex(); FileDescriptor fd; if (fileDescriptorIndex < aFileDescriptors.Length()) { fd = aFileDescriptors[fileDescriptorIndex]; NS_WARN_IF_FALSE(fd.IsValid(), "Received an invalid file descriptor!"); } else { NS_WARNING("Received a bad file descriptor index!"); } if (fd.IsValid()) { auto rawFD = fd.ClonePlatformHandle(); PRFileDesc* fileDesc = PR_ImportFile(PROsfd(rawFD.release())); if (!fileDesc) { NS_WARNING("Failed to import file handle!"); return false; } mFileDescOwner = new FileDescOwner(fileDesc); } else { mClosed = true; } mStartPos = mCurPos = params.startPos(); mEndPos = params.endPos(); return true; }
bool nsFileInputStream::Deserialize(const InputStreamParams& aParams, const FileDescriptorArray& aFileDescriptors) { NS_ASSERTION(!mFD, "Already have a file descriptor?!"); NS_ASSERTION(!mDeferredOpen, "Deferring open?!"); NS_ASSERTION(!mFile, "Should never have a file here!"); NS_ASSERTION(!mPerm, "This should always be 0!"); if (aParams.type() != InputStreamParams::TFileInputStreamParams) { NS_WARNING("Received unknown parameters from the other process!"); return false; } const FileInputStreamParams& params = aParams.get_FileInputStreamParams(); uint32_t fileDescriptorIndex = params.fileDescriptorIndex(); FileDescriptor fd; if (fileDescriptorIndex < aFileDescriptors.Length()) { fd = aFileDescriptors[fileDescriptorIndex]; NS_WARNING_ASSERTION(fd.IsValid(), "Received an invalid file descriptor!"); } else { NS_WARNING("Received a bad file descriptor index!"); } if (fd.IsValid()) { auto rawFD = fd.ClonePlatformHandle(); PRFileDesc* fileDesc = PR_ImportFile(PROsfd(rawFD.release())); if (!fileDesc) { NS_WARNING("Failed to import file handle!"); return false; } mFD = fileDesc; } mBehaviorFlags = params.behaviorFlags(); if (!XRE_IsParentProcess()) { // A child process shouldn't close when it reads the end because it will // not be able to reopen the file later. mBehaviorFlags &= ~nsIFileInputStream::CLOSE_ON_EOF; // A child process will not be able to reopen the file so this flag is // meaningless. mBehaviorFlags &= ~nsIFileInputStream::REOPEN_ON_REWIND; } mIOFlags = params.ioFlags(); return true; }