diff --git a/defs.h b/defs.h index 292842834d897b8eca225da6c8703929f43ff8c0..18ff4f150cb83e3476e5ddca8f9667ef47aaf4d5 100644 --- a/defs.h +++ b/defs.h @@ -94,6 +94,7 @@ int fd_read(struct fd *fd, char *addr, int n); int fd_write(struct fd *fd, char *addr, int n); int fd_stat(struct fd *fd, struct stat *); void fd_incref(struct fd *fd); +int fd_dup(struct fd *fd); // ide.c void ide_init(void); diff --git a/fd.c b/fd.c index e61cab2f216a8ab8b9ba62e4cb417e63a210c9db..7de4d551447d4ba5c850c49d499c17625bf75bae 100644 --- a/fd.c +++ b/fd.c @@ -149,3 +149,9 @@ fd_incref(struct fd *fd) fd->ref++; release(&fd_table_lock); } + +int +fd_dup(struct fd *fd) +{ + return -1; +} diff --git a/syscall.c b/syscall.c index 31b61892e543b110c2feca46bdf3a8b69909b2c2..5b857bd7eca5cb3b689d52e79fd31d35d03433e3 100644 --- a/syscall.c +++ b/syscall.c @@ -398,6 +398,23 @@ sys_fstat(void) return r; } +int +sys_dup(void) +{ + struct proc *cp = curproc[cpu()]; + uint fd; + int r; + + if(fetcharg(0, &fd) < 0) + return -1; + if(fd < 0 || fd >= NOFILE) + return -1; + if(cp->fds[fd] == 0) + return -1; + r = fd_dup (cp->fds[fd]); + return r; +} + int sys_link(void) { @@ -543,44 +560,6 @@ sys_exec(void) return 0; } -int -sys_block(void) -{ - int i, j; - struct buf *b; - struct inode *ip; - - for (i = 0; i < 2; i++) { - cprintf ("issue read\n"); - b = bread(1, i); - - cprintf("disk 1 sector %d: ", i); - for (j = 0; j < 4; j++) - cprintf("%x ", b->data[j] & 0xff); - cprintf("\n"); - - brelse(b); - } - - ip = iget(1, 1); - cprintf("iget 1: %d %d %d %d %d %d %d %d\n", - ip->dev, ip->inum, ip->count, ip->busy, - ip->type, ip->nlink, ip->size, ip->addrs[0]); - iput(ip); - - ip = namei(".././//./../usertests", NAMEI_LOOKUP, 0); - if(ip){ - cprintf("namei(usertests): %d %d %d %d %d %d %d %d\n", - ip->dev, ip->inum, ip->count, ip->busy, - ip->type, ip->nlink, ip->size, ip->addrs[0]); - iput(ip); - } else { - cprintf("namei(usertests) failed\n"); - } - - return 0; -} - void syscall(void) { @@ -610,9 +589,6 @@ syscall(void) case SYS_close: ret = sys_close(); break; - case SYS_block: - ret = sys_block(); - break; case SYS_kill: ret = sys_kill(); break; @@ -640,6 +616,9 @@ syscall(void) case SYS_chdir: ret = sys_chdir(); break; + case SYS_dup: + ret = sys_dup(); + break; default: cprintf("unknown sys call %d\n", num); // XXX fault diff --git a/syscall.h b/syscall.h index 2209cf24090949748e9fae4bf490a35e03d1f0ce..c89d5a34d5a015a82c5442442272e87d708844ca 100644 --- a/syscall.h +++ b/syscall.h @@ -1,18 +1,18 @@ #define SYS_fork 1 #define SYS_exit 2 #define SYS_wait 3 -#define SYS_pipe 5 -#define SYS_write 6 -#define SYS_read 7 -#define SYS_close 8 -#define SYS_block 9 -#define SYS_kill 10 -#define SYS_exec 13 -#define SYS_open 14 -#define SYS_mknod 15 -#define SYS_unlink 16 -#define SYS_fstat 17 -#define SYS_link 18 -#define SYS_mkdir 19 -#define SYS_chdir 20 +#define SYS_pipe 4 +#define SYS_write 5 +#define SYS_read 6 +#define SYS_close 7 +#define SYS_kill 9 +#define SYS_exec 10 +#define SYS_open 11 +#define SYS_mknod 12 +#define SYS_unlink 13 +#define SYS_fstat 14 +#define SYS_link 15 +#define SYS_mkdir 16 +#define SYS_chdir 17 +#define SYS_dup 18 diff --git a/user.h b/user.h index 27f2cfb56b8f58d6d784ed830640da527a0118e5..26d984c95268f291197b446c5076757701c57b93 100644 --- a/user.h +++ b/user.h @@ -6,7 +6,6 @@ int pipe(int*); int write(int, void*, int); int read(int, void*, int); int close(int); -int block(void); int kill(int); int panic(char*); int cons_puts(char*); @@ -18,6 +17,7 @@ int fstat (int fd, struct stat *stat); int link(char *, char *); int mkdir(char *); int chdir(char *); +int dup(int); int stat(char *, struct stat *stat); int puts(char*); diff --git a/userfs.c b/userfs.c index 5d0c8593c3cf4623c92b651ff2bdbca611de4c3c..25dfaf55950dbcc991f6a66990d4cb94934db385 100644 --- a/userfs.c +++ b/userfs.c @@ -20,8 +20,6 @@ main(void) printf(stdout, "userfs is running\n"); - block(); - fd = open("echo", 0); if(fd >= 0){ printf(stdout, "open echo ok\n"); diff --git a/usys.S b/usys.S index 16d84e74a3a2b63111cb6ac8093e84ca7a9e8e23..c7a162ce6116dcccd63ce7136674aeb8256fe09f 100644 --- a/usys.S +++ b/usys.S @@ -15,7 +15,6 @@ STUB(pipe) STUB(read) STUB(write) STUB(close) -STUB(block) STUB(kill) STUB(exec) STUB(open) @@ -25,3 +24,4 @@ STUB(fstat) STUB(link) STUB(mkdir) STUB(chdir) +STUB(dup)