Exemple #1
0
void runProcess( Proc *proc, pid_t pgid, int fg, int inputFile, int outputFile, int errorFile)
{
    // wrzucenie procesu do grupy procesow i danie przekazanie grupy terminalowu jezeli jest to stosowne
    // utowrzenie grupy lub dolaczenie do juz istniejacej
    pid_t pid = getpid();

    if( pgid == 0 )
        pgid = pid;

    setpgid(pid, pgid);

    // jesli w foreground to oddajemy terminal dla grupy procesow
    if(fg == 1)
    {
        tcsetpgrp( shellTerminal, pgid );
    }

    struct sigaction act;
    act.sa_handler = SIG_DFL;  /* set up signal handler */
    act.sa_flags = 0;

    // kiedy shell przejmuje kontrole, powinien ignorowac ponizsze sygnaly, zeby samemu sie przypadkowo nie killnac
    sigaction(SIGINT, &act, NULL);
    // powrot do ustawien domyslnych (przez nasz shell te sygnaly byly ignorowane)
    sigaction(SIGINT, &act, NULL);
    sigaction(SIGQUIT, &act, NULL);
    sigaction(SIGCHLD, &act, NULL);
    sigaction(SIGTSTP, &act, NULL);
    sigaction(SIGTTIN, &act, NULL);
    sigaction(SIGTTOU, &act, NULL);

    // ustawienie standardowego I/O dla nowego procesu
    // jesli wyjscia sa inne niz standardowe to zamieniamy je - przekierowanie wyjscia
    if(inputFile != STDIN_FILENO)
    {
        dup2(inputFile, STDIN_FILENO);
        close(inputFile);
    }

    if(outputFile != STDOUT_FILENO)
    {
        dup2(outputFile, STDOUT_FILENO);
        close(outputFile);
    }

    if(errorFile != STDERR_FILENO)
    {
        dup2(errorFile, STDERR_FILENO);
        close(errorFile);
    }   if(strcmp(proc->argv[0], "pwd") == 0)
    {
        do_pwd();
    }
    else if(strcmp(proc->argv[0], "cd") == 0)
    {
        do_cd(proc->argv[1]);
    }
    else if(strcmp(proc->argv[0], "ls") == 0)
    {
        do_ls(proc->argv[1]);
    }
    else if(strcmp(proc->argv[0], "mkdir") == 0)
    {
        do_mkdir(proc->argv[1]);
    }
    else if(strcmp(proc->argv[0], "rmdir") == 0)
    {
        do_rmdir(proc->argv[1]);
    }
    else if(strcmp(proc->argv[0], "touch") == 0)
    {
        do_touch(proc->argv[1]);
    }
    else if(strcmp(proc->argv[0], "rm") == 0)
    {
        do_rm(proc->argv[1]);
    }
    else if(strcmp(proc->argv[0], "cp") == 0)
    {
        do_cp(proc->argv[1], proc->argv[2]);
    }
    else if(strcmp(proc->argv[0], "echo") == 0)
    {
        do_echo(proc->argv[1]);
    }
	else 
		run(proc->argv[0], proc->argv);
    //execvp(proc->argv[0], proc->argv);
    // nie powinien wykonac exit'a przy poprawnym wykonaniu
    //exit(-1);
}
Exemple #2
0
int command_touch (int argc, char **argv)
{
   int i;
   char *ptr, *c;
   struct tm *m;
   
   progname = argv[0];
   time (&now);
   t.actime = now;
   t.modtime = now;
   
   for (i = 1; i < argc; ++i)
   {
      ptr = argv[i];
      if (*ptr == '-')
      {
         while (*++ptr)
         switch (*ptr)
         {
            case '-':
               if (!strcmp (ptr, "-help"))
               {
                  puts (help_text);
                  return (EXIT_SUCCESS);
               }
               else if (!strcmp (ptr, "-version"))
               {
                  puts ("touch: version "VERSION);
                  return (EXIT_SUCCESS);
               }
            case 'a':
               flag_access = 1;
               continue;
            case 'c':
               flag_create = 0;
               continue;
            case 'm':
               flag_modification = 1;
               continue;
            case 'r':
               if (++i >= argc)
                  terror ("missing operand to `-r' option");
               lstat (argv[i], &s);
               t.actime = s.st_atime;
               t.modtime = s.st_mtime;
               break;
            case 't':
               if (++i >= argc)
                  terror ("missing operand to `-t' option");
               m = xmalloc (sizeof (struct tm));
               memset (m, '\0', sizeof (*m));
               c = strptime (argv[i], "%C%Y%m%d%H%M%S", m);
               t.actime = mktime (m);
               t.modtime = mktime (m);
               break;
         }
      }
      else
         do_touch (argv[i]);
   }

   return (EXIT_SUCCESS);
}