/* 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; }