bctest.c revision 9066cfe9886ac131c34d59ed0e2d287b0e3c0087
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* Copyright 2008 The Android Open Source Project
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <stdio.h>
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <stdlib.h>
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <errno.h>
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "binder.h"
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid *svcmgr_lookup(struct binder_state *bs, void *target, const char *name)
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void *ptr;
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    unsigned iodata[512/4];
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    struct binder_io msg, reply;
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    bio_init(&msg, iodata, sizeof(iodata), 4);
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    bio_put_string16_x(&msg, SVC_MGR_NAME);
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    bio_put_string16_x(&msg, name);
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (binder_call(bs, &msg, &reply, target, SVC_MGR_CHECK_SERVICE))
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ptr = bio_get_ref(&reply);
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (ptr)
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        binder_acquire(bs, ptr);
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    binder_done(bs, &msg, &reply);
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return ptr;
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint svcmgr_publish(struct binder_state *bs, void *target, const char *name, void *ptr)
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    unsigned status;
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    unsigned iodata[512/4];
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    struct binder_io msg, reply;
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    bio_init(&msg, iodata, sizeof(iodata), 4);
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    bio_put_string16_x(&msg, SVC_MGR_NAME);
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    bio_put_string16_x(&msg, name);
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    bio_put_obj(&msg, ptr);
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (binder_call(bs, &msg, &reply, target, SVC_MGR_ADD_SERVICE))
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return -1;
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    status = bio_get_uint32(&reply);
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    binder_done(bs, &msg, &reply);
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return status;
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectunsigned token;
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint main(int argc, char **argv)
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int fd;
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    struct binder_state *bs;
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void *svcmgr = BINDER_SERVICE_MANAGER;
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    bs = binder_open(128*1024);
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    argc--;
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    argv++;
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    while (argc > 0) {
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!strcmp(argv[0],"alt")) {
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void *ptr = svcmgr_lookup(bs, svcmgr, "alt_svc_mgr");
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!ptr) {
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                fprintf(stderr,"cannot find alt_svc_mgr\n");
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return -1;
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            svcmgr = ptr;
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            fprintf(stderr,"svcmgr is via %p\n", ptr);
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else if (!strcmp(argv[0],"lookup")) {
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void *ptr;
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (argc < 2) {
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                fprintf(stderr,"argument required\n");
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return -1;
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ptr = svcmgr_lookup(bs, svcmgr, argv[1]);
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            fprintf(stderr,"lookup(%s) = %p\n", argv[1], ptr);
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            argc--;
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            argv++;
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else if (!strcmp(argv[0],"publish")) {
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (argc < 2) {
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                fprintf(stderr,"argument required\n");
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return -1;
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            svcmgr_publish(bs, svcmgr, argv[1], &token);
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            argc--;
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            argv++;
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            fprintf(stderr,"unknown command %s\n", argv[0]);
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return -1;
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        argc--;
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        argv++;
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return 0;
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
103