Change FileDescriptor to PFD, per API guidelines.
handleShellCommand() would be a system API, so we should use PFD instead,
per the API guidelines.
Bug: 142751512
Test: "adb shell cmd jobschduler help" -> show help
Test: "$ cmd jobscheduler run abc 123" -> shows "Package not found: abc / user 0"
Test: "adb shell cmd activity help" -> show help
Change-Id: I64b1e4c540db836cc4a46fed24a038b7077ecb63
diff --git a/apex/jobscheduler/service/java/com/android/server/job/JobSchedulerService.java b/apex/jobscheduler/service/java/com/android/server/job/JobSchedulerService.java
index 593e494..0a4e020 100644
--- a/apex/jobscheduler/service/java/com/android/server/job/JobSchedulerService.java
+++ b/apex/jobscheduler/service/java/com/android/server/job/JobSchedulerService.java
@@ -57,6 +57,7 @@
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
+import android.os.ParcelFileDescriptor;
import android.os.Process;
import android.os.RemoteException;
import android.os.ServiceManager;
@@ -2688,13 +2689,14 @@
}
@Override
- protected int handleShellCommand(@NonNull FileDescriptor in, @NonNull FileDescriptor out,
- @NonNull FileDescriptor err, @NonNull String[] args) {
+ protected int handleShellCommand(@NonNull ParcelFileDescriptor in,
+ @NonNull ParcelFileDescriptor out, @NonNull ParcelFileDescriptor err,
+ @NonNull String[] args) {
return (new JobSchedulerShellCommand(JobSchedulerService.this)).exec(
- this, in, out, err, args);
+ this, in.getFileDescriptor(), out.getFileDescriptor(), err.getFileDescriptor(),
+ args);
}
-
/**
* <b>For internal system user only!</b>
* Returns a list of all currently-executing jobs.
diff --git a/core/java/android/os/Binder.java b/core/java/android/os/Binder.java
index a856975..ec39199 100644
--- a/core/java/android/os/Binder.java
+++ b/core/java/android/os/Binder.java
@@ -932,8 +932,14 @@
}
int result = -1;
- try {
- result = handleShellCommand(in, out, err, args);
+ try (ParcelFileDescriptor inPfd = ParcelFileDescriptor.dup(in);
+ ParcelFileDescriptor outPfd = ParcelFileDescriptor.dup(out);
+ ParcelFileDescriptor errPfd = ParcelFileDescriptor.dup(err)) {
+ result = handleShellCommand(inPfd, outPfd, errPfd, args);
+ } catch (IOException e) {
+ PrintWriter pw = new FastPrintWriter(new FileOutputStream(err));
+ pw.println("dup() failed: " + e.getMessage());
+ pw.flush();
} finally {
resultReceiver.send(result, null);
}
@@ -954,9 +960,10 @@
* @hide
*/
// @SystemApi TODO Make it a system API.
- protected int handleShellCommand(@NonNull FileDescriptor in, @NonNull FileDescriptor out,
- @NonNull FileDescriptor err, @NonNull String[] args) {
- FileOutputStream ferr = new FileOutputStream(err);
+ protected int handleShellCommand(@NonNull ParcelFileDescriptor in,
+ @NonNull ParcelFileDescriptor out, @NonNull ParcelFileDescriptor err,
+ @NonNull String[] args) {
+ FileOutputStream ferr = new FileOutputStream(err.getFileDescriptor());
PrintWriter pw = new FastPrintWriter(ferr);
pw.println("No shell command implementation.");
pw.flush();