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