You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
97 lines
2.1 KiB
97 lines
2.1 KiB
3 years ago
|
#include <errno.h>
|
||
|
#include <string.h>
|
||
|
#include <sys/stat.h>
|
||
|
#include <a.out.h>
|
||
|
|
||
|
#include <linux/fs.h>
|
||
|
#include <linux/sched.h>
|
||
|
#include <linux/kernel.h>
|
||
|
#include <linux/mm.h>
|
||
|
#include <asm/segment.h>
|
||
|
|
||
|
struct linux_dirent {
|
||
|
long d_ino;
|
||
|
off_t d_off;
|
||
|
unsigned short d_reclen;
|
||
|
char d_name[14];
|
||
|
};
|
||
|
|
||
|
int sys_getdents(unsigned int fd, struct linux_dirent *d, unsigned int count)
|
||
|
{
|
||
|
struct file *f;
|
||
|
struct m_inode * m;
|
||
|
struct buffer_head * b;
|
||
|
struct dir_entry * dir;
|
||
|
int i,j,k,res;
|
||
|
struct linux_dirent usrd;
|
||
|
i=0;
|
||
|
res=0;
|
||
|
f=current->filp[fd];
|
||
|
m=f->f_inode;
|
||
|
b=bread(m->i_dev,m->i_zone[0]);
|
||
|
dir=(struct dir_entry*)b->b_data;
|
||
|
while(dir[i].inode>0)
|
||
|
{
|
||
|
if(res+sizeof(struct linux_dirent)>count)
|
||
|
break;
|
||
|
usrd.d_ino=dir[i].inode;
|
||
|
usrd.d_off=0;
|
||
|
usrd.d_reclen=sizeof(struct linux_dirent);
|
||
|
for(j=0;j<14;j++)
|
||
|
usrd.d_name[j]=dir[i].name[j];
|
||
|
for(k=0;k<sizeof(struct linux_dirent);k++)
|
||
|
{
|
||
|
put_fs_byte(((char*)(&usrd))[k],(char*)d+res);
|
||
|
res++;
|
||
|
}
|
||
|
i++;
|
||
|
}
|
||
|
return res;
|
||
|
}
|
||
|
|
||
|
char *sys_getcwd(char* buf,size_t size)
|
||
|
{
|
||
|
char *path[14];
|
||
|
int i,j,k,l,dev,inum;
|
||
|
struct m_inode *inode;
|
||
|
struct buffer_head *b;
|
||
|
struct dir_entry *d;
|
||
|
dev=current->root->i_dev;
|
||
|
inode=current->pwd;
|
||
|
inum=inode->i_num;
|
||
|
b=bread(dev,inode->i_zone[0]);
|
||
|
d=(struct dir_entry*) b->b_data;
|
||
|
i=0;
|
||
|
l=0;
|
||
|
while(inum!=1)
|
||
|
{
|
||
|
inode=iget(dev, d[1].inode);
|
||
|
b=bread(dev,inode->i_zone[0]);
|
||
|
d=(struct dir_entry*) b->b_data;
|
||
|
j=0;
|
||
|
while(d[j].inode!=inum) j++;
|
||
|
inum=inode->i_num;
|
||
|
path[i]=d[j].name;
|
||
|
i++;
|
||
|
}
|
||
|
while(i>0)
|
||
|
{
|
||
|
i--;
|
||
|
put_fs_byte('/',buf+l);
|
||
|
l++;
|
||
|
k=0;
|
||
|
while(path[i][k]!='\0')
|
||
|
{
|
||
|
put_fs_byte(path[i][k],buf+l);
|
||
|
l++;
|
||
|
if(l>=size) break;
|
||
|
k++;
|
||
|
}
|
||
|
if(l>=size) break;
|
||
|
}
|
||
|
return buf;
|
||
|
}
|
||
|
|
||
|
|
||
|
|