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