• 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_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 
svcmgr_publish(struct binder_state * bs,void * target,const char * name,void * ptr)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 
main(int argc,char ** argv)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