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 105fb1b8836aa5cf0f38b49bc7bfb8343b84fdf9bfSerban Constantinescuuint32_t svcmgr_lookup(struct binder_state *bs, uint32_t target, const char *name) 1194afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood{ 125fb1b8836aa5cf0f38b49bc7bfb8343b84fdf9bfSerban Constantinescu uint32_t handle; 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 245fb1b8836aa5cf0f38b49bc7bfb8343b84fdf9bfSerban Constantinescu handle = bio_get_ref(&reply); 2594afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood 265fb1b8836aa5cf0f38b49bc7bfb8343b84fdf9bfSerban Constantinescu if (handle) 275fb1b8836aa5cf0f38b49bc7bfb8343b84fdf9bfSerban Constantinescu binder_acquire(bs, handle); 2894afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood 2994afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood binder_done(bs, &msg, &reply); 3094afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood 315fb1b8836aa5cf0f38b49bc7bfb8343b84fdf9bfSerban Constantinescu return handle; 3294afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood} 3394afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood 345fb1b8836aa5cf0f38b49bc7bfb8343b84fdf9bfSerban Constantinescuint svcmgr_publish(struct binder_state *bs, uint32_t target, const char *name, void *ptr) 3594afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood{ 363a345f0df5f62d77e875a289e9aee89f0d1b526eSerban Constantinescu int 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; 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