Advertisement
STANAANDREY

so2 lab4 pb2

Oct 30th, 2024
111
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.93 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <sys/types.h>
  4. #include <dirent.h>
  5. #include <string.h>
  6. #include <sys/stat.h>
  7. #include <sys/wait.h>
  8. #include <fcntl.h>
  9. #include <unistd.h>
  10. #include <ctype.h>
  11.  
  12. #define BUFF_SIZE (1 << 12)
  13.  
  14. void procRegFile(const char path[]) {
  15.     char aux[BUFF_SIZE + 5];
  16.     sprintf(aux, "%s.exe", path);
  17.     char *argv[] = {
  18.         "gcc",
  19.         "-Wall",
  20.         "-o",
  21.         aux,
  22.         (char*)path,
  23.         NULL
  24.     };
  25.     exit(execvp("gcc", argv));
  26. }
  27.  
  28. void procEntry(const char path[], int *kids) {
  29.     struct stat statbuf;
  30.     if (stat(path, &statbuf)) {
  31.         perror("");
  32.         exit(-1);
  33.     }
  34.  
  35.     if (!S_ISREG(statbuf.st_mode)) {
  36.         return;
  37.     }
  38.     const char *const suf = strrchr(path, '.');
  39.     if (strcmp(suf, ".c")) {
  40.         return;
  41.     }
  42.     pid_t kidPid = fork();
  43.     if (kidPid < 0) {
  44.         perror("");
  45.         exit(-1);
  46.     }
  47.  
  48.     if (kidPid == 0) {//kid
  49.         procRegFile(path);
  50.     }    
  51.     (*kids)++;    
  52. }
  53.  
  54. void iterDir(const char path[]) {
  55.     DIR *dir = opendir(path);
  56.     if (dir == NULL) {
  57.         perror("");
  58.         exit(-1);
  59.     }
  60.     int kids = 0;
  61.     for (struct dirent *dep; (dep = readdir(dir));) {
  62.         const char *const dname = dep->d_name;
  63.         if (!strcmp(dname, ".") || !strcmp(dname, "..")) {
  64.             continue;
  65.         }
  66.  
  67.         char absPath[BUFF_SIZE];
  68.         sprintf(absPath, "%s/%s", path, dname);
  69.         procEntry(absPath, &kids);
  70.     }
  71.     if (closedir(dir)) {
  72.         perror("");
  73.     }
  74.  
  75.     int wstat = 0;
  76.     pid_t wr;
  77.     while ((wr = wait(&wstat))) {
  78.         if (wr == -1) {
  79.             perror("");
  80.             exit(-1);
  81.         }
  82.         kids--;
  83.         if (kids == 0) {
  84.             break;
  85.         }
  86.     }
  87. }
  88.  
  89. int main(int argc, char *argv[]) {
  90.     if (argc != 2) {
  91.         fprintf(stderr, "Wrong usage!\n");
  92.         exit(1);
  93.     }
  94.     iterDir(argv[1]);
  95.     return 0;
  96. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement