Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "type.h"
- void cd(char *pn)
- {
- int ino, nchars,inocd;
- MINODE *mip;
- char *path;
- if(!strcmp(pn, "") || !strcmp(pn, "/"))
- {
- ino = root->ino;
- }
- else
- {
- //Get cwd ino
- ino = getino(dev, pn);
- }
- mip = iget(dev, ino);
- printf("\nIno: %d\nIMODE for target:%x\n",ino,mip->INODE.i_mode);
- //iput(running->cwd);
- //running->cwd = iget(dev, ino);
- printf("Set running->cwd to: %d\n", running->cwd->ino);
- if((mip->INODE.i_mode & 0040000) == 0040000)
- {
- iput(running->cwd);
- running->cwd = iget(dev, ino);
- printf("Set running->cwd to: %d\n", running->cwd->ino);
- }
- else
- {
- printf("\'%s\' is not a directory. i_mode: %x\n", pn, mip->INODE.i_mode);
- }
- iput(mip);
- }
- void printdir(INODE *inodePtr)
- {
- int i=0;
- int j=0;
- while ((i <12)&&(inodePtr->i_block[i]!=0))
- {
- int data_block=inodePtr->i_block[i];
- DIR *dp;
- char fbuff[1024];
- memset(fbuff, 0, 1024);
- lseek(fd,BLOCK_SIZE*data_block,SEEK_SET);
- read(fd,fbuff,BLOCK_SIZE);
- dp=(DIR *)fbuff;
- char *cp=fbuff;
- MINODE *mip;
- int ino = dp->inode;
- char name[256];
- while(cp<fbuff+1024)
- {
- mip = iget(fd, ino);
- if(S_ISREG( mip->INODE.i_mode ) ) printf("r");
- if(S_ISDIR( mip->INODE.i_mode ) ) printf("d");
- if(S_ISLNK( mip->INODE.i_mode ) ) printf("l");
- for(j=8; j>=0; j--) //Check bits and print permisions for
- {
- if(mip->INODE.i_mode & 1 << j)
- {
- if(j == 8 || j == 5 || j == 2) printf("r");
- else if(j == 7 || j == 4|| j == 1) printf("w");
- else printf("x");
- }
- else printf("-");
- }
- char time_s[64];
- ctime_r((time_t *)&mip->INODE.i_mtime, time_s);
- time_s[strlen(time_s)-1]=0;
- printf(" %3d%3d %3d%6d %20s ", dp->inode, mip->INODE.i_uid,
- mip->INODE.i_gid, mip->INODE.i_size, time_s);
- memmove(name, dp->name, dp->name_len);
- name[dp->name_len]='\0';
- if(S_ISLNK( mip->INODE.i_mode)){
- printf("%16s->%s\n",name,(char *)mip->INODE.i_block);
- }else{
- printf("%16s\n",name);
- }
- iput(mip);
- cp+=dp->rec_len;
- dp=(DIR *)cp;
- ino = dp->inode;
- }
- i++;
- }
- return;
- }
- void ls(char *pathname, PROC *parent)
- {
- INODE *cwd = calloc(sizeof(INODE), 1);
- char path[128] = "\0";
- strncpy(path, pathname, 128);
- int inodeIndex, seek;
- if(pathname[0] == '/') {
- strncpy(path, path+1, 127);
- char *token = strtok(path, "/");
- memcpy(cwd, &root->INODE,sizeof(INODE));
- while(token !=NULL) {
- inodeIndex =search(dev,cwd, token);
- if (inodeIndex==0) {
- printf("cannot find that directory\n");
- return;
- }
- seek =((inodeIndex-1)/8 + gp->bg_inode_table)*1024+(inodeIndex-1)%8
- *128;
- lseek(fd,seek,SEEK_SET);
- read(fd,cwd,sizeof(INODE));
- token=strtok(NULL,"/");
- }
- if((cwd->i_mode & 0040000) != 0040000){
- printf("cannot ls non dir");
- return;
- }
- printdir(cwd);
- return;
- }
- else if(pathname[0] <=0){
- printf("current dir: Ino %lu, Iblock[0]= %lu\n",(long unsigned
- int)parent->cwd->ino, (long unsigned int)parent->cwd->INODE.i_block[0]);
- printdir(&parent->cwd->INODE);
- return;
- }
- else{
- char *token=strtok(path,"/");
- memcpy(cwd, &parent->cwd->INODE,sizeof(INODE));
- while(token!=NULL){
- inodeIndex=search(dev,cwd,token);
- if (inodeIndex==0) {
- printf("cannot find that directory\n");
- return;
- }
- seek=((inodeIndex-1)/8 + gp->bg_inode_table)*1024+
- (inodeIndex-1)%8* 128;
- lseek(fd,seek,SEEK_SET);
- read(fd,cwd,sizeof(INODE));
- printdir(cwd);
- token=strtok(NULL,"/");
- }
- }
- }
- int do_pwd()
- {
- pwd(running->cwd,0);
- printf("\n");
- return 0;
- }
- char *pwd(MINODE *wd, int childIno)
- {
- char wdtemp[1024];
- wdtemp[0]='/';
- wdtemp[1]='\0';
- if(wd->ino == root->ino){
- printf("/");
- }
- char buf[1024], *cp,name[64];
- DIR *dp;
- MINODE *parentmip;
- get_block(fd, wd->INODE.i_block[0], (char *)&buf);
- dp = (DIR *)buf;
- cp = buf + dp->rec_len;
- dp = (DIR *)cp;
- if(wd->ino != root->ino){
- int ino = dp->inode;
- parentmip = iget(fd, ino);
- pwd(parentmip,wd->ino);
- }
- if (childIno!=0){
- while (dp->inode != childIno)
- {
- cp += dp->rec_len;
- dp = (DIR *)cp;
- }
- strncpy(name,dp->name,dp->name_len);
- name[dp->name_len] = '\0';
- //strcat(&wdtemp,&name);
- //printf("\n%s\n",wdtemp);
- printf("%s/",name);
- }
- return &wdtemp;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement