IShellCallback.cpp revision 1941a404d642b3dfaac365ba494f1e9912876f00
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 191941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn#include <binder/IShellCallback.h> 201941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn 211941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn#include <utils/Log.h> 221941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn#include <binder/Parcel.h> 231941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn#include <utils/String8.h> 241941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn 251941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn#include <private/binder/Static.h> 261941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn 271941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackbornnamespace android { 281941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn 291941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn// ---------------------------------------------------------------------- 301941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn 311941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackbornclass BpShellCallback : public BpInterface<IShellCallback> 321941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn{ 331941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackbornpublic: 341941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn explicit BpShellCallback(const sp<IBinder>& impl) 351941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn : BpInterface<IShellCallback>(impl) 361941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn { 371941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn } 381941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn 391941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn virtual int openOutputFile(const String16& path, const String16& seLinuxContext) { 401941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn Parcel data, reply; 411941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn data.writeInterfaceToken(IShellCallback::getInterfaceDescriptor()); 421941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn data.writeString16(path); 431941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn data.writeString16(seLinuxContext); 441941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn remote()->transact(OP_OPEN_OUTPUT_FILE, data, &reply, 0); 451941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn reply.readExceptionCode(); 461941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn int fd = reply.readParcelFileDescriptor(); 471941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn return fd >= 0 ? dup(fd) : fd; 481941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn 491941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn } 501941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn}; 511941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn 521941a404d642b3dfaac365ba494f1e9912876f00Dianne HackbornIMPLEMENT_META_INTERFACE(ShellCallback, "com.android.internal.os.IShellCallback"); 531941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn 541941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn// ---------------------------------------------------------------------- 551941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn 561941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackbornstatus_t BnShellCallback::onTransact( 571941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) 581941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn{ 591941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn switch(code) { 601941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn case OP_OPEN_OUTPUT_FILE: { 611941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn CHECK_INTERFACE(IShellCallback, data, reply); 621941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn String16 path(data.readString16()); 631941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn String16 seLinuxContext(data.readString16()); 641941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn int fd = openOutputFile(path, seLinuxContext); 651941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn if (reply != NULL) { 661941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn reply->writeNoException(); 671941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn if (fd >= 0) { 681941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn reply->writeInt32(1); 691941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn reply->writeParcelFileDescriptor(fd, true); 701941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn } else { 711941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn reply->writeInt32(0); 721941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn } 731941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn } else if (fd >= 0) { 741941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn close(fd); 751941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn } 761941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn return NO_ERROR; 771941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn } break; 781941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn default: 791941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn return BBinder::onTransact(code, data, reply, flags); 801941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn } 811941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn} 821941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn 831941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn}; // namespace android 84