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 <errno.h>
      7 
      8 #include "binder.h"
      9 
     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 
     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 
     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