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#include <fcntl.h> 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <private/android_filesystem_config.h> 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "binder.h" 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#if 0 146215d3ff4b5dfa52a5d8b9a42e343051f31066a5Steve Block#define ALOGI(x...) fprintf(stderr, "svcmgr: " x) 153762c311729fe9f3af085c14c5c1fb471d994c03Steve Block#define ALOGE(x...) fprintf(stderr, "svcmgr: " x) 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#else 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define LOG_TAG "ServiceManager" 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <cutils/log.h> 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* TODO: 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * These should come from a config file or perhaps be 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * based on some namespace rules of some sort (media 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * uid can register media.*, etc) 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic struct { 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project unsigned uid; 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const char *name; 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} allowed[] = { 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { AID_MEDIA, "media.audio_flinger" }, 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { AID_MEDIA, "media.player" }, 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { AID_MEDIA, "media.camera" }, 33a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent { AID_MEDIA, "media.audio_policy" }, 34d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi { AID_DRM, "drm.drmManager" }, 35cd0e839a2448deea50f79bddeba782c546b33893Nick Pelly { AID_NFC, "nfc" }, 361abb1cb3a8fe17f7866150604c2fd73751da787eJaikumar Ganesh { AID_BLUETOOTH, "bluetooth" }, 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { AID_RADIO, "radio.phone" }, 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { AID_RADIO, "radio.sms" }, 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { AID_RADIO, "radio.phonesubinfo" }, 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { AID_RADIO, "radio.simphonebook" }, 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* TODO: remove after phone services are updated: */ 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { AID_RADIO, "phone" }, 437e54ef71db3320a751571bba5259fba816399421Hung-ying Tyan { AID_RADIO, "sip" }, 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { AID_RADIO, "isms" }, 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { AID_RADIO, "iphonesubinfo" }, 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { AID_RADIO, "simphonebook" }, 476c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen { AID_MEDIA, "common_time.clock" }, 486c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen { AID_MEDIA, "common_time.config" }, 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid *svcmgr_handle; 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectconst char *str8(uint16_t *x) 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static char buf[128]; 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project unsigned max = 127; 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project char *p = buf; 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (x) { 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (*x && max--) { 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *p++ = *x++; 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *p++ = 0; 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return buf; 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint str16eq(uint16_t *a, const char *b) 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (*a && *b) 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (*a++ != *b++) return 0; 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (*a || *b) 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 1; 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint svc_can_register(unsigned uid, uint16_t *name) 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project unsigned n; 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((uid == 0) || (uid == AID_SYSTEM)) 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 1; 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (n = 0; n < sizeof(allowed) / sizeof(allowed[0]); n++) 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((uid == allowed[n].uid) && str16eq(name, allowed[n].name)) 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 1; 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstruct svcinfo 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project struct svcinfo *next; 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void *ptr; 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project struct binder_death death; 96a573f6a1d9b12393fbdfd2c0850499973849854bDianne Hackborn int allow_isolated; 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project unsigned len; 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint16_t name[0]; 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstruct svcinfo *svclist = 0; 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstruct svcinfo *find_svc(uint16_t *s16, unsigned len) 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project struct svcinfo *si; 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (si = svclist; si; si = si->next) { 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((len == si->len) && 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project !memcmp(s16, si->name, len * sizeof(uint16_t))) { 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return si; 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid svcinfo_death(struct binder_state *bs, void *ptr) 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project struct svcinfo *si = ptr; 1196215d3ff4b5dfa52a5d8b9a42e343051f31066a5Steve Block ALOGI("service '%s' died\n", str8(si->name)); 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (si->ptr) { 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project binder_release(bs, si->ptr); 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project si->ptr = 0; 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectuint16_t svcmgr_id[] = { 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 'a','n','d','r','o','i','d','.','o','s','.', 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 'I','S','e','r','v','i','c','e','M','a','n','a','g','e','r' 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 132a573f6a1d9b12393fbdfd2c0850499973849854bDianne Hackbornvoid *do_find_service(struct binder_state *bs, uint16_t *s, unsigned len, unsigned uid) 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project struct svcinfo *si; 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project si = find_svc(s, len); 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1376215d3ff4b5dfa52a5d8b9a42e343051f31066a5Steve Block// ALOGI("check_service('%s') ptr = %p\n", str8(s), si ? si->ptr : 0); 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (si && si->ptr) { 139a573f6a1d9b12393fbdfd2c0850499973849854bDianne Hackborn if (!si->allow_isolated) { 140a573f6a1d9b12393fbdfd2c0850499973849854bDianne Hackborn // If this service doesn't allow access from isolated processes, 141a573f6a1d9b12393fbdfd2c0850499973849854bDianne Hackborn // then check the uid to see if it is isolated. 142a573f6a1d9b12393fbdfd2c0850499973849854bDianne Hackborn unsigned appid = uid % AID_USER; 143a573f6a1d9b12393fbdfd2c0850499973849854bDianne Hackborn if (appid >= AID_ISOLATED_START && appid <= AID_ISOLATED_END) { 144a573f6a1d9b12393fbdfd2c0850499973849854bDianne Hackborn return 0; 145a573f6a1d9b12393fbdfd2c0850499973849854bDianne Hackborn } 146a573f6a1d9b12393fbdfd2c0850499973849854bDianne Hackborn } 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return si->ptr; 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint do_add_service(struct binder_state *bs, 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint16_t *s, unsigned len, 155a573f6a1d9b12393fbdfd2c0850499973849854bDianne Hackborn void *ptr, unsigned uid, int allow_isolated) 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project struct svcinfo *si; 158a573f6a1d9b12393fbdfd2c0850499973849854bDianne Hackborn //ALOGI("add_service('%s',%p,%s) uid=%d\n", str8(s), ptr, 159a573f6a1d9b12393fbdfd2c0850499973849854bDianne Hackborn // allow_isolated ? "allow_isolated" : "!allow_isolated", uid); 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!ptr || (len == 0) || (len > 127)) 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return -1; 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!svc_can_register(uid, s)) { 1653762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("add_service('%s',%p) uid=%d - PERMISSION DENIED\n", 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project str8(s), ptr, uid); 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return -1; 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project si = find_svc(s, len); 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (si) { 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (si->ptr) { 1733762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("add_service('%s',%p) uid=%d - ALREADY REGISTERED, OVERRIDE\n", 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project str8(s), ptr, uid); 1751d8843897e1e108586a6a51e05392ff509b3dd7eIliyan Malchev svcinfo_death(bs, si); 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project si->ptr = ptr; 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project si = malloc(sizeof(*si) + (len + 1) * sizeof(uint16_t)); 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!si) { 1813762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("add_service('%s',%p) uid=%d - OUT OF MEMORY\n", 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project str8(s), ptr, uid); 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return -1; 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project si->ptr = ptr; 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project si->len = len; 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project memcpy(si->name, s, (len + 1) * sizeof(uint16_t)); 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project si->name[len] = '\0'; 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project si->death.func = svcinfo_death; 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project si->death.ptr = si; 191a573f6a1d9b12393fbdfd2c0850499973849854bDianne Hackborn si->allow_isolated = allow_isolated; 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project si->next = svclist; 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project svclist = si; 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project binder_acquire(bs, ptr); 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project binder_link_to_death(bs, ptr, &si->death); 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint svcmgr_handler(struct binder_state *bs, 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project struct binder_txn *txn, 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project struct binder_io *msg, 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project struct binder_io *reply) 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project struct svcinfo *si; 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint16_t *s; 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project unsigned len; 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void *ptr; 21027b3a7a75960d026655f3acd1de8a672e80a5776Brad Fitzpatrick uint32_t strict_policy; 211a573f6a1d9b12393fbdfd2c0850499973849854bDianne Hackborn int allow_isolated; 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2136215d3ff4b5dfa52a5d8b9a42e343051f31066a5Steve Block// ALOGI("target=%p code=%d pid=%d uid=%d\n", 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// txn->target, txn->code, txn->sender_pid, txn->sender_euid); 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (txn->target != svcmgr_handle) 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return -1; 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21927b3a7a75960d026655f3acd1de8a672e80a5776Brad Fitzpatrick // Equivalent to Parcel::enforceInterface(), reading the RPC 22027b3a7a75960d026655f3acd1de8a672e80a5776Brad Fitzpatrick // header with the strict mode policy mask and the interface name. 22127b3a7a75960d026655f3acd1de8a672e80a5776Brad Fitzpatrick // Note that we ignore the strict_policy and don't propagate it 22227b3a7a75960d026655f3acd1de8a672e80a5776Brad Fitzpatrick // further (since we do no outbound RPCs anyway). 22327b3a7a75960d026655f3acd1de8a672e80a5776Brad Fitzpatrick strict_policy = bio_get_uint32(msg); 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s = bio_get_string16(msg, &len); 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((len != (sizeof(svcmgr_id) / 2)) || 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project memcmp(svcmgr_id, s, sizeof(svcmgr_id))) { 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr,"invalid id %s\n", str8(s)); 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return -1; 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch(txn->code) { 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case SVC_MGR_GET_SERVICE: 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case SVC_MGR_CHECK_SERVICE: 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s = bio_get_string16(msg, &len); 235a573f6a1d9b12393fbdfd2c0850499973849854bDianne Hackborn ptr = do_find_service(bs, s, len, txn->sender_euid); 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!ptr) 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bio_put_ref(reply, ptr); 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case SVC_MGR_ADD_SERVICE: 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s = bio_get_string16(msg, &len); 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ptr = bio_get_ref(msg); 244a573f6a1d9b12393fbdfd2c0850499973849854bDianne Hackborn allow_isolated = bio_get_uint32(msg) ? 1 : 0; 245a573f6a1d9b12393fbdfd2c0850499973849854bDianne Hackborn if (do_add_service(bs, s, len, ptr, txn->sender_euid, allow_isolated)) 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return -1; 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case SVC_MGR_LIST_SERVICES: { 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project unsigned n = bio_get_uint32(msg); 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project si = svclist; 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while ((n-- > 0) && si) 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project si = si->next; 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (si) { 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bio_put_string16(reply, si->name); 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return -1; 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project default: 2623762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("unknown code %d\n", txn->code); 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return -1; 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bio_put_uint32(reply, 0); 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint main(int argc, char **argv) 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project struct binder_state *bs; 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void *svcmgr = BINDER_SERVICE_MANAGER; 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bs = binder_open(128*1024); 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (binder_become_context_manager(bs)) { 2783762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("cannot become context manager (%s)\n", strerror(errno)); 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return -1; 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project svcmgr_handle = svcmgr; 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project binder_loop(bs, svcmgr_handler); 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 286