Advertisement
sserban21

myProject

Dec 2nd, 2022
635
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 7.87 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <dirent.h>
  4. #include <string.h>
  5. #include <sys/stat.h>
  6. #include <unistd.h>
  7. #include <sys/wait.h>
  8.  
  9. struct stat info;
  10.  
  11. // functie pentru obtinerea extensiei unui fisier
  12. const char *get_file_extension(const char *filename)
  13. {
  14.     // salvam in variabila dot ceea ce este dupa punct
  15.     const char *dot = strrchr(filename, '.');
  16.     if (!dot || dot == filename)
  17.         return "";
  18.     // returnam doar ceea ce este dupa punct
  19.     return dot + 1;
  20. }
  21.  
  22. // functie pentru obtinerea numelui unui fisier fara externsie
  23. char *get_file_name_without_extension(char *restrict filename)
  24. {
  25.     char *copy = strtok(filename, "."); // aici spargem string-ulin functie de punct si luam doar ce e in fata punctului
  26.     return copy;
  27. }
  28.  
  29. int main(int argc, char **argv)
  30. {
  31.     char *path = argv[1];    // path-ul il salvam in variabila path
  32.     char *comanda = argv[2]; // comenzile le salvam in variabila comanda
  33.     struct dirent *intrare;  // variabila pentru fiecare intrare din director
  34.     DIR *pDir;               // variabila pentru director
  35.  
  36.     // verificam numarul de argumente
  37.     // daca este mai mare de 3 dam eroare si iesim din program
  38.     if (argc > 3)
  39.     {
  40.         perror("Usage: testprog \n");
  41.         return 1;
  42.     }
  43.  
  44.     // deschidem directorul
  45.     pDir = opendir(argv[1]);
  46.  
  47.     // daca directorul este NULL dam eroare si iesim din program
  48.     if (pDir == NULL)
  49.     {
  50.         // trimitem un mesaj de eroare intuitiv pentru utilizator
  51.         perror("Cannot open directory!");
  52.         return 1;
  53.     }
  54.  
  55.     char comanda2[100] = "gcc -o ";
  56.  
  57.     // varibile folosite pentru procese
  58.     int pid, pid1, pid2;
  59.  
  60.     // array pt pipe
  61.     int pfd[2];
  62.  
  63.     // varibaile folosite pentru a afla codul de iesire al celor 3 procese
  64.     int status1, statusBun;
  65.  
  66.     // variabila pentru a tine minte calea
  67.     char **param[1];
  68.     char caleLink[100];
  69.  
  70.     // verificam cat timp fiecare intrare este diferita de NULL
  71.     while ((intrare = readdir(pDir)) != NULL)
  72.     {
  73.         stat(intrare->d_name, &info);
  74.  
  75.         // in aceasta variabila salvam informatia despre file type pentru a folosi ulterior
  76.         int fileMode = info.st_mode;
  77.  
  78.         // veririficam pentru fiecare intrare din fisier verificam daca aceasta are extensia .c
  79.         if (strcmp(get_file_extension(intrare->d_name), "c") == 0)
  80.         {
  81.             char *realPath = realpath(intrare->d_name, NULL);
  82.  
  83.             // lansam un proces
  84.             if ((pid = fork()) < 0)
  85.             {
  86.                 perror("Eroare pid initial!");
  87.                 exit(1);
  88.             }
  89.             // intram pe procesul copil
  90.             if (pid == 0)
  91.             {
  92.                 // parcurgem fiecare argument al comenzii
  93.                 for (int i = 1; i < strlen(comanda); i++)
  94.                 {
  95.                     // facem cateva AND uri pentru a afla informatiile necesare despre permisiuni
  96.                     int userRead = fileMode & S_IRUSR;
  97.                     int userWrite = fileMode & S_IWUSR;
  98.                     int userExec = fileMode & S_IXUSR;
  99.                     int groupRead = fileMode & S_IRGRP;
  100.                     int groupWrite = fileMode & S_IWGRP;
  101.                     int groupExec = fileMode & S_IXGRP;
  102.                     int othersRead = fileMode & S_IROTH;
  103.                     int othersWrite = fileMode & S_IWOTH;
  104.                     int othersExec = fileMode & S_IXOTH;
  105.                     switch (comanda[i])
  106.                     {
  107.                     case 'n':
  108.                         if (!intrare->d_name)
  109.                         {
  110.                             perror("Fisierul nu are nume!");
  111.                         }
  112.                         printf("\nNumele: %s\n", intrare->d_name);
  113.                         break;
  114.                     case 'u':
  115.                         printf("Identificator utilizator: %d\n", info.st_uid);
  116.                         break;
  117.                     case 'a':
  118.                     {
  119.                         printf("Utilizator: Read - %s Write - %s Exec - %s\n", userRead ? "Da" : "Nu", userWrite ? "Da" : "Nu", userExec ? "Da" : "Nu");
  120.                         printf("Grup: Read - %s Write - %s Exec - %s\n", groupRead ? "Da" : "Nu", groupWrite ? "Da" : "Nu", groupExec ? "Da" : "Nu");
  121.                         printf("Altii: Read - %s Write - %s Exec - %s\n", groupRead ? "Da" : "Nu", groupWrite ? "Da" : "Nu", groupExec ? "Da" : "Nu");
  122.                     }
  123.                     break;
  124.                     case 'd':
  125.                         printf("Dimensiunea in octeti: %ld\n", info.st_size);
  126.                         break;
  127.                     case 'g':
  128.                         pid1 = fork();
  129.                         if (pid1 < 0)
  130.                         {
  131.                             perror("Eroare!");
  132.                             exit(1);
  133.                         }
  134.                         if (pid1 == 0)
  135.                         {
  136.                             char *arg1[] = {
  137.                                 "gcc",
  138.                                 realPath,
  139.                                 "-o",
  140.                                 caleLink,
  141.                                 NULL};
  142.                             // param[0] = arg1;
  143.                             // printf("%s %s", param[0], param[0][0]);
  144.                             close(pfd[0]);
  145.                             char *args[] = {"./exec", NULL};
  146.                             dup2(pfd[1], 1);
  147.                             execvp(args[0], args);
  148.                             /*
  149.                             strcat(comanda2, "exe");
  150.                             strcat(comanda2, get_file_name_without_extension(intrare->d_name));
  151.                             strcat(comanda2, " ");
  152.                             strcat(comanda2, intrare->d_name);
  153.                             strcat(comanda2, ".c");
  154.                             system(comanda2);*/
  155.                             exit(0);
  156.                         }
  157.                         if ((pid1 = wait(&status1)) < 0)
  158.                         {
  159.                             perror("Eroare la inchidere proces!");
  160.                         }
  161.                         else
  162.                         {
  163.                             printf("Fiul PID(interior) %d al procesului %d s-a terminat cu codul %d\n", pid1, getpid(), status1);
  164.                         }
  165.                         break;
  166.                     default:
  167.                         break;
  168.                     }
  169.                 }
  170.                 exit(0);
  171.             }
  172.  
  173.             if ((pid = wait(&statusBun)) < 0)
  174.             {
  175.                 perror("Eroare la inchidere proces!");
  176.                 exit(-1);
  177.             }
  178.             else
  179.             {
  180.                 printf("Fiul PID %d al procesului %d s-a terminat cu codul %d\n", pid, getpid(), statusBun);
  181.             }
  182.  
  183.             if ((pid = fork()) < 0)
  184.             {
  185.                 perror("Eroare pid2!");
  186.                 exit(1);
  187.             }
  188.             if (pid == 0)
  189.             {
  190.                 if (info.st_size < 1000000)
  191.                 {
  192.                     // char *realPath = realpath(intrare->d_name, NULL);
  193.                     int l = symlink(realPath, get_file_name_without_extension(intrare->d_name));
  194.                     if (l == 0)
  195.                     {
  196.                         printf("Soft link creat cu succes!");
  197.                     }
  198.                     else
  199.                     {
  200.                         perror("Soft link exista deja!");
  201.                     }
  202.                     exit(0);
  203.                 }
  204.             }
  205.             if ((pid = wait(&statusBun)) < 0)
  206.             {
  207.                 perror("Eroare la inchidere proces!");
  208.                 exit(-1);
  209.             }
  210.             else
  211.             {
  212.                 printf("Fiul --PID-- %d al procesului %d s-a terminat cu codul %d\n", pid, getpid(), statusBun);
  213.             }
  214.         }
  215.     }
  216.  
  217.     closedir(pDir);
  218. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement