int sys_write(struct file *f, char *p, int n) { if(argfd(0, 0, &f) < 0 || argint(2, &n) < 0 || argptr(1, &p, n) < 0) return -1; return filewrite(f, p, n); }
int sys_fstat(struct file *f, struct stat *st) { if(argfd(0, 0, &f) < 0 || argptr(1, (void*)&st, sizeof(*st)) < 0) return -1; return filestat(f, st); }
long sys_write(SyscallFrame *f) { int fd; long l; uintptr buf; usize nbytes; File *file; // fd if (argfd(f, 0, &fd) < 0) return -1; // nbytes (needed for argptr) if (arglong(f, 2, &l) < 0) { // todo errstr return -1; } nbytes = (usize)l; // buf if (argptr(f, 1, &buf, nbytes) < 0) { // todo errstr return -1; } file = proc->files[fd]; if (!(file->omode &(OWRITE | ORDWR))) { // todo errstr return -1; } return file->write(file, (char *)buf, nbytes); }
int sys_close(int fd) { struct file *f; if(argfd(0, &fd, &f) < 0) return -1; proc->ofile[fd] = 0; fileclose(f); return 0; }
int sys_dup(struct file *f) { int fd; if(argfd(0, 0, &f) < 0) return -1; if((fd=fdalloc(f)) < 0) return -1; filedup(f); return fd; }
int sys_lseek(int fd, int offset, int base) { struct file *f; if(argfd(0, &fd, &f) < 0 || argint(1, &offset) < 0 || argint(2, &base) < 0) return -1; if(base == SEEK_SET) { f->off = offset; } if (base == SEEK_CUR) f->off += offset; return 0; }
long sys_close(SyscallFrame *f) { int fd; File *file; if (argfd(f, 0, &fd)) { // todo errstr return -1; } file = proc->files[fd]; releasefile(file); proc->files[fd] = nil; return 0; }