Initial version
This commit is contained in:
commit
6f405265a5
102 changed files with 14486 additions and 0 deletions
97
code/filesys/openfile.h
Normal file
97
code/filesys/openfile.h
Normal file
|
@ -0,0 +1,97 @@
|
|||
// openfile.h
|
||||
// Data structures for opening, closing, reading and writing to
|
||||
// individual files. The operations supported are similar to
|
||||
// the UNIX ones -- type 'man open' to the UNIX prompt.
|
||||
//
|
||||
// There are two implementations. One is a "STUB" that directly
|
||||
// turns the file operations into the underlying UNIX operations.
|
||||
// (cf. comment in filesys.h).
|
||||
//
|
||||
// The other is the "real" implementation, that turns these
|
||||
// operations into read and write disk sector requests.
|
||||
// In this baseline implementation of the file system, we don't
|
||||
// worry about concurrent accesses to the file system
|
||||
// by different threads -- this is part of the assignment.
|
||||
//
|
||||
// Copyright (c) 1992-1993 The Regents of the University of California.
|
||||
// All rights reserved. See copyright.h for copyright notice and limitation
|
||||
// of liability and disclaimer of warranty provisions.
|
||||
|
||||
#ifndef OPENFILE_H
|
||||
#define OPENFILE_H
|
||||
|
||||
#include "copyright.h"
|
||||
#include "utility.h"
|
||||
|
||||
#ifdef FILESYS_STUB // Temporarily implement calls to
|
||||
// Nachos file system as calls to UNIX!
|
||||
// See definitions listed under #else
|
||||
class OpenFile:public dontcopythis {
|
||||
public:
|
||||
OpenFile(int f) { file = f; currentOffset = 0; } // open the file
|
||||
~OpenFile() { Close(file); file = -1; } // close the file
|
||||
|
||||
int ReadAt(void *into, int numBytes, int position) {
|
||||
Lseek(file, position, SEEK_SET);
|
||||
return ReadPartial(file, into, numBytes);
|
||||
}
|
||||
int WriteAt(const void *from, int numBytes, int position) {
|
||||
Lseek(file, position, SEEK_SET);
|
||||
WriteFile(file, from, numBytes);
|
||||
return numBytes;
|
||||
}
|
||||
int Read(void *into, int numBytes) {
|
||||
int numRead = ReadAt(into, numBytes, currentOffset);
|
||||
currentOffset += numRead;
|
||||
return numRead;
|
||||
}
|
||||
int Write(const void *from, int numBytes) {
|
||||
int numWritten = WriteAt(from, numBytes, currentOffset);
|
||||
currentOffset += numWritten;
|
||||
return numWritten;
|
||||
}
|
||||
|
||||
int Length() { Lseek(file, 0, SEEK_END); return Tell(file); }
|
||||
|
||||
private:
|
||||
int file;
|
||||
int currentOffset;
|
||||
};
|
||||
|
||||
#else // FILESYS
|
||||
class FileHeader;
|
||||
|
||||
class OpenFile:public dontcopythis {
|
||||
public:
|
||||
OpenFile(int sector); // Open a file whose header is located
|
||||
// at "sector" on the disk
|
||||
~OpenFile(); // Close the file
|
||||
|
||||
void Seek(int position); // Set the position from which to
|
||||
// start reading/writing -- UNIX lseek
|
||||
|
||||
int Read(void *into, int numBytes); // Read/write bytes from the file,
|
||||
// starting at the implicit position.
|
||||
// Return the # actually read/written,
|
||||
// and increment position in file.
|
||||
int Write(const void *from, int numBytes);
|
||||
|
||||
int ReadAt(void *into, int numBytes, int position);
|
||||
// Read/write bytes from the file,
|
||||
// bypassing the implicit position.
|
||||
// Return the # actually read/written.
|
||||
int WriteAt(const void *from, int numBytes, int position);
|
||||
|
||||
int Length(); // Return the number of bytes in the
|
||||
// file (this interface is simpler
|
||||
// than the UNIX idiom -- lseek to
|
||||
// end of file, tell, lseek back
|
||||
|
||||
private:
|
||||
FileHeader *hdr; // Header for this file
|
||||
int seekPosition; // Current position within the file
|
||||
};
|
||||
|
||||
#endif // FILESYS
|
||||
|
||||
#endif // OPENFILE_H
|
Loading…
Add table
Add a link
Reference in a new issue