예제 #1
0
파일: dir-rm-cwd.c 프로젝트: schuay/progos
void
test_main (void)
{
  int root_fd, a_fd0;
  char name[READDIR_MAX_LEN + 1];

  root_fd = wrap_open ("/");
  CHECK (mkdir ("a"), "mkdir \"a\"");

  a_fd0 = wrap_open ("/a");
  CHECK (!readdir (a_fd0, name), "verify \"/a\" is empty");
  CHECK (inumber (root_fd) != inumber (a_fd0),
         "\"/\" and \"/a\" must have different inumbers");

  CHECK (chdir ("a"), "chdir \"a\"");

  msg ("try to remove \"/a\"");
  if (remove ("/a"))
    {
      msg ("remove successful");

      CHECK (open ("/a") == -1, "open \"/a\" (must fail)");
      CHECK (open (".") == -1, "open \".\" (must fail)");
      CHECK (open ("..") == -1, "open \"..\" (must fail)");
      CHECK (!create ("x", 512), "create \"x\" (must fail)");
    }
  else
    {
      int a_fd1, a_fd2, a_fd3;

      msg ("remove failed");

      CHECK (!remove ("../a"), "try to remove \"../a\" (must fail)");
      CHECK (!remove (".././a"), "try to remove \".././a\" (must fail)");
      CHECK (!remove ("/./a"), "try to remove \"/./a\" (must fail)");

      a_fd1 = wrap_open ("/a");
      a_fd2 = wrap_open (".");
      CHECK (inumber (a_fd1) == inumber (a_fd2),
             "\"/a\" and \".\" must have same inumber");
      CHECK (inumber (root_fd) != inumber (a_fd1),
             "\"/\" and \"/a\" must have different inumbers");

      CHECK (chdir ("/a"), "chdir \"/a\"");
      a_fd3 = wrap_open (".");
      CHECK (inumber (a_fd3) == inumber (a_fd1),
             "\".\" must have same inumber as before");

      CHECK (chdir ("/"), "chdir \"/\"");
      CHECK (!remove ("a"), "try to remove \"a\" (must fail: still open)");
    }
  CHECK (!readdir (a_fd0, name), "verify \"/a\" is empty");
}
예제 #2
0
파일: asfds.c 프로젝트: SKKachaev/OS
int main(int argc, char **argv) 
{
    if (argc < 2) error_and_exit("not enough arguments");
    char* argv_exec[argc];
    argv_exec[0] = argv[1];
    argv_exec[1] = argv[2];

    for (int i = 2; i < argc-1; ++i)
    {
        argv_exec[i] = wrap_malloc(FILDES_LEN);
        memset(argv_exec[i], 0, FILDES_LEN);
        int fildes = wrap_open(argv[i+1], O_RDONLY);
        sprintf(argv_exec[i], "%d", fildes);
    }

    argv_exec[argc-1] = NULL;
    pid_t pid = wrap_fork();
    if (pid != 0)
    {
        int stat;
        wrap_waitpid(pid, &stat, 0);
        if (!(WIFEXITED(stat) && WEXITSTATUS(stat) == 0))
            error_and_exit("exit status of executed program");
    } else
    {
        wrap_execvp(argv_exec[0], argv_exec);
        _exit(EXIT_SUCCESS);
    }

    for (int i = 2; i < argc-1; ++i) free(argv_exec[i]);
    return EXIT_SUCCESS;
}