Exemplo n.º 1
0
int archivefs_create(const char *path, mode_t mode, struct fuse_file_info *info) {
  char fpath[PATH_MAX];
  fullpath(fpath, path);

  FileSystem* fs;
  int ret;

  if (!getFile(fpath, &fs, NULL)) {
    ret = creat(fpath, mode);
    if (ret == -1) {
      ret = errno;
      print_err("CREATE", path, ret);
      return -ret;
    }
    info->fh = intptr_t(ret);
    return 0;
  }

  FileNode* node;
  char* file;
  parsePathName(fpath, &file);

  struct fuse_context* context = fuse_get_context();
  if (fs->parentAccess(file, W_OK|X_OK, context->uid, context->gid))
    return -EACCES;

  ret = fs->create(file, mode, &node);
  if (ret)
    print_err("CREATE", path, ret);

  info->fh = intptr_t(new FileHandle(fs, node));
  return -ret;
}
Exemplo n.º 2
0
int main()
{
	FileSystem fileSystem;
	int errCode;
	
	//Format filesystem
	errCode = fileSystem.formatDisk();
	if(errCode == 1)
		cout<<"Filesystem formatting failed"<<endl;

	//Create a file and open it
	int file1 = fileSystem.create();
	int fileid1 = fileSystem.open(file1);

	//This is the data we'll write
	byte buffer[] = "Implementing File Systems, a test program";

	//Seek to a large distance so that we actually cause an indirection. As usual, we skip the first 10 blocks, and then write
	//Note that 256 is the block size. So, we seek to skip the first 10 direct blocks and then 10 bytes
	fileSystem.seek(fileid1, 10*256 + 10, SEEK_CUR);

	//Write 20 bytes at that position
	//If you could not write 20 bytes, that is definitely an error
	if(fileSystem.write(fileid1, buffer, 20) != 20)
		cerr<<"Error!"<<endl;

	//Close the file
	fileSystem.close(fileid1);
	
	//Reopen
	fileid1 = fileSystem.open(file1);

	/* Read from file currently does not work. So, commenting out */
	/*
	byte readbuf[16] = "\0";
	fileSystem.read(fileid1, readbuf, 6);

	cout<<"Read"<<readbuf<<"done" <<endl;
	*/

	//Owing to the non-functionality of read(), del() cannot be tested
	//fileSystem.del(fileid1);

	//By our write, we can calculate that the data block is 22
	//free() would free that block and add it to the free list
	//free() is a private function, however to show that it works, all you have to do is modify the FileSystem.h file and uncomment the following statement
	//fileSystem.free(22);
	
	//Also note that inumber() works. It is trivial to verify this
	//Only read() and del() do not work.

	return 0;
}
Exemplo n.º 3
0
int main()
{
	FileSystem sys;
	sys.create("partition.sys");
	Directory* root = sys.getRoot();

	Directory* home = new Directory("home");
	Directory* poney = new Directory("poney");

	File* bashrc = new File(".bashrc");
	bashrc->append("[ -f .bash_aliases ] && . .bash_aliases");

	root->addNode(home);
	home->addNode(poney);
	poney->addNode(bashrc);

	sys.flush();
}
Exemplo n.º 4
0
int main(void) {
	//_CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );

    FileSystem fs;

    string userCommand, commandArr[MAXCOMMANDS];
    string user = "******";    // Change this if you want another user to be displayed
    string currentDir = "/";    // current directory, used for output

    bool bRun = true;
	fs.format();
	//HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);

    do {
		currentDir = fs.GetCWD();
		string data = "";
		//SetConsoleTextAttribute(hConsole, 10);
		cout << user << " ";
		//SetConsoleTextAttribute(hConsole, 14);
		cout << currentDir << endl;
		//SetConsoleTextAttribute(hConsole, 15);
		cout << "$ ";
        getline(cin, userCommand);

		for (unsigned i = 0; i < MAXCOMMANDS; ++i)
			commandArr[i] = "";

        int nrOfCommands = parseCommandString(userCommand, commandArr);
        if (nrOfCommands > 0) {

            int cIndex = findCommand(commandArr[0]);
            switch(cIndex) {

            case 0: // quit
                bRun = false;
                cout << "Exiting\n";
                break;
            case 1: // format
				fs.format();
                break;
            case 2: // ls
				if (commandArr[1] == "")
					fs.ls();
				else
					fs.ls(commandArr[1]);
                break;
            case 3: // create
				printf("Please Insert Data:\n");
				getline( cin, data );
				fs.create(commandArr[1],data);
                break;
            case 4: // cat
				fs.cat(commandArr[1]);
                break;
            case 5: // createImage
				fs.createImage( commandArr[1] );
                break;
            case 6: // restoreImage
				fs.restoreImage( commandArr[1] );
                break;
            case 7: // rm
				fs.rm(commandArr[1]);
                break;

            case 8: // copy
				fs.copy( commandArr[1], commandArr[2] );
                break;

            case 9: // append
				fs.append( commandArr[1], commandArr[2] );
                break;

            case 10: // rename
				fs.rename( commandArr[1], commandArr[2] );
                break;

            case 11: // mkdir
				fs.mkdir(commandArr[1]);
                break;

            case 12: // cd
				fs.cd(commandArr[1]);
                break;

            case 13: // pwd
				cout << fs.GetCWD() << endl;
                break;

            case 14: // help
                cout << help() << endl;
                break;

			case 15: // rmdir
				fs.rmdir(commandArr[1]);
				break;

			case 16: // chmod
				fs.chmod( atoi( commandArr[1].c_str() ), commandArr[2] );
				break;

            default:
                cout << "Unknown command: " << commandArr[0] << endl;

            }

			cout << endl;
        }
    } while (bRun == true);

    return 0;
}