27b3a7a759
This is (intendend to be) a no-op change. At this stage, Binder RPCs just have an additional uint32 passed around in the header, right before the interface name. But nothing is actually done with them yet. That value should right now always be 0. This now boots and seems to work. Change-Id: I135b7c84f07575e6b9717fef2424d301a450df7b
104 lines
2.5 KiB
C
104 lines
2.5 KiB
C
/* Copyright 2008 The Android Open Source Project
|
|
*/
|
|
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <errno.h>
|
|
|
|
#include "binder.h"
|
|
|
|
void *svcmgr_lookup(struct binder_state *bs, void *target, const char *name)
|
|
{
|
|
void *ptr;
|
|
unsigned iodata[512/4];
|
|
struct binder_io msg, reply;
|
|
|
|
bio_init(&msg, iodata, sizeof(iodata), 4);
|
|
bio_put_uint32(&msg, 0); // strict mode header
|
|
bio_put_string16_x(&msg, SVC_MGR_NAME);
|
|
bio_put_string16_x(&msg, name);
|
|
|
|
if (binder_call(bs, &msg, &reply, target, SVC_MGR_CHECK_SERVICE))
|
|
return 0;
|
|
|
|
ptr = bio_get_ref(&reply);
|
|
|
|
if (ptr)
|
|
binder_acquire(bs, ptr);
|
|
|
|
binder_done(bs, &msg, &reply);
|
|
|
|
return ptr;
|
|
}
|
|
|
|
int svcmgr_publish(struct binder_state *bs, void *target, const char *name, void *ptr)
|
|
{
|
|
unsigned status;
|
|
unsigned iodata[512/4];
|
|
struct binder_io msg, reply;
|
|
|
|
bio_init(&msg, iodata, sizeof(iodata), 4);
|
|
bio_put_uint32(&msg, 0); // strict mode header
|
|
bio_put_string16_x(&msg, SVC_MGR_NAME);
|
|
bio_put_string16_x(&msg, name);
|
|
bio_put_obj(&msg, ptr);
|
|
|
|
if (binder_call(bs, &msg, &reply, target, SVC_MGR_ADD_SERVICE))
|
|
return -1;
|
|
|
|
status = bio_get_uint32(&reply);
|
|
|
|
binder_done(bs, &msg, &reply);
|
|
|
|
return status;
|
|
}
|
|
|
|
unsigned token;
|
|
|
|
int main(int argc, char **argv)
|
|
{
|
|
int fd;
|
|
struct binder_state *bs;
|
|
void *svcmgr = BINDER_SERVICE_MANAGER;
|
|
|
|
bs = binder_open(128*1024);
|
|
|
|
argc--;
|
|
argv++;
|
|
while (argc > 0) {
|
|
if (!strcmp(argv[0],"alt")) {
|
|
void *ptr = svcmgr_lookup(bs, svcmgr, "alt_svc_mgr");
|
|
if (!ptr) {
|
|
fprintf(stderr,"cannot find alt_svc_mgr\n");
|
|
return -1;
|
|
}
|
|
svcmgr = ptr;
|
|
fprintf(stderr,"svcmgr is via %p\n", ptr);
|
|
} else if (!strcmp(argv[0],"lookup")) {
|
|
void *ptr;
|
|
if (argc < 2) {
|
|
fprintf(stderr,"argument required\n");
|
|
return -1;
|
|
}
|
|
ptr = svcmgr_lookup(bs, svcmgr, argv[1]);
|
|
fprintf(stderr,"lookup(%s) = %p\n", argv[1], ptr);
|
|
argc--;
|
|
argv++;
|
|
} else if (!strcmp(argv[0],"publish")) {
|
|
if (argc < 2) {
|
|
fprintf(stderr,"argument required\n");
|
|
return -1;
|
|
}
|
|
svcmgr_publish(bs, svcmgr, argv[1], &token);
|
|
argc--;
|
|
argv++;
|
|
} else {
|
|
fprintf(stderr,"unknown command %s\n", argv[0]);
|
|
return -1;
|
|
}
|
|
argc--;
|
|
argv++;
|
|
}
|
|
return 0;
|
|
}
|