Example #1
0
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);
}
Example #2
0
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);
}
Example #3
0
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);
}
Example #4
0
int
sys_close(int fd)
{
  struct file *f;

  if(argfd(0, &fd, &f) < 0)
    return -1;
  proc->ofile[fd] = 0;
  fileclose(f);
  return 0;
}
Example #5
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;
}
Example #6
0
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;
}
Example #7
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;
}