From: <mic...@us...> - 2007-05-16 18:14:17
|
Revision: 116 http://svn.sourceforge.net/pearcolator/?rev=116&view=rev Author: michael_baer Date: 2007-05-16 11:14:08 -0700 (Wed, 16 May 2007) Log Message: ----------- Enhanced virtual file system with capabilities to query a file's size Modified Paths: -------------- src/org/binarytranslator/generic/os/abi/linux/LinuxSystemCalls.java src/org/binarytranslator/generic/os/abi/linux/files/ConsoleIn.java src/org/binarytranslator/generic/os/abi/linux/files/ConsoleOut.java src/org/binarytranslator/generic/os/abi/linux/files/FixedContentFile.java src/org/binarytranslator/generic/os/abi/linux/files/HostFile.java src/org/binarytranslator/generic/os/abi/linux/files/OpenFile.java src/org/binarytranslator/generic/os/abi/linux/files/OpenFileList.java src/org/binarytranslator/generic/os/abi/linux/filesystem/ReadonlyFilesystem.java Modified: src/org/binarytranslator/generic/os/abi/linux/LinuxSystemCalls.java =================================================================== --- src/org/binarytranslator/generic/os/abi/linux/LinuxSystemCalls.java 2007-05-15 21:58:53 UTC (rev 115) +++ src/org/binarytranslator/generic/os/abi/linux/LinuxSystemCalls.java 2007-05-16 18:14:08 UTC (rev 116) @@ -8,13 +8,19 @@ */ package org.binarytranslator.generic.os.abi.linux; +import java.io.IOException; +import java.net.InetAddress; +import java.net.UnknownHostException; + import org.binarytranslator.DBT; import org.binarytranslator.DBT_Options; import org.binarytranslator.generic.memory.Memory; import org.binarytranslator.generic.memory.MemoryMapException; +import org.binarytranslator.generic.os.abi.linux.LinuxConstants.errno; +import org.binarytranslator.generic.os.abi.linux.LinuxConstants.fcntl; +import org.binarytranslator.generic.os.abi.linux.LinuxConstants.mman; import org.binarytranslator.generic.os.abi.linux.files.ConsoleIn; import org.binarytranslator.generic.os.abi.linux.files.ConsoleOut; -import org.binarytranslator.generic.os.abi.linux.files.HostFile; import org.binarytranslator.generic.os.abi.linux.files.OpenFile; import org.binarytranslator.generic.os.abi.linux.files.OpenFileList; import org.binarytranslator.generic.os.abi.linux.files.ReadableFile; @@ -25,15 +31,7 @@ import org.binarytranslator.generic.os.abi.linux.filesystem.ReadonlyFilesystem; import org.binarytranslator.generic.os.abi.linux.filesystem.TempFileSystem; import org.binarytranslator.generic.os.abi.linux.filesystem.FileProvider.FileMode; -import org.binarytranslator.generic.os.abi.linux.LinuxConstants.*; -import java.io.File; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.RandomAccessFile; -import java.net.InetAddress; -import java.net.UnknownHostException; - /** * Linux system call handling class */ @@ -344,6 +342,9 @@ // accordingly. args[0] points to the file name. String fileName = memoryReadString(pathname); + if (DBT_Options.debugSyscall) + System.err.println("Program tries to open: " + fileName); + FileMode mode; //shall we create the target file? @@ -459,6 +460,7 @@ public class SysFstat64 extends SystemCall { public void doSysCall() { int fd = arguments.nextInt(); + int structAddr = arguments.nextInt(); LinuxStructureFactory.stat64 buf = structures.new_stat64(); @@ -467,10 +469,22 @@ buf.st_rdev = (short) 0x8800; buf.__st_ino = buf.st_ino = 2; buf.st_blksize = 0x400; - } else - throw new RuntimeException("Unimplemented system call."); + } else { + + try { + //get the file from the file descriptor table + OpenFile file = openFiles.get(fd); + OpenFile.Info info = file.getFileInfo(); - buf.write(src.getProcessSpace().memory, arguments.nextInt()); + buf.st_size = info.size; + } catch (InvalidFileDescriptor e) { + src.setSysCallError(errno.EBADF); + } catch (Exception e) { + src.setSysCallError(errno.EIO); + } + } + + buf.write(src.getProcessSpace().memory, structAddr); src.setSysCallReturn(0); } } Modified: src/org/binarytranslator/generic/os/abi/linux/files/ConsoleIn.java =================================================================== --- src/org/binarytranslator/generic/os/abi/linux/files/ConsoleIn.java 2007-05-15 21:58:53 UTC (rev 115) +++ src/org/binarytranslator/generic/os/abi/linux/files/ConsoleIn.java 2007-05-16 18:14:08 UTC (rev 116) @@ -15,4 +15,8 @@ //no-op } + public Info getFileInfo() { + return null; + } + } Modified: src/org/binarytranslator/generic/os/abi/linux/files/ConsoleOut.java =================================================================== --- src/org/binarytranslator/generic/os/abi/linux/files/ConsoleOut.java 2007-05-15 21:58:53 UTC (rev 115) +++ src/org/binarytranslator/generic/os/abi/linux/files/ConsoleOut.java 2007-05-16 18:14:08 UTC (rev 116) @@ -21,4 +21,8 @@ public void close() throws IOException { //no-op } + + public Info getFileInfo() { + return null; + } } Modified: src/org/binarytranslator/generic/os/abi/linux/files/FixedContentFile.java =================================================================== --- src/org/binarytranslator/generic/os/abi/linux/files/FixedContentFile.java 2007-05-15 21:58:53 UTC (rev 115) +++ src/org/binarytranslator/generic/os/abi/linux/files/FixedContentFile.java 2007-05-16 18:14:08 UTC (rev 116) @@ -48,4 +48,8 @@ //no-op } + public Info getFileInfo() { + return new Info(data.length); + } + } Modified: src/org/binarytranslator/generic/os/abi/linux/files/HostFile.java =================================================================== --- src/org/binarytranslator/generic/os/abi/linux/files/HostFile.java 2007-05-15 21:58:53 UTC (rev 115) +++ src/org/binarytranslator/generic/os/abi/linux/files/HostFile.java 2007-05-16 18:14:08 UTC (rev 116) @@ -47,4 +47,9 @@ file.write(bytes); } } + + public Info getFileInfo() throws IOException { + + return new Info((int)file.length()); + } } Modified: src/org/binarytranslator/generic/os/abi/linux/files/OpenFile.java =================================================================== --- src/org/binarytranslator/generic/os/abi/linux/files/OpenFile.java 2007-05-15 21:58:53 UTC (rev 115) +++ src/org/binarytranslator/generic/os/abi/linux/files/OpenFile.java 2007-05-16 18:14:08 UTC (rev 116) @@ -6,5 +6,15 @@ * A base interface for all open files within linux. */ public interface OpenFile { + Info getFileInfo() throws IOException; void close() throws IOException; + + + public class Info { + public int size; + + public Info(int size) { + this.size = size; + } + } } Modified: src/org/binarytranslator/generic/os/abi/linux/files/OpenFileList.java =================================================================== --- src/org/binarytranslator/generic/os/abi/linux/files/OpenFileList.java 2007-05-15 21:58:53 UTC (rev 115) +++ src/org/binarytranslator/generic/os/abi/linux/files/OpenFileList.java 2007-05-16 18:14:08 UTC (rev 116) @@ -51,6 +51,10 @@ if (files.get(preferredFd) != null) { preferredFd = nextFileHandle++; } + else { + if (preferredFd >= nextFileHandle) + nextFileHandle = preferredFd + 1; + } files.put(preferredFd, file); return preferredFd; Modified: src/org/binarytranslator/generic/os/abi/linux/filesystem/ReadonlyFilesystem.java =================================================================== --- src/org/binarytranslator/generic/os/abi/linux/filesystem/ReadonlyFilesystem.java 2007-05-15 21:58:53 UTC (rev 115) +++ src/org/binarytranslator/generic/os/abi/linux/filesystem/ReadonlyFilesystem.java 2007-05-16 18:14:08 UTC (rev 116) @@ -5,15 +5,21 @@ /** * A file system decorator, that prevents all write-accesses to this file system. */ -public final class ReadonlyFilesystem implements FileProvider { +public final class ReadonlyFilesystem extends ChainedFileProvider { private final FileProvider filesystem; public ReadonlyFilesystem(FileProvider filesystem) { + this(filesystem, null); + } + + public ReadonlyFilesystem(FileProvider filesystem, FileProvider nextFilesystem) { + super(nextFilesystem); this.filesystem = filesystem; } - public OpenFile openFile(String file, FileMode mode) { + @Override + protected OpenFile tryOpen(String file, FileMode mode) { if (mode != FileMode.Read) return null; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |