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