97 lines
3.1 KiB
C++
97 lines
3.1 KiB
C++
// 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
|