compiling, but untested dup
This commit is contained in:
parent
16083d4462
commit
f18ab5c04e
3 changed files with 24 additions and 12 deletions
1
defs.h
1
defs.h
|
@ -94,7 +94,6 @@ 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);
|
||||
|
|
6
fd.c
6
fd.c
|
@ -149,9 +149,3 @@ fd_incref(struct fd *fd)
|
|||
fd->ref++;
|
||||
release(&fd_table_lock);
|
||||
}
|
||||
|
||||
int
|
||||
fd_dup(struct fd *fd)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
|
29
syscall.c
29
syscall.c
|
@ -402,17 +402,36 @@ int
|
|||
sys_dup(void)
|
||||
{
|
||||
struct proc *cp = curproc[cpu()];
|
||||
uint fd;
|
||||
int r;
|
||||
uint fd, ufd1;
|
||||
struct fd *fd1;
|
||||
|
||||
if(fetcharg(0, &fd) < 0)
|
||||
return -1;
|
||||
if(fd < 0 || fd >= NOFILE)
|
||||
return -1;
|
||||
if(cp->fds[fd] == 0)
|
||||
if(cp->fds[fd] == 0)
|
||||
return -1;
|
||||
r = fd_dup (cp->fds[fd]);
|
||||
return r;
|
||||
if (cp->fds[fd]->type != FD_PIPE && cp->fds[fd]->type != FD_FILE)
|
||||
return -1;
|
||||
|
||||
if ((fd1 = fd_alloc()) == 0) {
|
||||
return -1;
|
||||
}
|
||||
if ((ufd1 = fd_ualloc()) < 0) {
|
||||
fd_close(fd1);
|
||||
return -1;
|
||||
}
|
||||
fd1->type = cp->fds[fd]->type;
|
||||
fd1->readable = cp->fds[fd]->readable;
|
||||
fd1->writeable = cp->fds[fd]->writeable;
|
||||
if (cp->fds[fd]->type == FD_FILE) {
|
||||
fd1->ip = cp->fds[fd]->ip;
|
||||
iincref(fd1->ip);
|
||||
} else if (cp->fds[fd]->type == FD_PIPE) {
|
||||
fd1->pipe = cp->fds[fd]->pipe;
|
||||
}
|
||||
fd1->off = cp->fds[fd]->off;
|
||||
return ufd1;
|
||||
}
|
||||
|
||||
int
|
||||
|
|
Loading…
Reference in a new issue