parent
9c1f1f7596
commit
1b5118d3de
@ -0,0 +1,38 @@
|
|||||||
|
long sys_getcwd(char* buf, size_t size)
|
||||||
|
{
|
||||||
|
struct buffer_head* bh;
|
||||||
|
struct m_inode* n_inode, * f_inode;
|
||||||
|
struct dir_entry* dir;
|
||||||
|
char* tmp, * b;
|
||||||
|
int k, i;
|
||||||
|
tmp = (char*)malloc(256);
|
||||||
|
b = (char*)malloc(256);
|
||||||
|
n_inode = current->pwd;
|
||||||
|
if (n_inode == current->root)strcpy(tmp, "/");
|
||||||
|
bh = bread(n_inode->i_dev, n_inode->i_zone[0]);
|
||||||
|
while (n_inode != current->root)
|
||||||
|
{
|
||||||
|
dir = (struct dir_entry*)(bh->b_data + sizeof(struct dir_entry));
|
||||||
|
f_inode = iget(n_inode->i_dev, dir->inode);
|
||||||
|
brelse(bh);
|
||||||
|
bh = bread(f_inode->i_dev, f_inode->i_zone[0]);
|
||||||
|
k = 0;
|
||||||
|
while (k < f_inode->i_size)
|
||||||
|
{
|
||||||
|
dir = (struct dir_entry*)(bh->b_data + k);
|
||||||
|
if (dir->inode == n_inode->i_num)break;
|
||||||
|
k += sizeof(struct dir_entry);
|
||||||
|
}
|
||||||
|
strcpy(b, "/");
|
||||||
|
strcat(b, dir->name);
|
||||||
|
strcat(b, tmp);
|
||||||
|
strcpy(tmp, b);
|
||||||
|
n_inode = f_inode;
|
||||||
|
}
|
||||||
|
brelse(bh);
|
||||||
|
if (strlen(tmp) > size)return NULL;
|
||||||
|
for (i = 0; i < 256; i++)
|
||||||
|
put_fs_byte(tmp[i], buf + i);
|
||||||
|
return (long)buf;
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in new issue