compiling, but untested dup

This commit is contained in:
kaashoek 2006-08-20 03:33:01 +00:00
parent 16083d4462
commit f18ab5c04e
3 changed files with 24 additions and 12 deletions

1
defs.h
View file

@ -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_write(struct fd *fd, char *addr, int n);
int fd_stat(struct fd *fd, struct stat *); int fd_stat(struct fd *fd, struct stat *);
void fd_incref(struct fd *fd); void fd_incref(struct fd *fd);
int fd_dup(struct fd *fd);
// ide.c // ide.c
void ide_init(void); void ide_init(void);

6
fd.c
View file

@ -149,9 +149,3 @@ fd_incref(struct fd *fd)
fd->ref++; fd->ref++;
release(&fd_table_lock); release(&fd_table_lock);
} }
int
fd_dup(struct fd *fd)
{
return -1;
}

View file

@ -402,17 +402,36 @@ int
sys_dup(void) sys_dup(void)
{ {
struct proc *cp = curproc[cpu()]; struct proc *cp = curproc[cpu()];
uint fd; uint fd, ufd1;
int r; struct fd *fd1;
if(fetcharg(0, &fd) < 0) if(fetcharg(0, &fd) < 0)
return -1; return -1;
if(fd < 0 || fd >= NOFILE) if(fd < 0 || fd >= NOFILE)
return -1; return -1;
if(cp->fds[fd] == 0) if(cp->fds[fd] == 0)
return -1; return -1;
r = fd_dup (cp->fds[fd]); if (cp->fds[fd]->type != FD_PIPE && cp->fds[fd]->type != FD_FILE)
return r; 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 int