• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
svcmgr_lookup(struct binder_state * bs,void * target,const char * name)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_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     ptr = bio_get_ref(&reply);
25 
26     if (ptr)
27         binder_acquire(bs, ptr);
28 
29     binder_done(bs, &msg, &reply);
30 
31     return ptr;
32 }
33 
svcmgr_publish(struct binder_state * bs,void * target,const char * name,void * ptr)34 int svcmgr_publish(struct binder_state *bs, void *target, const char *name, void *ptr)
35 {
36     unsigned 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 
main(int argc,char ** argv)58 int main(int argc, char **argv)
59 {
60     int fd;
61     struct binder_state *bs;
62     void *svcmgr = BINDER_SERVICE_MANAGER;
63 
64     bs = binder_open(128*1024);
65 
66     argc--;
67     argv++;
68     while (argc > 0) {
69         if (!strcmp(argv[0],"alt")) {
70             void *ptr = svcmgr_lookup(bs, svcmgr, "alt_svc_mgr");
71             if (!ptr) {
72                 fprintf(stderr,"cannot find alt_svc_mgr\n");
73                 return -1;
74             }
75             svcmgr = ptr;
76             fprintf(stderr,"svcmgr is via %p\n", ptr);
77         } else if (!strcmp(argv[0],"lookup")) {
78             void *ptr;
79             if (argc < 2) {
80                 fprintf(stderr,"argument required\n");
81                 return -1;
82             }
83             ptr = svcmgr_lookup(bs, svcmgr, argv[1]);
84             fprintf(stderr,"lookup(%s) = %p\n", argv[1], ptr);
85             argc--;
86             argv++;
87         } else if (!strcmp(argv[0],"publish")) {
88             if (argc < 2) {
89                 fprintf(stderr,"argument required\n");
90                 return -1;
91             }
92             svcmgr_publish(bs, svcmgr, argv[1], &token);
93             argc--;
94             argv++;
95         } else {
96             fprintf(stderr,"unknown command %s\n", argv[0]);
97             return -1;
98         }
99         argc--;
100         argv++;
101     }
102     return 0;
103 }
104