/*
* main.cpp
*
*
*/
#include <iostream>
#include <stdlib.h>
#include<string.h>
#include<curses.h>
using namespace std;
typedef struct User
{
string name[30];
string passwd[30];
int n;
} User, u;
typedef struct Priv
{
char read;
char write;
char execute;
} Priv, priv[3];
//记录文件信息。name表示第几块,用disk模拟
typedef struct DataStock
{
int name; //第几盘块号
int stock_num;
struct DataStock *next;
} DataStock, *ds;
// 一个节点信息,可能是一个目录或者一个文件。
// 如果是一个目录,那么下面会有子目录childnode, inode_num,
//记录子目录项的数目
typedef struct Inode
{
int inode_num;
int type; //文件类型,文件/目录 0/1
float size;
Priv *priv;
char* owneruser;
struct tm *createtime;
struct Inode** childnode;
struct DataStock *datastock;
} Inode;
//一个目录项,
typedef struct Dentry
{
string name;
struct Inode *inode;
} Dentry;
int number = 1000;
//默认路径是/home, 用户名是" ".
string rootDirect = "/home";
string currentUser = " ";
string currentPath = rootDirect;
User user;
Dentry dentry[1000];
int of_record = 0;
int record = -1;
//磁盘块
int disk_record = 0;//记录使用了多少磁盘块
int disk_stock = 3; //三个字节为一个盘块
string *disk = new string[number]; //模拟磁盘存储 1000个磁盘块
int firstempty = 0;
// 命令行
int command_number = 10;
int command_record = 0;
string *commandsave = new string[command_number];
int umask_direct = 775;
int umask_file = 664;
void test()
{
for (int i = 0; i < disk_record; i++)
{
cout << disk[i];
}
}
void showDisk()
{
for (int i = 0; i < disk_record; i++)
{
cout << "第" << i << "个磁盘块:" << disk[i] << endl;
}
}
void output()
{
cout << "[" << currentUser << "@" << "localhost" << currentPath << "]#";
}
//数据块节点初始化
DataStock *initializeStock()
{
DataStock *head;
head = (DataStock*) malloc(sizeof(DataStock));
head->name = -1;
head->next = NULL;
return head;
}
//inode节点初始化
// 跟踪 // initalizeInode(1,"home",-1)
Inode *initializeInode(int type, string u, int p)
{
Inode *inode = NULL;
inode = (Inode*) malloc(sizeof(Inode));
inode->childnode = (Inode**) malloc(100 * sizeof(Inode*));
inode->inode_num = 0;
inode->type = type;
inode->datastock = initializeStock();
inode->size = 0;
if(p == 0)
inode->owneruser = (char*) u.data();
else
inode->owneruser = (char*) currentUser.data();
time_t ctime;
time(&ctime);
inode->createtime = localtime(&ctime);
//权限初始化
Priv *priv = (Priv*) malloc(sizeof(Priv));
if(type == 0) //文件
{
priv[0].read = 'r';
priv[0].write = 'w';
priv[0].execute = '-';
priv[1].read = 'r';
priv[1].write = 'w';
priv[1].execute = '-';
priv[2].read = 'r';
priv[2].write = '-';
priv[2].execute = '-';
}
else
{ //目录
priv[0].read = 'r';
priv[0].write = 'w';
priv[0].execute = 'x';
priv[1].read = 'r';
priv[1].write = 'w';
priv[1].execute = 'x';
priv[2].read = 'r';
priv[2].write = '-';
priv[2].execute = '-';
}
inode->priv = priv;
return inode;
}
//根据目录项名字找对应的目录项
Dentry findDentry(char *dentryname)
{
Dentry temp;
for (int i = 0; i <= record; i++)
{
if(strcmp((char*) dentry[i].name.data(), dentryname) == 0)
{
temp = dentry[i];
break;
}
}
return temp;
}
//根据inode节点找相对应的目录项
Dentry searchDentry(Inode *inode)
{
Dentry temp;
for (int i = 0; i <= record; i++)
{
if(dentry[i].inode == inode)
{
temp = dentry[i];
break;
}
}
return temp;
}
//得到当前路径,如/home/root/sxw,最终返回结果为sxw
// i+1 - endname.size() 为路径名
int getEndPath(string endname)
{
std::cout<<"endname = "<<endname<<std::endl;
int i = 0;
for (i = endname.size(); i >= 0; i--)
{
if(endname[i] != '/')
{
continue;
}
break;
}
return (i + 1);
}
int judge(string path)
{
int