Home | History | Annotate | Download | only in servicemanager
      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