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); }
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); }