/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package java.io;
import android.system.ErrnoException;
import libcore.io.Libcore;
import static android.system.OsConstants.*;
/**
* Wraps a Unix file descriptor. It's possible to get the file descriptor used by some
* classes (such as {@link FileInputStream}, {@link FileOutputStream},
* and {@link RandomAccessFile}), and then create new streams that point to the same
* file descriptor.
*/
public final class FileDescriptor {
/**
* Corresponds to {@code stdin}.
*/
public static final FileDescriptor in = new FileDescriptor();
/**
* Corresponds to {@code stdout}.
*/
public static final FileDescriptor out = new FileDescriptor();
/**
* Corresponds to {@code stderr}.
*/
public static final FileDescriptor err = new FileDescriptor();
/**
* The Unix file descriptor backing this FileDescriptor.
* A value of -1 indicates that this FileDescriptor is invalid.
*/
private int descriptor = -1;
static {
in.descriptor = STDIN_FILENO;
out.descriptor = STDOUT_FILENO;
err.descriptor = STDERR_FILENO;
}
/**
* Constructs a new invalid FileDescriptor.
*/
public FileDescriptor() {
}
/**
* Ensures that data which is buffered within the underlying implementation
* is written out to the appropriate device before returning.
*/
public void sync() throws SyncFailedException {
try {
if (Libcore.os.isatty(this)) {
Libcore.os.tcdrain(this);
} else {
Libcore.os.fsync(this);
}
} catch (ErrnoException errnoException) {
SyncFailedException sfe = new SyncFailedException(errnoException.getMessage());
sfe.initCause(errnoException);
throw sfe;
}
}
/**
* Tests whether this {@code FileDescriptor} is valid.
*/
public boolean valid() {
return descriptor != -1;
}
/**
* Returns the int fd. It's highly unlikely you should be calling this. Please discuss
* your needs with a libcore maintainer before using this method.
* @hide internal use only
*/
public final int getInt$() {
return descriptor;
}
/**
* Sets the int fd. It's highly unlikely you should be calling this. Please discuss
* your needs with a libcore maintainer before using this method.
* @hide internal use only
*/
public final void setInt$(int fd) {
this.descriptor = fd;
}
/**
* @hide internal use only
*/
public final boolean isSocket$() {
return isSocket(descriptor);
}
private static native boolean isSocket(int fd);
@Override public String toString() {
return "FileDescriptor[" + descriptor + "]";
}
}