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; }