BitTube.cpp revision 5cae0d0699a169e468fff3e21165f35db12f2cde
12580a976ec93a01ed00fae51364ad872bc591d95Jorim Jaggi/* 22580a976ec93a01ed00fae51364ad872bc591d95Jorim Jaggi * Copyright (C) 2010 The Android Open Source Project 32580a976ec93a01ed00fae51364ad872bc591d95Jorim Jaggi * 42580a976ec93a01ed00fae51364ad872bc591d95Jorim Jaggi * Licensed under the Apache License, Version 2.0 (the "License"); 52580a976ec93a01ed00fae51364ad872bc591d95Jorim Jaggi * you may not use this file except in compliance with the License. 62580a976ec93a01ed00fae51364ad872bc591d95Jorim Jaggi * You may obtain a copy of the License at 72580a976ec93a01ed00fae51364ad872bc591d95Jorim Jaggi * 82580a976ec93a01ed00fae51364ad872bc591d95Jorim Jaggi * http://www.apache.org/licenses/LICENSE-2.0 92580a976ec93a01ed00fae51364ad872bc591d95Jorim Jaggi * 102580a976ec93a01ed00fae51364ad872bc591d95Jorim Jaggi * Unless required by applicable law or agreed to in writing, software 112580a976ec93a01ed00fae51364ad872bc591d95Jorim Jaggi * distributed under the License is distributed on an "AS IS" BASIS, 122580a976ec93a01ed00fae51364ad872bc591d95Jorim Jaggi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 132580a976ec93a01ed00fae51364ad872bc591d95Jorim Jaggi * See the License for the specific language governing permissions and 142580a976ec93a01ed00fae51364ad872bc591d95Jorim Jaggi * limitations under the License. 152580a976ec93a01ed00fae51364ad872bc591d95Jorim Jaggi */ 162580a976ec93a01ed00fae51364ad872bc591d95Jorim Jaggi 172580a976ec93a01ed00fae51364ad872bc591d95Jorim Jaggi#include <stdint.h> 182580a976ec93a01ed00fae51364ad872bc591d95Jorim Jaggi#include <sys/types.h> 192580a976ec93a01ed00fae51364ad872bc591d95Jorim Jaggi 202580a976ec93a01ed00fae51364ad872bc591d95Jorim Jaggi#include <unistd.h> 212580a976ec93a01ed00fae51364ad872bc591d95Jorim Jaggi#include <fcntl.h> 222580a976ec93a01ed00fae51364ad872bc591d95Jorim Jaggi 232580a976ec93a01ed00fae51364ad872bc591d95Jorim Jaggi#include <utils/Errors.h> 242580a976ec93a01ed00fae51364ad872bc591d95Jorim Jaggi 252580a976ec93a01ed00fae51364ad872bc591d95Jorim Jaggi#include <binder/Parcel.h> 262580a976ec93a01ed00fae51364ad872bc591d95Jorim Jaggi 272580a976ec93a01ed00fae51364ad872bc591d95Jorim Jaggi#include <gui/BitTube.h> 282580a976ec93a01ed00fae51364ad872bc591d95Jorim Jaggi 292580a976ec93a01ed00fae51364ad872bc591d95Jorim Jagginamespace android { 302580a976ec93a01ed00fae51364ad872bc591d95Jorim Jaggi// ---------------------------------------------------------------------------- 312580a976ec93a01ed00fae51364ad872bc591d95Jorim Jaggi 322580a976ec93a01ed00fae51364ad872bc591d95Jorim JaggiBitTube::BitTube() 332580a976ec93a01ed00fae51364ad872bc591d95Jorim Jaggi : mSendFd(-1), mReceiveFd(-1) 342580a976ec93a01ed00fae51364ad872bc591d95Jorim Jaggi{ 352580a976ec93a01ed00fae51364ad872bc591d95Jorim Jaggi int fds[2]; 362580a976ec93a01ed00fae51364ad872bc591d95Jorim Jaggi if (pipe(fds) == 0) { 372580a976ec93a01ed00fae51364ad872bc591d95Jorim Jaggi mReceiveFd = fds[0]; 382580a976ec93a01ed00fae51364ad872bc591d95Jorim Jaggi mSendFd = fds[1]; 392580a976ec93a01ed00fae51364ad872bc591d95Jorim Jaggi fcntl(mReceiveFd, F_SETFL, O_NONBLOCK); 402580a976ec93a01ed00fae51364ad872bc591d95Jorim Jaggi fcntl(mSendFd, F_SETFL, O_NONBLOCK); 412580a976ec93a01ed00fae51364ad872bc591d95Jorim Jaggi } else { 422580a976ec93a01ed00fae51364ad872bc591d95Jorim Jaggi mReceiveFd = -errno; 432580a976ec93a01ed00fae51364ad872bc591d95Jorim Jaggi LOGE("BitTube: pipe creation failed (%s)", strerror(-mReceiveFd)); 442580a976ec93a01ed00fae51364ad872bc591d95Jorim Jaggi } 452580a976ec93a01ed00fae51364ad872bc591d95Jorim Jaggi} 462580a976ec93a01ed00fae51364ad872bc591d95Jorim Jaggi 472580a976ec93a01ed00fae51364ad872bc591d95Jorim JaggiBitTube::BitTube(const Parcel& data) 482580a976ec93a01ed00fae51364ad872bc591d95Jorim Jaggi : mSendFd(-1), mReceiveFd(-1) 492580a976ec93a01ed00fae51364ad872bc591d95Jorim Jaggi{ 502580a976ec93a01ed00fae51364ad872bc591d95Jorim Jaggi mReceiveFd = dup(data.readFileDescriptor()); 512580a976ec93a01ed00fae51364ad872bc591d95Jorim Jaggi if (mReceiveFd >= 0) { 52 fcntl(mReceiveFd, F_SETFL, O_NONBLOCK); 53 } else { 54 mReceiveFd = -errno; 55 LOGE("BitTube(Parcel): can't dup filedescriptor (%s)", 56 strerror(-mReceiveFd)); 57 } 58} 59 60BitTube::~BitTube() 61{ 62 if (mSendFd >= 0) 63 close(mSendFd); 64 65 if (mReceiveFd >= 0) 66 close(mReceiveFd); 67} 68 69status_t BitTube::initCheck() const 70{ 71 if (mReceiveFd < 0) { 72 return status_t(mReceiveFd); 73 } 74 return NO_ERROR; 75} 76 77int BitTube::getFd() const 78{ 79 return mReceiveFd; 80} 81 82ssize_t BitTube::write(void const* vaddr, size_t size) 83{ 84 ssize_t err, len; 85 do { 86 len = ::write(mSendFd, vaddr, size); 87 err = len < 0 ? errno : 0; 88 } while (err == EINTR); 89 return err == 0 ? len : -err; 90 91} 92 93ssize_t BitTube::read(void* vaddr, size_t size) 94{ 95 ssize_t err, len; 96 do { 97 len = ::read(mReceiveFd, vaddr, size); 98 err = len < 0 ? errno : 0; 99 } while (err == EINTR); 100 return err == 0 ? len : -err; 101} 102 103status_t BitTube::writeToParcel(Parcel* reply) const 104{ 105 if (mReceiveFd < 0) 106 return -EINVAL; 107 108 status_t result = reply->writeDupFileDescriptor(mReceiveFd); 109 close(mReceiveFd); 110 mReceiveFd = -1; 111 return result; 112} 113 114// ---------------------------------------------------------------------------- 115}; // namespace android 116