diff --git a/sys/fs/vfs/file.c b/sys/fs/vfs/file.c index eb86f6b..4534ab6 100644 --- a/sys/fs/vfs/file.c +++ b/sys/fs/vfs/file.c @@ -236,7 +236,7 @@ ************************************************************************/ //void sysFopen(const char *file,char *flags,userFileDescriptor *userFd) { int sys_fopen( struct thread *td, struct sys_fopen_args *args ) { - kprintf("fopen really?"); + if ( args->FILE == NULL ) { kprintf( "Error: userFd == NULL, File: %s, Line: %i\n", __FILE__, __LINE__ ); return (-1); diff --git a/sys/i386/i386_exec.c b/sys/i386/i386_exec.c index 733d2a2..41c5a90 100644 --- a/sys/i386/i386_exec.c +++ b/sys/i386/i386_exec.c @@ -743,7 +743,9 @@ EXECP = (char *)tmp[i]; } strcpy((char *)tmp[i], (const char *)argv_out[i]); + #ifdef EXEC_DEBUG kprintf("argv[%i]:%s",i, (const char *)argv_out[i]); + #endif sp += strlen((const char *)argv_out[i]) + 1; } diff --git a/sys/include/sys/sysproto_posix.h b/sys/include/sys/sysproto_posix.h index f8a0143..76ac7d0 100644 --- a/sys/include/sys/sysproto_posix.h +++ b/sys/include/sys/sysproto_posix.h @@ -703,6 +703,14 @@ char to_l_[PADL_(char *)]; char * to; char to_r_[PADR_(char *)]; }; +struct sys_pread_args { + char fd_l_[PADL_(int)]; int fd; char fd_r_[PADR_(int)]; + char buf_l_[PADL_(void *)]; void * buf; char buf_r_[PADR_(void *)]; + char nbyte_l_[PADL_(size_t)]; size_t nbyte; char nbyte_r_[PADR_(size_t)]; + char offset_l_[PADL_(off_t)]; off_t offset; char offset_r_[PADR_(off_t)]; +}; + + //Func Defs int sys_invalid(struct thread *, void *); int sys_exit(struct thread *, struct sys_exit_args *); @@ -785,4 +793,6 @@ int sys_gettimeofday(struct thread *td, struct sys_gettimeofday_args *); int sys_sendto(struct thread *td, struct sys_sendto_args *); + +int sys_pread(struct thread *td, struct sys_pread_args *); #endif /* END _SYS_SYSPROTO_POSIX_H */ diff --git a/sys/kernel/syscalls_posix.c b/sys/kernel/syscalls_posix.c index 1f50add..b14338b 100644 --- a/sys/kernel/syscalls_posix.c +++ b/sys/kernel/syscalls_posix.c @@ -506,7 +506,7 @@ { 0, "No Call", sys_invalid, SYSCALL_VALID }, /* 472 - Invalid */ { 0, "No Call", sys_invalid, SYSCALL_VALID }, /* 473 - Invalid */ { 0, "No Call", sys_invalid, SYSCALL_VALID }, /* 474 - Invalid */ - { 0, "No Call", sys_invalid, SYSCALL_VALID }, /* 475 - Invalid */ + { ARG_COUNT(sys_pread_args), "pread", sys_pread, SYSCALL_VALID }, // 475 - pread { 0, "No Call", sys_invalid, SYSCALL_VALID }, /* 476 - Invalid */ { ARG_COUNT(sys_mmap_args), "MMAP", (sys_call_t *) sys_mmap, SYSCALL_VALID }, /* 477 - sys_mmap */ { ARG_COUNT(sys_lseek_args), "lseek", (sys_call_t *) sys_lseek, SYSCALL_VALID }, /* 478 - sys_lseek */ diff --git a/sys/kernel/vfs_calls.c b/sys/kernel/vfs_calls.c index c90e49f..dd465ec 100644 --- a/sys/kernel/vfs_calls.c +++ b/sys/kernel/vfs_calls.c @@ -180,6 +180,61 @@ return (0); } +int sys_pread(struct thread *td, struct sys_pread_args *args) { + int offset = 0; + int x = 0; + char c = 0x0; + char bf[2]; + volatile char *buf = args->buf; + + struct file *fd = 0x0; + + getfd(td, &fd, args->fd); + + if (args->fd > 3) { + offset = fd->fd->offset; + fd->fd->offset = args->offset; + td->td_retval[0] = fread(args->buf, args->nbyte, 1, fd->fd); + fd->fd->offset = offset; + } + else { + bf[1] = '\0'; + if ( _current->term == tty_foreground ) + c = getchar(); + + for (x = 0; x < args->nbyte && c != '\n';) { + if ( _current->term == tty_foreground ) { + + if ( c != 0x0 ) { + buf[x++] = c; + bf[0] = c; + kprintf(bf); + } + + if ( c == '\n') { + buf[x++] = c; + break; + } + + sched_yield(); + c = getchar(); + } + else { + sched_yield(); + } + } + if ( c == '\n') + buf[x++] = '\n'; + + bf[0] = '\n'; + kprintf(bf); + + td->td_retval[0] = x; + } + return (0); +} + + int sys_write(struct thread *td, struct sys_write_args *uap) { char *buffer = 0x0; diff --git a/sys/vmm/paging.c b/sys/vmm/paging.c index a12a629..44eb690 100644 --- a/sys/vmm/paging.c +++ b/sys/vmm/paging.c @@ -634,7 +634,10 @@ "movl %cr3,%eax\n" "movl %eax,%cr3\n" ); - kprintf("Here?"); + + #ifdef VMM_DEBUG + kprintf("Here!?"); + #endif return (0x0); }