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