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