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 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 
     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 
     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