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
10uint32_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
34int 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
56unsigned token;
57
58int 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