1 /* Copyright 2008 The Android Open Source Project 2 */ 3 4 #include <stdio.h> 5 #include <stdlib.h> 6 #include <errno.h> 7 8 #include "binder.h" 9 10 void *svcmgr_lookup(struct binder_state *bs, void *target, const char *name) 11 { 12 void *ptr; 13 unsigned iodata[512/4]; 14 struct binder_io msg, reply; 15 16 bio_init(&msg, iodata, sizeof(iodata), 4); 17 bio_put_string16_x(&msg, SVC_MGR_NAME); 18 bio_put_string16_x(&msg, name); 19 20 if (binder_call(bs, &msg, &reply, target, SVC_MGR_CHECK_SERVICE)) 21 return 0; 22 23 ptr = bio_get_ref(&reply); 24 25 if (ptr) 26 binder_acquire(bs, ptr); 27 28 binder_done(bs, &msg, &reply); 29 30 return ptr; 31 } 32 33 int svcmgr_publish(struct binder_state *bs, void *target, const char *name, void *ptr) 34 { 35 unsigned status; 36 unsigned iodata[512/4]; 37 struct binder_io msg, reply; 38 39 bio_init(&msg, iodata, sizeof(iodata), 4); 40 41 bio_put_string16_x(&msg, SVC_MGR_NAME); 42 bio_put_string16_x(&msg, name); 43 bio_put_obj(&msg, ptr); 44 45 if (binder_call(bs, &msg, &reply, target, SVC_MGR_ADD_SERVICE)) 46 return -1; 47 48 status = bio_get_uint32(&reply); 49 50 binder_done(bs, &msg, &reply); 51 52 return status; 53 } 54 55 unsigned token; 56 57 int main(int argc, char **argv) 58 { 59 int fd; 60 struct binder_state *bs; 61 void *svcmgr = BINDER_SERVICE_MANAGER; 62 63 bs = binder_open(128*1024); 64 65 argc--; 66 argv++; 67 while (argc > 0) { 68 if (!strcmp(argv[0],"alt")) { 69 void *ptr = svcmgr_lookup(bs, svcmgr, "alt_svc_mgr"); 70 if (!ptr) { 71 fprintf(stderr,"cannot find alt_svc_mgr\n"); 72 return -1; 73 } 74 svcmgr = ptr; 75 fprintf(stderr,"svcmgr is via %p\n", ptr); 76 } else if (!strcmp(argv[0],"lookup")) { 77 void *ptr; 78 if (argc < 2) { 79 fprintf(stderr,"argument required\n"); 80 return -1; 81 } 82 ptr = svcmgr_lookup(bs, svcmgr, argv[1]); 83 fprintf(stderr,"lookup(%s) = %p\n", argv[1], ptr); 84 argc--; 85 argv++; 86 } else if (!strcmp(argv[0],"publish")) { 87 if (argc < 2) { 88 fprintf(stderr,"argument required\n"); 89 return -1; 90 } 91 svcmgr_publish(bs, svcmgr, argv[1], &token); 92 argc--; 93 argv++; 94 } else { 95 fprintf(stderr,"unknown command %s\n", argv[0]); 96 return -1; 97 } 98 argc--; 99 argv++; 100 } 101 return 0; 102 } 103