int rv = ioctl(driver_, BINDER_WRITE_READ, &bwr);
ALOG("BINDER_WRITE_READ %d (written %d/%d, read %d/%d)", rv, bwr.write_consumed, bwr.write_size, bwr.read_consumed, bwr.read_size);
+ if (rv != 0)
+ return -errno;
+
+ for (binder_size_t index = 0;
+ index < bwr.read_consumed;
+ index = reader_.DataPosition()) {
+ size_t remaining = bwr.read_consumed - index;
+ if (remaining < sizeof(uint32_t))
+ break;
+
+ uint32_t command = 0;
+ if (!reader_.ReadUInt32(&command))
+ break;
+
+ if (!ProcessCommand(command, remaining))
+ break;
+ }
+
return rv;
}
+bool Channel::ProcessCommand(uint32_t command, size_t data_remaining) {
+ ALOG("ProcessCommand: 0x%x", command);
+ switch (command) {
+ case BR_ERROR: {
+ if (data_remaining < sizeof(int))
+ return false;
+
+ uint32_t error_code = 0;
+ if (!reader_.ReadUInt32(&error_code))
+ return false;
+
+ ALOG("BR_ERROR: %d", error_code);
+ break;
+ }
+ case BR_OK:
+ ALOG("BR_OK");
+ break;
+ case BR_TRANSACTION:
+ break;
+ case BR_REPLY:
+ break;
+ case BR_ACQUIRE_RESULT:
+ break;
+ case BR_DEAD_REPLY:
+ break;
+ case BR_TRANSACTION_COMPLETE:
+ break;
+ case BR_INCREFS:
+ break;
+ case BR_ACQUIRE:
+ break;
+ case BR_RELEASE:
+ break;
+ case BR_DECREFS:
+ break;
+ case BR_ATTEMPT_ACQUIRE:
+ break;
+ case BR_NOOP:
+ ALOG("BR_NOOP");
+ break;
+ case BR_SPAWN_LOOPER:
+ break;
+ case BR_FINISHED:
+ break;
+ case BR_DEAD_BINDER:
+ break;
+ case BR_CLEAR_DEATH_NOTIFICATION_DONE:
+ break;
+ case BR_FAILED_REPLY:
+ ALOG("BR_FAILED_REPLY");
+ break;
+ };
+}
+
} // namespace minibind
uint32_t handle() const { return handle_; }
private:
+ bool ProcessCommand(uint32_t command, size_t data_remaining);
+
uint32_t handle_;
int driver_;
namespace minibind {
TransactionCommand::TransactionCommand(TransactionCommand::Type type)
- : command_(type == TWO_WAY ? BC_TRANSACTION : BC_REPLY) {
+ : command_(type == TWO_WAY ? BC_TRANSACTION : BC_REPLY),
+ transaction_() {
}
TransactionCommand::~TransactionCommand() {}
#include <android/log.h>
#include <errno.h>
+#include <stdio.h>
-#define ALOG(...) __android_log_print(ANDROID_LOG_WARN, "minibind", __VA_ARGS__)
+//#define ALOG(...) __android_log_print(ANDROID_LOG_WARN, "minibind", __VA_ARGS__)
+#define ALOG(...) printf(__VA_ARGS__); putc('\n', stdout)
#define AERR(msg) ALOG(msg ": %s", strerror(errno))
Parcel in, out;
service_manager->Call(Channel::PING_TRANSACTION, in, &out);
- service_manager->reader()->Print();
+ //service_manager->reader()->Print();
}
return service_manager;
data.WriteInterfaceToken("android.os.IServiceManager");
data.WriteUTF8(name);
+ Channel* channel = GetServiceManager();
Parcel reply;
- Channel* channel = GetServiceManager();
channel->Call(2 /*CHECK_SERVICE_TRANSACTION*/, data, &reply);
-
- channel->reader()->Print();
-
- uint32_t cmd = 0;
- CHECK(channel->reader()->ReadUInt32(&cmd));
- ALOG("Got command: %x (dec %d %u)", cmd, cmd, cmd);
- CHECK(channel->reader()->ReadUInt32(&cmd));
- ALOG("Got command: %x (dec %d %u)", cmd, cmd, cmd);
}
} // namespace minibind
data_position_ = pos;
}
+size_t Parcel::DataPosition() const {
+ return data_position_;
+}
+
void Parcel::Print() const {
for (size_t i = 0; i < data_.size(); i += 4) {
ALOG("%0x %0x %0x %0x", data_[i], data_[i+1], data_[i+2], data_[i+3]);
bool ReadBytes(size_t count, void* buffer);
binder_uintptr_t DataPointer() const;
+
size_t DataSize() const;
void SetDataSize(size_t size);
+ size_t DataPosition() const;
void SetDataPosition(size_t pos);
void Print() const;
-set -e
+set -ex
+ndk-build
adb push ./libs/armeabi/minibind_test /data/local/tmp
adb shell /data/local/tmp/minibind_test
-adb logcat -s -d minibind:V
+#adb logcat -s -d minibind:V