NetdNativeService.cpp revision e4d626ea35b7a402388b524e2feafc81e6387697
1e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti/** 2e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti * Copyright (c) 2016, The Android Open Source Project 3e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti * 4e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti * Licensed under the Apache License, Version 2.0 (the "License"); 5e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti * you may not use this file except in compliance with the License. 6e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti * You may obtain a copy of the License at 7e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti * 8e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti * http://www.apache.org/licenses/LICENSE-2.0 9e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti * 10e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti * Unless required by applicable law or agreed to in writing, software 11e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti * distributed under the License is distributed on an "AS IS" BASIS, 12e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti * See the License for the specific language governing permissions and 14e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti * limitations under the License. 15e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti */ 16e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti 17e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti#define LOG_TAG "Netd" 18e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti 19e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti#include <android-base/stringprintf.h> 20e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti#include <cutils/log.h> 21e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti#include <utils/Errors.h> 22e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti 23e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti#include <binder/IPCThreadState.h> 24e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti#include <binder/IServiceManager.h> 25e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti#include "android/net/BnNetd.h" 26e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti 27e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti#include "NetdConstants.h" 28e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti#include "NetdNativeService.h" 29e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti 30e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colittiusing android::base::StringPrintf; 31e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti 32e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colittinamespace android { 33e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colittinamespace net { 34e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti 35e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colittinamespace { 36e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti 37e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitticonst char CONNECTIVITY_INTERNAL[] = "android.permission.CONNECTIVITY_INTERNAL"; 38e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti 39e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colittibinder::Status checkPermission(const char *permission) { 40e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti pid_t pid; 41e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti uid_t uid; 42e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti 43e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti if (checkCallingPermission(String16(permission), (int32_t *) &pid, (int32_t *) &uid)) { 44e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti return binder::Status::ok(); 45e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti } else { 46e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti auto err = StringPrintf("UID %d / PID %d lacks permission %s", uid, pid, permission); 47e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti return binder::Status::fromExceptionCode(binder::Status::EX_SECURITY, String8(err.c_str())); 48e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti } 49e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti} 50e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti 51e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti#define ENFORCE_PERMISSION(permission) { \ 52e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti binder::Status status = checkPermission((permission)); \ 53e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti if (!status.isOk()) { \ 54e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti return status; \ 55e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti } \ 56e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti} 57e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti 58e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti#define NETD_LOCKING_RPC(permission) \ 59e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti ENFORCE_PERMISSION(permission); \ 60e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti android::RWLock::AutoWLock lock(gBigNetdLock); 61e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti 62e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti} // namespace 63e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti 64e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti 65e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colittibinder::Status NetdNativeService::isAlive(bool *alive) { 66e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti NETD_LOCKING_RPC(CONNECTIVITY_INTERNAL); 67e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti 68e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti *alive = true; 69e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti return binder::Status::ok(); 70e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti} 71e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti 72e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti} // namespace net 73e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti} // namespace android 74