diff --git a/sys/arch/i386/fork.c b/sys/arch/i386/fork.c index 0f9ee91..5396d26 100644 --- a/sys/arch/i386/fork.c +++ b/sys/arch/i386/fork.c @@ -35,6 +35,7 @@ #include #include #include +#include int sys_fork(struct thread *td, struct sys_fork_args *args) { struct taskStruct *newProcess; @@ -58,8 +59,25 @@ /* Copy File Descriptor Table */ //memcpy(newProcess->files, _current->files, sizeof(fileDescriptor_t *) * MAX_OFILES); - for (int i = 3; i < 256; i++) - newProcess->td.o_files[i] = td->o_files[i]; + for (int i = 3; i < 64; i++) + if (td->o_files[i]) { + newProcess->td.o_files[i] = (struct file *)kmalloc(sizeof(struct file)); +kprintf("A1.%i", i); + memcpy(newProcess->td.o_files[i], td->o_files[i], sizeof(struct file)); +kprintf("A2"); + if (((struct file *)td->o_files[i])->fd) { + ((struct file *)newProcess->td.o_files[i])->fd = kmalloc(sizeof(fileDescriptor_t)); +kprintf("B1"); + memcpy( ((struct file *)newProcess->td.o_files[i])->fd, ((struct file *)td->o_files[i])->fd, sizeof(fileDescriptor_t)); +kprintf("B2"); + if (((struct file *)td->o_files[i])->fd->buffer) { + ((struct file *)newProcess->td.o_files[i])->fd->buffer = kmalloc(4096); +kprintf("C1"); + memcpy(((struct file *)newProcess->td.o_files[i])->fd->buffer, ((struct file *)td->o_files[i])->fd->buffer, 4096); +kprintf("C2"); + } + } + } /* Set Up Task State */ newProcess->tss.eip = td->frame->tf_eip; diff --git a/sys/kernel/vfs_calls.c b/sys/kernel/vfs_calls.c index f7d2f35..470fadd 100644 --- a/sys/kernel/vfs_calls.c +++ b/sys/kernel/vfs_calls.c @@ -42,8 +42,10 @@ error = falloc(td, &nfp, &fd); - if (error) + if (error) { + td->td_retval[0] = -1; return (error); + } nfp->fd = fopen(args->path, "rb"); @@ -128,6 +130,7 @@ #endif if (fd == 0x0) { + kprintf("COULDN'T FIND FD: %i", args->fd); td->td_retval[0] = -1; } else { @@ -150,11 +153,14 @@ default: if (args->fd < 3) td->td_retval[0] = 0; - else if (!fclose(fd->fd)) - td->td_retval[0] = -1; else { - fdestroy(td, fd, args->fd); - td->td_retval[0] = 0; + if (!fclose(fd->fd)) + td->td_retval[0] = -1; + else { + kprintf("DESTROY: %i!!!!!!!!!!!!!!!!!!!!!!!!!!!!", args->fd); + fdestroy(td, fd, args->fd); + td->td_retval[0] = 0; + } } } } @@ -209,7 +215,7 @@ } break; default: - kprintf("[r:0x%X:%i:%i:%s]",fd->fd, args->fd, fd->fd_type, fd->fd->fileName); + //kprintf("[r:0x%X:%i:%i:%s]",fd->fd, args->fd, fd->fd_type, fd->fd->fileName); td->td_retval[0] = fread(args->buf, args->nbyte, 1, fd->fd); } }