コード例 #1
0
ファイル: sys_fs.c プロジェクト: romalik/rl_cpu
int sys_mkfifo(void * scallStructPtr) {
  unsigned int iobuf[1024];
  struct mkfifoSyscall s;

  ugets(cProc, (size_t)scallStructPtr, 0, 14, sizeof(struct mkfifoSyscall), 0, (unsigned int *)&s);
  ugets(cProc, (size_t)s.path, 0, 14, 1024, 1, iobuf);

  s.res = k_mkfifo(iobuf);

  uputs(cProc, (size_t)scallStructPtr, 0, 14, sizeof(struct mkfifoSyscall), 0, (unsigned int *)&s);
  return 0;
}
コード例 #2
0
ファイル: sys_fs.c プロジェクト: romalik/rl_cpu
int sys_umount(void * scallStructPtr) {
  unsigned int mount_point_path[512];
  struct umountSyscall s;

  ugets(cProc, (size_t)scallStructPtr, 0, 14, sizeof(struct umountSyscall), 0, (unsigned int *)&s);
  ugets(cProc, (size_t)s.mount_point_path, 0, 14, 512, 1, mount_point_path);

  s.res = k_umount((const char *)mount_point_path);

  uputs(cProc, (size_t)scallStructPtr, 0, 14, sizeof(struct umountSyscall), 0, (unsigned int *)&s);
  return 0;

}
コード例 #3
0
ファイル: sys_fs.c プロジェクト: romalik/rl_cpu
int sys_stat(void * scallStructPtr) {
  unsigned int fn_buf[1024];
  struct stat st;
  struct statSyscall s;
  ugets(cProc, (size_t)scallStructPtr, 0, 14, sizeof(struct statSyscall), 0, (unsigned int *)&s);
  ugets(cProc, (size_t)s.filename, 0, 14, 1024, 1, fn_buf);

  k_stat(fn_buf, &st);

  uputs(cProc, (size_t)s.buf, 0, 14, sizeof(struct stat), 0, (unsigned int *)&st);
  uputs(cProc, (size_t)scallStructPtr, 0, 14, sizeof(struct statSyscall), 0, (unsigned int *)&s);

  return 0;
}
コード例 #4
0
ファイル: sys_fs.c プロジェクト: romalik/rl_cpu
int sys_dup2(void * scallStructPtr) {
  int fd;
  struct dup2Syscall s;
  ugets(cProc, (size_t)scallStructPtr, 0, 14, sizeof(struct dup2Syscall), 0, (unsigned int *)&s);

  if(!cProc->openFiles[s.oldfd] || s.newfd<0 || s.newfd>MAX_FILES_PER_PROC ) {
    s.retval = -1;
    goto sys_dup2_out;
  }

  if(s.oldfd == s.newfd) {
    s.retval = s.newfd;
    goto sys_dup2_out;
  }

  if(cProc->openFiles[s.newfd]) {
    k_close(cProc->openFiles[s.newfd]);
  }

  cProc->openFiles[s.oldfd] = cProc->openFiles[s.oldfd];
  cProc->openFiles[s.oldfd]->refcnt++;
  s.retval = fd;

  sys_dup2_out:
  uputs(cProc, (size_t)scallStructPtr, 0, 14, sizeof(struct dup2Syscall), 0, (unsigned int *)&s);
  return 0;
}
コード例 #5
0
ファイル: sys_fs.c プロジェクト: romalik/rl_cpu
int sys_dup(void * scallStructPtr) {
  int fd;
  struct dupSyscall s;

  ugets(cProc, (size_t)scallStructPtr, 0, 14, sizeof(struct dupSyscall), 0, (unsigned int *)&s);

  if(!cProc->openFiles[s.oldfd]) {
    s.retval = -1;
    goto sys_dup_out;
  }

  for (fd = 0; fd < MAX_FILES_PER_PROC; fd++) {
    if (!cProc->openFiles[fd]) {
      break;
    }
  }
  if (fd != MAX_FILES_PER_PROC) {
    cProc->openFiles[fd] = cProc->openFiles[s.oldfd];
    cProc->openFiles[fd]->refcnt++;
    s.retval = fd;
    goto sys_dup_out;
  }

  s.retval = -1;

  sys_dup_out:
  uputs(cProc, (size_t)scallStructPtr, 0, 14, sizeof(struct dupSyscall), 0, (unsigned int *)&s);

  return 0;
}
コード例 #6
0
ファイル: sys_fs.c プロジェクト: romalik/rl_cpu
int sys_read(void * scallStructPtr) {
  unsigned int iobuf[1024];
  struct readSyscall s;
  ugets(cProc, (size_t)scallStructPtr, 0, 14, sizeof(struct readSyscall), 0, (unsigned int *)&s);
  try_k_read(cProc->openFiles[s.fd], s.buf, s.size, cProc->pid, (size_t)scallStructPtr);
  return 0;
}
コード例 #7
0
ファイル: sys_fs.c プロジェクト: romalik/rl_cpu
int sys_pipe(void * scallStructPtr) {
  struct pipeSyscall s;
  int fd;
  char newPath[100];
  newPath[0] = 0;

  ugets(cProc, (size_t)scallStructPtr, 0, 14, sizeof(struct pipeSyscall), 0, (unsigned int *)&s);


  k_mkfifo(newPath);

  for (fd = 0; fd < MAX_FILES_PER_PROC; fd++) {
    if (!cProc->openFiles[fd]) {
      break;
    }
  }
  if (fd != MAX_FILES_PER_PROC) {
    cProc->openFiles[fd] = k_open(newPath, O_WRONLY);
    s.pipefd[1] = fd;
  }
  for (; fd < MAX_FILES_PER_PROC; fd++) {
    if (!cProc->openFiles[fd]) {
      break;
    }
  }
  if (fd != MAX_FILES_PER_PROC) {
    cProc->openFiles[fd] = k_open(newPath, O_RDONLY);
    s.pipefd[0] = fd;
  }

  uputs(cProc, (size_t)scallStructPtr, 0, 14, sizeof(struct pipeSyscall), 0, (unsigned int *)&s);

  return 0;
}
コード例 #8
0
ファイル: sys_fs.c プロジェクト: romalik/rl_cpu
int sys_fstat(void * scallStructPtr) {
  struct fstatSyscall s;
  struct stat st;
  ugets(cProc, (size_t)scallStructPtr, 0, 14, sizeof(struct fstatSyscall), 0, (unsigned int *)&s);
  fs_stat(&(cProc->openFiles[s.fd]->node), &st);
  uputs(cProc, (size_t)s.buf, 0, 14, sizeof(struct stat), 0, (unsigned int *)&st);
  uputs(cProc, (size_t)scallStructPtr, 0, 14, sizeof(struct fstatSyscall), 0, (unsigned int *)&s);
  return 0;
}
コード例 #9
0
ファイル: sys_fs.c プロジェクト: romalik/rl_cpu
int sys_mknod(void * scallStructPtr) {
  unsigned int iobuf[1024];
  struct mknodSyscall s;
  char type;

  if(s.mode & S_IFCHR) {
    type = 'c';
  } else if(s.mode & S_IFBLK) {
    type = 'b';
  }

  ugets(cProc, (size_t)scallStructPtr, 0, 14, sizeof(struct mknodSyscall), 0, (unsigned int *)&s);
  ugets(cProc, (size_t)s.path, 0, 14, 1024, 1, iobuf);

  s.res = k_mknod(iobuf,type,s.major,s.minor);

  uputs(cProc, (size_t)scallStructPtr, 0, 14, sizeof(struct mknodSyscall), 0, (unsigned int *)&s);
  return 0;
}
コード例 #10
0
ファイル: sys_fs.c プロジェクト: romalik/rl_cpu
int sys_ioctl(void * scallStructPtr) {
  unsigned int fn_buf[1024];
  struct stat st;
  struct ioctlSyscall s;
  int retval;
  size_t sz;
  ugets(cProc, (size_t)scallStructPtr, 0, 14, sizeof(struct ioctlSyscall), 0, (unsigned int *)&s);
  ugets(cProc, (size_t)s.p, 0, 14, 1024, 0, fn_buf);

  retval = k_ioctl(cProc->openFiles[s.fd], s.req, fn_buf, &sz);

  s.retval = retval;
  if(sz) {
	uputs(cProc, (size_t)s.p, 0, 14, sz, 0, (unsigned int *)&st);
  }
  uputs(cProc, (size_t)scallStructPtr, 0, 14, sizeof(struct ioctlSyscall), 0, (unsigned int *)&s);

  return 0;
}
コード例 #11
0
ファイル: sys_fs.c プロジェクト: romalik/rl_cpu
int sys_unlink(void * scallStructPtr) {
  unsigned int iobuf[1024];
  struct unlinkSyscall s;
  struct stat st;

  ugets(cProc, (size_t)scallStructPtr, 0, 14, sizeof(struct unlinkSyscall), 0, (unsigned int *)&s);
  ugets(cProc, (size_t)s.path, 0, 14, 1024, 1, iobuf);

  k_stat(iobuf, &st);
  if (S_ISDIR(st.st_mode)) {
    s.res = -1;
  } else {
    s.res = k_unlink((const char *)iobuf);
  }

  uputs(cProc, (size_t)scallStructPtr, 0, 14, sizeof(struct unlinkSyscall), 0, (unsigned int *)&s);

  return 0;
}
コード例 #12
0
ファイル: sys_fs.c プロジェクト: romalik/rl_cpu
int sys_open(void * scallStructPtr) {
  int fd;
  unsigned int fn_buf[1024];
  struct openSyscall s;
  ugets(cProc, (size_t)scallStructPtr, 0, 14, sizeof(struct openSyscall), 0, (unsigned int *)&s);
  ugets(cProc, (size_t)s.filename, 0, 14, 1024, 1, fn_buf);


  for (fd = 0; fd < MAX_FILES_PER_PROC; fd++) {
    if (!cProc->openFiles[fd]) {
      break;
    }
  }
  if (fd != MAX_FILES_PER_PROC) {
    cProc->openFiles[fd] = k_open(fn_buf, s.mode);
    s.mode = fd;
  } else {
    s.mode = -1;
  }
  uputs(cProc, (size_t)scallStructPtr, 0, 14, sizeof(struct openSyscall), 0, (unsigned int *)&s);

  return 0;
}
コード例 #13
0
ファイル: sys_fs.c プロジェクト: romalik/rl_cpu
int sys_close(void * scallStructPtr) {
  int fd;
  struct closeSyscall s;
  ugets(cProc, (size_t)scallStructPtr, 0, 14, sizeof(struct closeSyscall), 0, (unsigned int *)&s);

  if ((s.fd >= 0) && (s.fd < MAX_FILES_PER_PROC)) {
    if (cProc->openFiles[s.fd]) {
      k_close(cProc->openFiles[s.fd]);
      cProc->openFiles[s.fd] = 0;
      s.fd = 0;
      goto sys_close_out;
    }
  }
  s.fd = -1;
  sys_close_out:
  uputs(cProc, (size_t)scallStructPtr, 0, 14, sizeof(struct closeSyscall), 0, (unsigned int *)&s);

  return 0;
}
コード例 #14
0
ファイル: filesys.c プロジェクト: ljalves/FUZIX
void filename(char *userspace_upath, char *name)
{
    char *buf;
    char *ptr;

    buf = tmpbuf();
    if(ugets(userspace_upath, buf, 512)) {
        brelse(buf);
        *name = '\0';
        return;          /* An access violation reading the name */
    }
    ptr = buf;
    while(*ptr)
        ++ptr;
    /* Special case for "...name.../" */
    while(*ptr != '/' && ptr-- > buf);
    ptr++;
    memcpy(name, ptr, FILENAME_LEN);
    brelse(buf);
}
コード例 #15
0
ファイル: filesys.c プロジェクト: ljalves/FUZIX
inoptr n_open(char *uname, inoptr *parent)
{
    inoptr r;
    char *tb;

    tb = (char*)tmpbuf(); /* temporary memory to hold kernel's copy of the filename */

    if (ugets(uname, tb, 512) == -1) {
        *parent = NULLINODE;
        return NULLINODE;
    }

#ifdef DEBUG
    kprintf("n_open(\"%s\")\n", tb);
#endif

    r = kn_open(tb, parent);

    brelse(tb);

    return r;
}
コード例 #16
0
ファイル: sys_fs.c プロジェクト: romalik/rl_cpu
int sys_write(void * scallStructPtr) {
  struct readSyscall s;
  ugets(cProc, (size_t)scallStructPtr, 0, 14, sizeof(struct writeSyscall), 0, (unsigned int *)&s);
  try_k_write(cProc->openFiles[s.fd], s.buf, s.size, cProc->pid, (size_t)scallStructPtr);
  return 0;
}