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 424217f8ecfe8f884288104262000275c1633b983eDianne Hackborn virtual int openFile(const String16& path, const String16& seLinuxContext, 434217f8ecfe8f884288104262000275c1633b983eDianne Hackborn const String16& mode) { 441941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn Parcel data, reply; 451941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn data.writeInterfaceToken(IShellCallback::getInterfaceDescriptor()); 461941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn data.writeString16(path); 471941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn data.writeString16(seLinuxContext); 484217f8ecfe8f884288104262000275c1633b983eDianne Hackborn data.writeString16(mode); 491941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn remote()->transact(OP_OPEN_OUTPUT_FILE, data, &reply, 0); 501941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn reply.readExceptionCode(); 511941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn int fd = reply.readParcelFileDescriptor(); 52ec9ec7d55c63f791ab3ed9221e68d6215f7b928aNick Kralevich return fd >= 0 ? fcntl(fd, F_DUPFD_CLOEXEC, 0) : fd; 531941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn 541941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn } 551941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn}; 561941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn 571941a404d642b3dfaac365ba494f1e9912876f00Dianne HackbornIMPLEMENT_META_INTERFACE(ShellCallback, "com.android.internal.os.IShellCallback"); 581941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn 591941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn// ---------------------------------------------------------------------- 601941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn 611941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackbornstatus_t BnShellCallback::onTransact( 621941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) 631941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn{ 641941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn switch(code) { 651941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn case OP_OPEN_OUTPUT_FILE: { 661941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn CHECK_INTERFACE(IShellCallback, data, reply); 671941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn String16 path(data.readString16()); 681941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn String16 seLinuxContext(data.readString16()); 694217f8ecfe8f884288104262000275c1633b983eDianne Hackborn String16 mode(data.readString16()); 704217f8ecfe8f884288104262000275c1633b983eDianne Hackborn int fd = openFile(path, seLinuxContext, mode); 711941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn if (reply != NULL) { 721941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn reply->writeNoException(); 731941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn if (fd >= 0) { 741941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn reply->writeInt32(1); 751941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn reply->writeParcelFileDescriptor(fd, true); 761941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn } else { 771941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn reply->writeInt32(0); 781941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn } 791941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn } else if (fd >= 0) { 801941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn close(fd); 811941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn } 821941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn return NO_ERROR; 831941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn } break; 841941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn default: 851941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn return BBinder::onTransact(code, data, reply, flags); 861941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn } 871941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn} 881941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn 891941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn}; // namespace android 90