IShellCallback.cpp revision ec9ec7d55c63f791ab3ed9221e68d6215f7b928a
11941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn/* 21941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn * Copyright (C) 2016 The Android Open Source Project 31941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn * 41941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn * Licensed under the Apache License, Version 2.0 (the "License"); 51941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn * you may not use this file except in compliance with the License. 61941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn * You may obtain a copy of the License at 71941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn * 81941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn * http://www.apache.org/licenses/LICENSE-2.0 91941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn * 101941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn * Unless required by applicable law or agreed to in writing, software 111941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn * distributed under the License is distributed on an "AS IS" BASIS, 121941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 131941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn * See the License for the specific language governing permissions and 141941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn * limitations under the License. 151941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn */ 161941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn 171941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn#define LOG_TAG "ShellCallback" 181941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn 19ec9ec7d55c63f791ab3ed9221e68d6215f7b928aNick Kralevich#include <unistd.h> 20ec9ec7d55c63f791ab3ed9221e68d6215f7b928aNick Kralevich#include <fcntl.h> 21ec9ec7d55c63f791ab3ed9221e68d6215f7b928aNick Kralevich 221941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn#include <binder/IShellCallback.h> 231941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn 241941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn#include <utils/Log.h> 251941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn#include <binder/Parcel.h> 261941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn#include <utils/String8.h> 271941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn 281941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn#include <private/binder/Static.h> 291941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn 301941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackbornnamespace android { 311941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn 321941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn// ---------------------------------------------------------------------- 331941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn 341941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackbornclass BpShellCallback : public BpInterface<IShellCallback> 351941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn{ 361941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackbornpublic: 371941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn explicit BpShellCallback(const sp<IBinder>& impl) 381941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn : BpInterface<IShellCallback>(impl) 391941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn { 401941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn } 411941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn 421941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn virtual int openOutputFile(const String16& path, const String16& seLinuxContext) { 431941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn Parcel data, reply; 441941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn data.writeInterfaceToken(IShellCallback::getInterfaceDescriptor()); 451941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn data.writeString16(path); 461941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn data.writeString16(seLinuxContext); 471941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn remote()->transact(OP_OPEN_OUTPUT_FILE, data, &reply, 0); 481941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn reply.readExceptionCode(); 491941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn int fd = reply.readParcelFileDescriptor(); 50ec9ec7d55c63f791ab3ed9221e68d6215f7b928aNick Kralevich return fd >= 0 ? fcntl(fd, F_DUPFD_CLOEXEC, 0) : fd; 511941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn 521941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn } 531941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn}; 541941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn 551941a404d642b3dfaac365ba494f1e9912876f00Dianne HackbornIMPLEMENT_META_INTERFACE(ShellCallback, "com.android.internal.os.IShellCallback"); 561941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn 571941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn// ---------------------------------------------------------------------- 581941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn 591941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackbornstatus_t BnShellCallback::onTransact( 601941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) 611941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn{ 621941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn switch(code) { 631941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn case OP_OPEN_OUTPUT_FILE: { 641941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn CHECK_INTERFACE(IShellCallback, data, reply); 651941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn String16 path(data.readString16()); 661941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn String16 seLinuxContext(data.readString16()); 671941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn int fd = openOutputFile(path, seLinuxContext); 681941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn if (reply != NULL) { 691941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn reply->writeNoException(); 701941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn if (fd >= 0) { 711941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn reply->writeInt32(1); 721941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn reply->writeParcelFileDescriptor(fd, true); 731941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn } else { 741941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn reply->writeInt32(0); 751941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn } 761941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn } else if (fd >= 0) { 771941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn close(fd); 781941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn } 791941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn return NO_ERROR; 801941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn } break; 811941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn default: 821941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn return BBinder::onTransact(code, data, reply, flags); 831941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn } 841941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn} 851941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn 861941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn}; // namespace android 87