bctest.c revision a44542ca74b7da5b44ba30c205c3244805bb0600
194afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood/* Copyright 2008 The Android Open Source Project
294afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood */
394afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood
494afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood#include <stdio.h>
594afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood#include <stdlib.h>
694afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood#include <errno.h>
794afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood
894afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood#include "binder.h"
994afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood
1094afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwoodvoid *svcmgr_lookup(struct binder_state *bs, void *target, const char *name)
1194afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood{
1294afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    void *ptr;
1394afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    unsigned iodata[512/4];
1494afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    struct binder_io msg, reply;
1594afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood
1694afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    bio_init(&msg, iodata, sizeof(iodata), 4);
1794afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    bio_put_uint32(&msg, 0);  // strict mode header
1894afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    bio_put_string16_x(&msg, SVC_MGR_NAME);
1994afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    bio_put_string16_x(&msg, name);
2094afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood
2194afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    if (binder_call(bs, &msg, &reply, target, SVC_MGR_CHECK_SERVICE))
2294afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood        return 0;
2394afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood
2494afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    ptr = bio_get_ref(&reply);
2594afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood
2694afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    if (ptr)
2794afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood        binder_acquire(bs, ptr);
2894afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood
2994afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    binder_done(bs, &msg, &reply);
3094afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood
3194afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    return ptr;
3294afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood}
3394afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood
3494afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwoodint svcmgr_publish(struct binder_state *bs, void *target, const char *name, void *ptr)
3594afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood{
3694afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    unsigned status;
3794afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    unsigned iodata[512/4];
3894afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    struct binder_io msg, reply;
3994afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood
4094afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    bio_init(&msg, iodata, sizeof(iodata), 4);
4194afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    bio_put_uint32(&msg, 0);  // strict mode header
4294afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    bio_put_string16_x(&msg, SVC_MGR_NAME);
4394afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    bio_put_string16_x(&msg, name);
4494afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    bio_put_obj(&msg, ptr);
4594afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood
4694afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    if (binder_call(bs, &msg, &reply, target, SVC_MGR_ADD_SERVICE))
4794afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood        return -1;
4894afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood
4994afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    status = bio_get_uint32(&reply);
5094afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood
5194afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    binder_done(bs, &msg, &reply);
5294afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood
5394afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    return status;
5494afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood}
5594afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood
5694afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwoodunsigned token;
5794afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood
5894afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwoodint main(int argc, char **argv)
5994afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood{
6094afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    int fd;
6194afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    struct binder_state *bs;
6294afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    void *svcmgr = BINDER_SERVICE_MANAGER;
6394afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood
6494afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    bs = binder_open(128*1024);
65a44542ca74b7da5b44ba30c205c3244805bb0600Serban Constantinescu    if (!bs) {
66a44542ca74b7da5b44ba30c205c3244805bb0600Serban Constantinescu        fprintf(stderr, "failed to open binder driver\n");
67a44542ca74b7da5b44ba30c205c3244805bb0600Serban Constantinescu        return -1;
68a44542ca74b7da5b44ba30c205c3244805bb0600Serban Constantinescu    }
6994afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood
7094afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    argc--;
7194afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    argv++;
7294afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood    while (argc > 0) {
7394afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood        if (!strcmp(argv[0],"alt")) {
7494afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood            void *ptr = svcmgr_lookup(bs, svcmgr, "alt_svc_mgr");
7594afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood            if (!ptr) {
7694afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood                fprintf(stderr,"cannot find alt_svc_mgr\n");
7794afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood                return -1;
7894afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood            }
7994afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood            svcmgr = ptr;
8094afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood            fprintf(stderr,"svcmgr is via %p\n", ptr);
8194afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood        } else if (!strcmp(argv[0],"lookup")) {
8294afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood            void *ptr;
8394afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood            if (argc < 2) {
8494afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood                fprintf(stderr,"argument required\n");
8594afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood                return -1;
8694afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood            }
8794afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood            ptr = svcmgr_lookup(bs, svcmgr, argv[1]);
8894afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood            fprintf(stderr,"lookup(%s) = %p\n", argv[1], ptr);
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