Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
X
xv6-public
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
统计图
问题
0
问题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
银宸时代
OS Lab Group
奖励实验
xv6-public
提交
2c73068e
提交
2c73068e
8月 30, 2018
创建
作者:
Frans Kaashoek
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Delete a patch
Adjust typesetting of code
上级
e559fd2c
隐藏空白字符变更
内嵌
并排
正在显示
3 个修改的文件
包含
4 行增加
和
154 行删除
+4
-154
mmu.h
mmu.h
+0
-2
runoff
runoff
+4
-1
symlink.patch
symlink.patch
+0
-151
没有找到文件。
mmu.h
浏览文件 @
2c73068e
...
@@ -144,7 +144,6 @@ struct taskstate {
...
@@ -144,7 +144,6 @@ struct taskstate {
ushort
iomb
;
// I/O map base address
ushort
iomb
;
// I/O map base address
};
};
// PAGEBREAK: 12
// Gate descriptors for interrupts and traps
// Gate descriptors for interrupts and traps
struct
gatedesc
{
struct
gatedesc
{
uint
off_15_0
:
16
;
// low 16 bits of offset in segment
uint
off_15_0
:
16
;
// low 16 bits of offset in segment
...
@@ -180,4 +179,3 @@ struct gatedesc {
...
@@ -180,4 +179,3 @@ struct gatedesc {
}
}
#endif
#endif
runoff
浏览文件 @
2c73068e
...
@@ -14,6 +14,7 @@ pad()
...
@@ -14,6 +14,7 @@ pad()
mkdir
-p
fmt
mkdir
-p
fmt
rm
-f
fmt
/
*
rm
-f
fmt
/
*
cp
README
fmt
cp
README
fmt
echo
>
fmt
/blank
files
=
`
grep
-v
'^#'
runoff.list |
awk
'{print $1}'
`
files
=
`
grep
-v
'^#'
runoff.list |
awk
'{print $1}'
`
n
=
99
n
=
99
for
i
in
$files
for
i
in
$files
...
@@ -214,7 +215,9 @@ awk '
...
@@ -214,7 +215,9 @@ awk '
# pr -t -2 t.defs | ../pr.pl -h "definitions" | pad
# pr -t -2 t.defs | ../pr.pl -h "definitions" | pad
pr
-t
-l50
-2
refs | ../pr.pl
-h
"cross-references"
| pad
pr
-t
-l50
-2
refs | ../pr.pl
-h
"cross-references"
| pad
# pr.pl -h "definitions" -2 t.defs | pad
# pr.pl -h "definitions" -2 t.defs | pad
# pr.pl -h "cross-references" -2 refs | pad
# pr.pl -h "cross-references" -2 refs | pad
../pr.pl blank
# make sheet 1 start on left page
../pr.pl blank
for
i
in
$files
for
i
in
$files
do
do
../pr.pl
-h
"xv6/
$i
"
$i
../pr.pl
-h
"xv6/
$i
"
$i
...
...
symlink.patch
deleted
100644 → 0
浏览文件 @
e559fd2c
diff -r f8a4e40ab1d6 fs.c
--- a/fs.c Thu Aug 30 14:32:06 2007 -0400
+++ b/fs.c Thu Aug 30 14:29:02 2007 -0400
@@ -577,12 +577,18 @@ skipelem(char *path, char *name)
// If parent != 0, return the inode for the parent and copy the final
// path element into name, which must have room for DIRSIZ bytes.
static struct inode*
-_namei(char *path, int parent, char *name)
+_namei(struct inode *root, char *path, int parent, char *name, int depth)
{
struct inode *ip, *next;
+ char buf[100], tname[DIRSIZ];
+
+ if(depth > 5)
+ return 0;
if(*path == '/')
ip = iget(ROOTDEV, 1);
+ else if(root)
+ ip = idup(root);
else
ip = idup(cp->cwd);
@@ -598,10 +604,24 @@ _namei(char *path, int parent, char *nam
return ip;
}
if((next = dirlookup(ip, name, 0)) == 0){
+ cprintf("did not find %s\n", name);
iunlockput(ip);
return 0;
}
- iunlockput(ip);
+ iunlock(ip);
+ ilock(next);
+ if(next->type == T_SYMLINK){
+ if(next->size >= sizeof(buf) || readi(next, buf, 0, next->size) != next->size){
+ iunlockput(next);
+ iput(ip);
+ return 0;
+ }
+ buf[next->size] = 0;
+ iunlockput(next);
+ next = _namei(ip, buf, 0, tname, depth+1);
+ }else
+ iunlock(next);
+ iput(ip);
ip = next;
}
if(parent){
@@ -615,11 +635,11 @@ namei(char *path)
namei(char *path)
{
char name[DIRSIZ];
- return _namei(path, 0, name);
+ return _namei(0, path, 0, name, 0);
}
struct inode*
nameiparent(char *path, char *name)
{
- return _namei(path, 1, name);
-}
+ return _namei(0, path, 1, name, 0);
+}
diff -r f8a4e40ab1d6 fs.h
--- a/fs.h Thu Aug 30 14:32:06 2007 -0400
+++ b/fs.h Thu Aug 30 13:05:43 2007 -0400
@@ -33,6 +33,7 @@ struct dinode {
#define T_DIR 1 // Directory
#define T_FILE 2 // File
#define T_DEV 3 // Special device
+#define T_SYMLINK 4 // Symlink
// Inodes per block.
#define IPB (BSIZE / sizeof(struct dinode))
diff -r f8a4e40ab1d6 syscall.c
--- a/syscall.c Thu Aug 30 14:32:06 2007 -0400
+++ b/syscall.c Thu Aug 30 13:05:29 2007 -0400
@@ -96,6 +96,7 @@ extern int sys_unlink(void);
extern int sys_unlink(void);
extern int sys_wait(void);
extern int sys_write(void);
+extern int sys_symlink(void);
static int (*syscalls[])(void) = {
[SYS_chdir] sys_chdir,
@@ -118,6 +119,7 @@ static int (*syscalls[])(void) = {
[SYS_unlink] sys_unlink,
[SYS_wait] sys_wait,
[SYS_write] sys_write,
+[SYS_symlink] sys_symlink,
};
void
diff -r f8a4e40ab1d6 syscall.h
--- a/syscall.h Thu Aug 30 14:32:06 2007 -0400
+++ b/syscall.h Thu Aug 30 13:02:48 2007 -0400
@@ -19,3 +19,4 @@
#define SYS_getpid 18
#define SYS_sbrk 19
#define SYS_sleep 20
+#define SYS_symlink 21
diff -r f8a4e40ab1d6 sysfile.c
--- a/sysfile.c Thu Aug 30 14:32:06 2007 -0400
+++ b/sysfile.c Thu Aug 30 13:10:31 2007 -0400
@@ -257,6 +257,21 @@ create(char *path, int canexist, short t
}
int
+sys_symlink(void)
+{
+ char *old, *new;
+ struct inode *ip;
+
+ if(argstr(0, &old) < 0 || argstr(1, &new) < 0)
+ return -1;
+ if((ip = create(new, 0, T_SYMLINK, 0, 0)) == 0)
+ return -1;
+ writei(ip, old, 0, strlen(old));
+ iunlockput(ip);
+ return 0;
+}
+
+int
sys_open(void)
{
char *path;
@@ -393,3 +408,4 @@ sys_pipe(void)
fd[1] = fd1;
return 0;
}
+
diff -r f8a4e40ab1d6 user.h
--- a/user.h Thu Aug 30 14:32:06 2007 -0400
+++ b/user.h Thu Aug 30 13:02:34 2007 -0400
@@ -21,6 +21,7 @@ int getpid();
int getpid();
char* sbrk(int);
int sleep(int);
+int symlink(int);
// ulib.c
int stat(char*, struct stat*);
diff -r f8a4e40ab1d6 usys.S
--- a/usys.S Thu Aug 30 14:32:06 2007 -0400
+++ b/usys.S Thu Aug 30 13:05:54 2007 -0400
@@ -28,3 +28,4 @@ STUB(getpid)
STUB(getpid)
STUB(sbrk)
STUB(sleep)
+STUB(symlink)
编写
预览
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论