194afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood/* Copyright 2008 The Android Open Source Project
294afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood */
394afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood
494afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood#include <stdio.h>
594afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood#include <stdlib.h>
6824e30e5ed35b8f416fea12ce574b012aedaaab5Elliott Hughes#include <string.h>
794afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood#include <errno.h>
894afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood
994afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood#include "binder.h"
1094afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood
115fb1b8836aa5cf0f38b49bc7bfb8343b84fdf9bfSerban Constantinescuuint32_t svcmgr_lookup(struct binder_state *bs, uint32_t target, const char *name)
1294afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood{
135fb1b8836aa5cf0f38b49bc7bfb8343b84fdf9bfSerban Constantinescu    uint32_t handle;
1494afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    unsigned iodata[512/4];
1594afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    struct binder_io msg, reply;
1694afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood
1794afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    bio_init(&msg, iodata, sizeof(iodata), 4);
1894afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    bio_put_uint32(&msg, 0);  // strict mode header
1994afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    bio_put_string16_x(&msg, SVC_MGR_NAME);
2094afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    bio_put_string16_x(&msg, name);
2194afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood
2294afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    if (binder_call(bs, &msg, &reply, target, SVC_MGR_CHECK_SERVICE))
2394afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood        return 0;
2494afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood
255fb1b8836aa5cf0f38b49bc7bfb8343b84fdf9bfSerban Constantinescu    handle = bio_get_ref(&reply);
2694afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood
275fb1b8836aa5cf0f38b49bc7bfb8343b84fdf9bfSerban Constantinescu    if (handle)
285fb1b8836aa5cf0f38b49bc7bfb8343b84fdf9bfSerban Constantinescu        binder_acquire(bs, handle);
2994afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood
3094afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    binder_done(bs, &msg, &reply);
3194afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood
325fb1b8836aa5cf0f38b49bc7bfb8343b84fdf9bfSerban Constantinescu    return handle;
3394afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood}
3494afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood
355fb1b8836aa5cf0f38b49bc7bfb8343b84fdf9bfSerban Constantinescuint svcmgr_publish(struct binder_state *bs, uint32_t target, const char *name, void *ptr)
3694afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood{
373a345f0df5f62d77e875a289e9aee89f0d1b526eSerban Constantinescu    int status;
3894afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    unsigned iodata[512/4];
3994afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    struct binder_io msg, reply;
4094afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood
4194afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    bio_init(&msg, iodata, sizeof(iodata), 4);
4294afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    bio_put_uint32(&msg, 0);  // strict mode header
4394afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    bio_put_string16_x(&msg, SVC_MGR_NAME);
4494afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    bio_put_string16_x(&msg, name);
4594afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    bio_put_obj(&msg, ptr);
4694afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood
4794afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    if (binder_call(bs, &msg, &reply, target, SVC_MGR_ADD_SERVICE))
4894afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood        return -1;
4994afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood
5094afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    status = bio_get_uint32(&reply);
5194afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood
5294afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    binder_done(bs, &msg, &reply);
5394afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood
5494afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    return status;
5594afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood}
5694afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood
5794afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwoodunsigned token;
5894afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood
5994afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwoodint main(int argc, char **argv)
6094afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood{
6194afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    struct binder_state *bs;
625fb1b8836aa5cf0f38b49bc7bfb8343b84fdf9bfSerban Constantinescu    uint32_t svcmgr = BINDER_SERVICE_MANAGER;
635fb1b8836aa5cf0f38b49bc7bfb8343b84fdf9bfSerban Constantinescu    uint32_t handle;
6494afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood
6594afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    bs = binder_open(128*1024);
66a44542ca74b7da5b44ba30c205c3244805bb0600Serban Constantinescu    if (!bs) {
67a44542ca74b7da5b44ba30c205c3244805bb0600Serban Constantinescu        fprintf(stderr, "failed to open binder driver\n");
68a44542ca74b7da5b44ba30c205c3244805bb0600Serban Constantinescu        return -1;
69a44542ca74b7da5b44ba30c205c3244805bb0600Serban Constantinescu    }
7094afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood
7194afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    argc--;
7294afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    argv++;
7394afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    while (argc > 0) {
7494afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood        if (!strcmp(argv[0],"alt")) {
755fb1b8836aa5cf0f38b49bc7bfb8343b84fdf9bfSerban Constantinescu            handle = svcmgr_lookup(bs, svcmgr, "alt_svc_mgr");
765fb1b8836aa5cf0f38b49bc7bfb8343b84fdf9bfSerban Constantinescu            if (!handle) {
7794afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood                fprintf(stderr,"cannot find alt_svc_mgr\n");
7894afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood                return -1;
7994afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood            }
805fb1b8836aa5cf0f38b49bc7bfb8343b84fdf9bfSerban Constantinescu            svcmgr = handle;
815fb1b8836aa5cf0f38b49bc7bfb8343b84fdf9bfSerban Constantinescu            fprintf(stderr,"svcmgr is via %x\n", handle);
8294afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood        } else if (!strcmp(argv[0],"lookup")) {
8394afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood            if (argc < 2) {
8494afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood                fprintf(stderr,"argument required\n");
8594afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood                return -1;
8694afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood            }
875fb1b8836aa5cf0f38b49bc7bfb8343b84fdf9bfSerban Constantinescu            handle = svcmgr_lookup(bs, svcmgr, argv[1]);
885fb1b8836aa5cf0f38b49bc7bfb8343b84fdf9bfSerban Constantinescu            fprintf(stderr,"lookup(%s) = %x\n", argv[1], handle);
8994afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood            argc--;
9094afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood            argv++;
9194afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood        } else if (!strcmp(argv[0],"publish")) {
9294afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood            if (argc < 2) {
9394afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood                fprintf(stderr,"argument required\n");
9494afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood                return -1;
9594afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood            }
9694afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood            svcmgr_publish(bs, svcmgr, argv[1], &token);
9794afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood            argc--;
9894afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood            argv++;
9994afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood        } else {
10094afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood            fprintf(stderr,"unknown command %s\n", argv[0]);
10194afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood            return -1;
10294afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood        }
10394afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood        argc--;
10494afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood        argv++;
10594afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    }
10694afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    return 0;
10794afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood}
108