Advertisement
techno-

p3

Dec 13th, 2022
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 52.38 KB | None | 0 0
  1. /*
  2.     Javier Sobrino González
  3.     Javier Loureiro Pérez
  4. */
  5.  
  6. #include <stdio.h>
  7. #include <stdlib.h>
  8. #include <string.h>
  9. #include <unistd.h>
  10. #include <time.h>
  11. #include <sys/types.h>
  12. #include <limits.h>
  13. #include <sys/stat.h>
  14. #include <errno.h>
  15. #include <sys/utsname.h>
  16. #include <pwd.h>
  17. #include <grp.h>
  18. #include <dirent.h>
  19. #include <sys/shm.h>
  20. #include <sys/mman.h>
  21. #include <fcntl.h>
  22. #include <sys/wait.h>
  23. #include <stdbool.h>
  24. #include <sys/resource.h>
  25. #include <ctype.h>
  26. #include "ListaHistorial.h"
  27. #include "ListaBloques.h"
  28. #include "ListaShared.h"
  29. #include "ListaMmap.h"
  30. #include "ListaProcesos.h"
  31.  
  32. struct SEN{
  33.         char *nombre;
  34.         int senal;
  35. };
  36. static struct SEN sigstrnum[]={  
  37.     {"HUP", SIGHUP},
  38.     {"INT", SIGINT},
  39.     {"QUIT", SIGQUIT},
  40.     {"ILL", SIGILL},
  41.     {"TRAP", SIGTRAP},
  42.     {"ABRT", SIGABRT},
  43.     {"IOT", SIGIOT},
  44.     {"BUS", SIGBUS},
  45.     {"FPE", SIGFPE},
  46.     {"KILL", SIGKILL},
  47.     {"USR1", SIGUSR1},
  48.     {"SEGV", SIGSEGV},
  49.     {"USR2", SIGUSR2},
  50.     {"PIPE", SIGPIPE},
  51.     {"ALRM", SIGALRM},
  52.     {"TERM", SIGTERM},
  53.     {"CHLD", SIGCHLD},
  54.     {"CONT", SIGCONT},
  55.     {"STOP", SIGSTOP},
  56.     {"TSTP", SIGTSTP},
  57.     {"TTIN", SIGTTIN},
  58.     {"TTOU", SIGTTOU},
  59.     {"URG", SIGURG},
  60.     {"XCPU", SIGXCPU},
  61.     {"XFSZ", SIGXFSZ},
  62.     {"VTALRM", SIGVTALRM},
  63.     {"PROF", SIGPROF},
  64.     {"WINCH", SIGWINCH},
  65.     {"IO", SIGIO},
  66.     {"SYS", SIGSYS},
  67. /*senales que no hay en todas partes*/
  68. #ifdef SIGPOLL
  69.     {"POLL", SIGPOLL},
  70. #endif
  71. #ifdef SIGPWR
  72.     {"PWR", SIGPWR},
  73. #endif
  74. #ifdef SIGEMT
  75.     {"EMT", SIGEMT},
  76. #endif
  77. #ifdef SIGINFO
  78.     {"INFO", SIGINFO},
  79. #endif
  80. #ifdef SIGSTKFLT
  81.     {"STKFLT", SIGSTKFLT},
  82. #endif
  83. #ifdef SIGCLD
  84.     {"CLD", SIGCLD},
  85. #endif
  86. #ifdef SIGLOST
  87.     {"LOST", SIGLOST},
  88. #endif
  89. #ifdef SIGCANCEL
  90.     {"CANCEL", SIGCANCEL},
  91. #endif
  92. #ifdef SIGTHAW
  93.     {"THAW", SIGTHAW},
  94. #endif
  95. #ifdef SIGFREEZE
  96.     {"FREEZE", SIGFREEZE},
  97. #endif
  98. #ifdef SIGLWP
  99.     {"LWP", SIGLWP},
  100. #endif
  101. #ifdef SIGWAITING
  102.     {"WAITING", SIGWAITING},
  103. #endif
  104.     {NULL,-1},
  105.     };    /*fin array sigstrnum */
  106.  
  107.  
  108. #define MaxTrozos 512
  109. #define MaxHist 4096
  110. #define TAMANO 2048
  111.  
  112.  
  113. char linea[4096];
  114. char *trozos[MaxTrozos];
  115. int numtrozos;
  116. int pidglobal=1111;
  117.  
  118. int EntraEnBloque=0;
  119. int EntraEnShared=0;
  120. int EntraEnMmap=0;
  121.  
  122. static int varMem;
  123. static int varMem2;
  124. static int varMem3;
  125.  
  126. void ejecutarComando(char *linea);
  127.  
  128. int TrocearCadena(char * cadena, char * trozos[]){
  129.     int i=1;
  130.     if ((trozos[0]=strtok(cadena," \n\t"))==NULL)
  131.     return 0;
  132.     while ((trozos[i]=strtok(NULL," \n\t"))!=NULL)
  133.         i++;
  134.     return i;
  135. }
  136.  
  137.  
  138. //Comandos del shell
  139.  
  140. //Comando autores
  141. void cmdAutores(){
  142.  
  143.     char flagLogin= 1, flagNombre=1;
  144.  
  145.     if(numtrozos > 1 && strcmp(trozos[1], "-l") == 0)
  146.         flagNombre= 0;
  147.     if(numtrozos > 1 && strcmp(trozos[1], "-n") == 0)
  148.         flagLogin = 0;
  149.  
  150.     if(flagLogin){
  151.         printf("Login: j.loureirop\n");
  152.         printf("Login: javier.sobrino\n");
  153.     }
  154.     if(flagNombre){
  155.         printf("Nombre: Javier Loureiro\n");
  156.         printf("Nombre: Javier Sobrino\n");
  157.     }
  158. }
  159.  
  160. //Comando Fin (sale del shell)
  161. void cmdFin(){
  162.     exit(0);
  163. }
  164.  
  165. //Comando Pid
  166. void cmdPid(){
  167.  
  168.     if(numtrozos == 1)
  169.         printf("Pid del shell: %d\n", getpid());
  170.     else if (numtrozos > 1)
  171.         printf("Pid del padre del shell: %d\n", getppid());
  172. }
  173.  
  174.  
  175. //Comando Carpeta
  176. void cmdCarpeta(){
  177.     char ruta[PATH_MAX];
  178.  
  179.     if(numtrozos == 1){
  180.         if(getcwd(ruta, PATH_MAX) == NULL){
  181.             perror("getcwd");
  182.             return;
  183.         }
  184.         else{
  185.             printf("%s\n", ruta);
  186.             return;
  187.         }
  188.     }
  189.     else if(numtrozos > 1){
  190.         if (chdir(trozos[1]) == -1) {perror("chdir"); return;}
  191.         else
  192.             chdir(trozos[1]);
  193.     }
  194. }
  195.  
  196. //Comando comandoN
  197. void cmdComandoN(){
  198.     int n;
  199.  
  200.     if(numtrozos == 1) {printf("Falta número de comando \n"); return;}
  201.     n = atoi(trozos[1]);
  202.  
  203.     if(n < 0 || n >= histNumElementos()) {printf("Número de comando fuera de rango \n"); return;}
  204.     else {
  205.         printf(" %s",histElemento(n));
  206.     }
  207. }
  208.  
  209. //Comando fecha
  210. void cmdFecha(){
  211.  
  212.     struct tm *t;
  213.     time_t tiempo;
  214.  
  215.     if(time(&tiempo) == -1) {perror("time"); return;}
  216.     t = localtime(&tiempo);
  217.  
  218.     if(numtrozos > 1 && strcmp(trozos[1], "-d") == 0)
  219.         printf("%d/%d/%d\n", t->tm_mday, t->tm_mon, t->tm_year+1900);
  220.     else if(numtrozos > 1 && strcmp(trozos[1], "-h") == 0)
  221.         printf("%d:%d:%d\n", t->tm_hour, t->tm_min, t->tm_sec);
  222.     else{
  223.         printf("%d:%d:%d\n", t->tm_hour, t->tm_min, t->tm_sec);
  224.         printf("%d/%d/%d\n", t->tm_mday, t->tm_mon, t->tm_year+1900);
  225.     }
  226.  
  227. }
  228.  
  229. //Comando historial
  230. void histImprimeN(){
  231.     int i;
  232.  
  233.     for(i = 0; i <= trozos[1][1] - 48; i++){
  234.         printf("%d->%s", i, histElemento(i));
  235.     }
  236. }
  237.  
  238. void cmdHist(){
  239.     int i;
  240.  
  241.     if(numtrozos == 1){
  242.         for(i = 0; i < histNumElementos() ; i++){
  243.         printf("%d->%s", i, histElemento(i));
  244.         }
  245.     }
  246.     else if(numtrozos > 1 && strcmp(trozos[1], "-c") == 0){
  247.         histBorrar();
  248.         return;
  249.     }
  250.     else if(numtrozos > 1)
  251.         histImprimeN();
  252. }
  253.  
  254. //Comando infosis
  255. void cmdInfosis(){
  256.     struct utsname system;
  257.     uname(&system);
  258.  
  259.     printf("%s (%s), OS: %s %s-%s\n", system.nodename, system.machine, system.sysname,
  260.                                                                 system.release, system.version);
  261. }
  262.  
  263. /*PRACTICA 1*/
  264.  
  265. //Comando create
  266. void cmdCreate(){
  267.     char ruta[PATH_MAX];
  268.     if (numtrozos==1){
  269.         getcwd(ruta, PATH_MAX);
  270.         printf("%s\n", ruta);
  271.         return;
  272.     }else if(numtrozos==2){
  273.         if(strcmp(trozos[1],"-f")==0){
  274.         getcwd(ruta, PATH_MAX);
  275.         printf("%s\n", ruta);
  276.         return;
  277.         }else{
  278.         mkdir(trozos[1],0777);
  279.         if(errno != 0){
  280.         printf("Imposible crear: %s\n",strerror(errno));
  281.         }
  282.     }
  283.  
  284.     }else if(numtrozos==3){
  285.         if(strcmp(trozos[1], "-f")==0){
  286.         getcwd(ruta, PATH_MAX);
  287.         strcat(ruta,"/");
  288.         strcat(ruta,trozos[2]);
  289.  
  290.         FILE *fp;
  291.         fp = fopen(trozos[2],"w");
  292.         if(fp != NULL){
  293.         fclose(fp);
  294.         }
  295.         if(errno != 0){
  296.         printf("Imposible crear: %s\n",strerror(errno));
  297.         }
  298.  
  299.       }
  300.     }
  301.  
  302. }
  303. //Comando borrar
  304.  
  305. void cmdDelete(){
  306.     int i;
  307.     for(i=1;i<numtrozos;i++){
  308.  
  309.         if(errno != 0){
  310.         printf("%s\n",strerror(errno));
  311.         }
  312.         remove(trozos[i]);
  313.         if(errno != 0){
  314.         printf("%s\n",strerror(errno));
  315.         }
  316.         }
  317.  
  318.     }
  319.  
  320.  
  321.  
  322. //
  323.  
  324.  
  325. void st_mode_to_str(mode_t st_mode, char *mode){
  326.     mode[0]= ' '; //(S_ISDIR(fileStat.st_mode)) ? 'd' : '-';
  327.     mode[1]= (st_mode & S_IRUSR) ? 'r' : '-';
  328.     mode[2]= (st_mode & S_IWUSR) ? 'w' : '-';
  329.     mode[3]= (st_mode & S_IXUSR) ? 'x' : '-';
  330.     mode[4]= (st_mode & S_IRGRP) ? 'r' : '-';
  331.     mode[5]= (st_mode & S_IWGRP) ? 'w' : '-';
  332.     mode[6]= (st_mode & S_IXGRP) ? 'x' : '-';
  333.     mode[7]= (st_mode & S_IROTH) ? 'r' : '-';
  334.     mode[8]= (st_mode & S_IWOTH) ? 'w' : '-';
  335.     mode[9]= (st_mode & S_IXOTH) ? 'x' : '-';
  336.     mode[10]= 0;
  337.     }
  338.  
  339. //Comando stat
  340. void cmdStat(){
  341.  
  342.     struct stat *statbuf;
  343.     statbuf = malloc(sizeof(struct stat));
  344.  
  345.  
  346.     char ruta[PATH_MAX];
  347.     int flagLong=0, flagAcc=0, flagLink=0; //flags para detectar las opciones que se pasan
  348.     struct passwd *pws; //Id dispositivo
  349.     struct group *grp; //Id grupo
  350.     struct tm dtc, dta;
  351.  
  352.     //Introducen stat
  353.     if (numtrozos == 1)
  354.         cmdCarpeta();
  355.  
  356.     //Introducen stat (algo)
  357.     if(numtrozos == 2){
  358.  
  359.         getcwd(ruta, PATH_MAX);
  360.         strcat(ruta, "/");
  361.         strcat(ruta, trozos[1]);
  362.  
  363.         if(lstat(ruta, statbuf)== -1){
  364.             printf("Ha habido un error: %s\n", strerror(errno));
  365.         }
  366.         else{
  367.             printf("%ld %s\n", statbuf->st_size, trozos[1]);
  368.         }
  369.     }
  370.  
  371.     if(numtrozos>2){
  372.         //Obtenemos los flags que se pasan
  373.         for(int i = 1; i < numtrozos && trozos[i][0] == '-' ; i++){
  374.             if(strcmp(trozos[i], "-long") == 0) flagLong = 1;
  375.             else if(strcmp(trozos[i],"-link") == 0) flagLink = 1;
  376.             else if(strcmp(trozos[i], "-acc") == 0) flagAcc = 1;
  377.         }
  378.  
  379.         getcwd(ruta, PATH_MAX);
  380.         strcat(ruta, "/");
  381.         strcat(ruta, trozos[numtrozos-1]);
  382.  
  383.         if(lstat(ruta, statbuf)== -1){
  384.             printf("Ha habido un error: %s\n", strerror(errno));
  385.         }
  386.         else{
  387.             pws = getpwuid(statbuf->st_uid);
  388.             grp = getgrgid(statbuf->st_gid);
  389.  
  390.             dtc = *(gmtime(&statbuf->st_ctime));
  391.             dta = *(gmtime(&statbuf->st_atime));
  392.  
  393.  
  394.             if(flagAcc == 1 && flagLong==0){
  395.                 printf("%d/%d/%d-%d:%.2d  ", dta.tm_year + 1900, dta.tm_mon+1, dta.tm_mday,
  396.                 dta.tm_hour+2, dta.tm_min);
  397.             }
  398.             if(flagLong==1){
  399.                 //strmode(st_mode, statbuf->st_mode);
  400.                 char mode[11];
  401.                 st_mode_to_str(statbuf->st_mode,mode);
  402.                 printf("%d/%d/%d-%d:%.2d %ld, ( %ld)    %s %s %s ", dtc.tm_year + 1900, dtc.tm_mon+1, dtc.tm_mday,
  403.                 dtc.tm_hour+2, dtc.tm_min,statbuf->st_nlink, statbuf->st_ino, pws->pw_name, grp->gr_name, mode);
  404.             }
  405.             if(flagLink==1){
  406.                 //hacer links
  407.             }
  408.             printf("%ld %s\n", statbuf->st_size, trozos[numtrozos-1]);
  409.         }
  410.     }
  411.  
  412. }
  413.  
  414.  
  415.  
  416. //Stat 2 (para list)
  417.  
  418. void cmdStat2(const char d_name[],int flagLong, int flagAcc, char ruta[], int REC){
  419.     struct stat *statbuf;
  420.     statbuf = malloc(sizeof(struct stat));
  421.  
  422.  
  423.  
  424.     struct passwd *pws; //Id dispositivo
  425.     struct group *grp; //Id grupo
  426.     struct tm dtc, dta;
  427.  
  428.  
  429.  
  430.     if(numtrozos>2){
  431.  
  432. if(REC==1){
  433.  
  434.         if(lstat(ruta, statbuf)== -1){
  435.         }
  436.         else{
  437.             pws = getpwuid(statbuf->st_uid);
  438.             grp = getgrgid(statbuf->st_gid);
  439.  
  440.             dtc = *(gmtime(&statbuf->st_ctime));
  441.             dta = *(gmtime(&statbuf->st_atime));
  442.  
  443.  
  444.             if(flagAcc == 1 && flagLong==0){
  445.                 printf("%d/%d/%d-%d:%.2d  ", dta.tm_year + 1900, dta.tm_mon+1, dta.tm_mday,
  446.                 dta.tm_hour+2, dta.tm_min);
  447.             }
  448.  
  449.             if(flagLong==1){
  450.                 //strmode(st_mode, statbuf->st_mode);
  451.                 char mode[11];
  452.                 st_mode_to_str(statbuf->st_mode,mode);
  453.                 printf("%d/%d/%d-%d:%.2d %ld, ( %ld)    %s %s %s ", dtc.tm_year + 1900, dtc.tm_mon+1, dtc.tm_mday,
  454.                 dtc.tm_hour+2, dtc.tm_min,statbuf->st_nlink, statbuf->st_ino, pws->pw_name, grp->gr_name, mode);
  455.             }
  456.             printf("%ld %s\n", statbuf->st_size, d_name);
  457.         }
  458.  
  459.       }
  460.  
  461.       else if(REC==0){
  462.  
  463.            if(lstat(d_name, statbuf)== -1){
  464.         }
  465.         else{
  466.             pws = getpwuid(statbuf->st_uid);
  467.             grp = getgrgid(statbuf->st_gid);
  468.  
  469.             dtc = *(gmtime(&statbuf->st_ctime));
  470.             dta = *(gmtime(&statbuf->st_atime));
  471.  
  472.  
  473.             if(flagAcc == 1 && flagLong==0){
  474.                 printf("%d/%d/%d-%d:%.2d  ", dta.tm_year + 1900, dta.tm_mon+1, dta.tm_mday,
  475.                 dta.tm_hour+2, dta.tm_min);
  476.             }
  477.  
  478.             if(flagLong==1){
  479.                 //strmode(st_mode, statbuf->st_mode);
  480.                 char mode[11];
  481.                 st_mode_to_str(statbuf->st_mode,mode);
  482.                 printf("%d/%d/%d-%d:%.2d %ld, ( %ld)    %s %s %s ", dtc.tm_year + 1900, dtc.tm_mon+1, dtc.tm_mday,
  483.                 dtc.tm_hour+2, dtc.tm_min,statbuf->st_nlink, statbuf->st_ino, pws->pw_name, grp->gr_name, mode);
  484.             }
  485.             printf("%ld %s\n", statbuf->st_size, ruta);
  486.         }
  487.  
  488.           }
  489.     }
  490.  
  491. }
  492.  
  493.  
  494. void cmdListaREC(const char *dirname,int fun, int flagHid, int flagLong){
  495.     if(fun==0){
  496.  
  497.     DIR* dir = opendir(dirname);
  498.  
  499.     struct dirent* dirent;
  500.     dirent = readdir(dir);
  501.     char path[100];
  502.  
  503.  
  504.  
  505.  
  506.   if (dir == NULL) {
  507.         return;
  508.     }
  509.  
  510.     printf("************%s\n",dirname);
  511.  
  512.  
  513.     while (dirent != NULL) {
  514.         strcpy(path, dirname);
  515.         strcat(path, "/");
  516.         strcat(path, dirent->d_name);
  517.  
  518.         if(dirent->d_name[0] != '.' || flagHid == 1){
  519.             if(flagLong==1){
  520.                 cmdStat2(dirent->d_name,1,1,path,1);
  521.                 }else{
  522.                     printf("%hhd %s\n", dirent->d_type, dirent->d_name);
  523.                     }
  524.         }
  525.  
  526.         dirent = readdir(dir);
  527.     }
  528.  
  529.     closedir(dir);
  530.  
  531.  
  532.     dir = opendir(dirname);
  533.     if (dir == NULL) {
  534.         return;
  535.     }
  536.  
  537.  
  538.     dirent = readdir(dir);
  539.     while (dirent != NULL) {
  540.  
  541.  
  542.  
  543.        if (dirent->d_type == DT_DIR && strcmp(dirent->d_name, ".") != 0 && strcmp(dirent->d_name, "..") != 0 && (dirent->d_name[0] != '.'|| flagHid==1)){
  544.  
  545.            char path[100];
  546.             strcpy(path, dirname);
  547.             strcat(path, "/");
  548.             strcat(path, dirent->d_name);
  549.             cmdListaREC(path,0,flagHid,flagLong);
  550.         }
  551.         dirent = readdir(dir);
  552.     }
  553.  
  554.     closedir(dir);
  555.  
  556.     }
  557.  
  558.     else if (fun==1){
  559.  
  560.  
  561.  
  562.     DIR* dir = opendir(dirname);
  563.  
  564.     struct dirent* dirent;
  565.     dirent = readdir(dir);
  566.  
  567.  
  568.     if (dir == NULL) {
  569.         return;
  570.     }
  571.  
  572.  
  573.     while (dirent != NULL) {
  574.  
  575.         if (dirent->d_type == DT_DIR && strcmp(dirent->d_name, ".") != 0 && strcmp(dirent->d_name, "..") != 0 && (dirent->d_name[0] != '.' || flagHid ==1)) {
  576.             char path[100];
  577.             printf("************%s/%s\n",dirname,dirent->d_name);
  578.             strcpy(path, dirname);
  579.             strcat(path, "/");
  580.             strcat(path, dirent->d_name);
  581.             cmdListaREC(path,1,flagHid,flagLong);
  582.             printf("************%s\n",dirname);
  583.         }
  584.  
  585.         dirent = readdir(dir);
  586.     }
  587.  
  588.     closedir(dir);
  589.  
  590.  
  591.     dir = opendir(dirname);
  592.     if (dir == NULL) {
  593.         return;
  594.     }
  595.  
  596.  
  597.     dirent = readdir(dir);
  598.     while (dirent != NULL) {
  599.         char path[100];
  600.         strcpy(path, dirname);
  601.         strcat(path, "/");
  602.         strcat(path, dirent->d_name);
  603.  
  604.        if(dirent->d_name[0] != '.' || flagHid == 1){
  605.             if(flagLong==1){
  606.                 cmdStat2(dirent->d_name,1,1,path,1);
  607.                 }else{
  608.                     printf("%hhd %s\n", dirent->d_type, dirent->d_name);
  609.                     }
  610.         }
  611.  
  612.         dirent = readdir(dir);
  613.     }
  614.  
  615.     closedir(dir);
  616.  
  617.     }
  618. }
  619.  
  620. //Comando list
  621. void cmdList(){
  622.  
  623.  
  624.     char ruta[PATH_MAX];
  625.     int flagHid=0,flagLong=0, flagAcc=0, flagReca=0, flagRecb=0; //flags para detectar las opciones que se pasan
  626.  
  627.  
  628.     DIR *d;
  629.     struct dirent *dirent;
  630.     getcwd(ruta, PATH_MAX);
  631.     strcat(ruta, "/");
  632.     strcat(ruta, trozos[numtrozos-1]);
  633.  
  634.     if(numtrozos==1)
  635.         cmdCarpeta();
  636.  
  637.     if(numtrozos==2){
  638.  
  639.  
  640.         if((d=opendir(ruta)) == NULL){perror("opendir"); return;}
  641.         printf("************%s\n",trozos[numtrozos-1]);
  642.         while((dirent = readdir(d))!= NULL){
  643.             if(dirent->d_name[0] != '.'){
  644.             printf("%s\n", dirent->d_name);
  645.         }
  646.        }
  647.     }
  648.  
  649.  
  650.     if(numtrozos>2){
  651.  
  652.  
  653.  
  654.         //Obtenemos los flags que se pasan
  655.         for(int i = 1; i < numtrozos && trozos[i][0] == '-' ; i++){
  656.             if(strcmp(trozos[i],"-hid")==0) flagHid = 1;
  657.             else if(strcmp(trozos[i], "-long") == 0) flagLong = 1;
  658.             else if(strcmp(trozos[i], "-acc") == 0) flagAcc = 1;
  659.             else if(strcmp(trozos[i], "-reca") == 0) flagReca = 1;
  660.             else if(strcmp(trozos[i], "-recb") == 0) flagRecb = 1;
  661.         }
  662.  
  663.  
  664.     if((d=opendir(ruta)) == NULL){perror("opendir"); return;}
  665.  
  666.  
  667.  
  668.         if(flagAcc==1 && flagLong==0 && flagHid==0){
  669.             printf("************%s\n",trozos[numtrozos-1]);
  670.             while((dirent = readdir(d))!= NULL){
  671.             getcwd(ruta, PATH_MAX);
  672.             strcat(ruta,"/");
  673.             strcat(ruta,trozos[numtrozos-1]);
  674.             strcat(ruta,"/");
  675.             strcat(ruta,dirent->d_name);
  676.             if(dirent->d_name[0] != '.'){
  677.             cmdStat2(ruta,0,1,dirent->d_name,0);
  678.         }
  679.        }
  680.     }//
  681.  
  682.         if(flagAcc==1 && flagLong==0 && flagHid==1){
  683.             printf("************%s\n",trozos[numtrozos-1]);
  684.             while((dirent = readdir(d))!= NULL){
  685.             getcwd(ruta, PATH_MAX);
  686.             strcat(ruta,"/");
  687.             strcat(ruta,trozos[numtrozos-1]);
  688.             strcat(ruta,"/");
  689.             strcat(ruta,dirent->d_name);
  690.             cmdStat2(ruta,0,1,dirent->d_name,0);
  691.        }
  692.     }//
  693.  
  694.         if(flagHid==1 && flagLong==0 && flagAcc==0 && flagReca==0 && flagRecb==0){
  695.             printf("************%s\n",trozos[numtrozos-1]);
  696.             while((dirent = readdir(d))!= NULL){
  697.             printf("%s\n", dirent->d_name);
  698.         }
  699.       }
  700.  
  701.       if(flagLong==1 && flagHid == 0 && flagAcc==0 && flagReca==0 && flagRecb==0){
  702.  
  703.  
  704.           printf("************%s\n",trozos[numtrozos-1]);
  705.             while((dirent = readdir(d))!= NULL){
  706.             getcwd(ruta, PATH_MAX);
  707.             strcat(ruta,"/");
  708.             strcat(ruta,trozos[numtrozos-1]);
  709.             strcat(ruta,"/");
  710.             strcat(ruta,dirent->d_name);
  711.             if(dirent->d_name[0] != '.'){
  712.             cmdStat2(ruta,1,0,dirent->d_name,0);
  713.         }
  714.        }
  715.       }
  716.  
  717.  
  718.       if(flagLong==1 && flagHid == 1 && flagReca ==0 && flagRecb==0){
  719.           printf("************%s\n",trozos[numtrozos-1]);
  720.             while((dirent = readdir(d))!= NULL){
  721.             getcwd(ruta, PATH_MAX);
  722.             strcat(ruta,"/");
  723.             strcat(ruta,trozos[numtrozos-1]);
  724.             strcat(ruta,"/");
  725.             strcat(ruta,dirent->d_name);
  726.             cmdStat2(ruta,1,0,dirent->d_name,0);
  727.        }
  728.       }
  729.  
  730.  
  731.       if(flagReca==1){
  732.         cmdListaREC(trozos[numtrozos-1],0,flagHid, flagLong);
  733.       }else if(flagRecb==1){
  734.         cmdListaREC(trozos[numtrozos-1],1,flagHid, flagLong);
  735.       }
  736.  
  737.  
  738.     }
  739. }
  740.  
  741. // PRÁCTICA 2
  742.  
  743. char * nombreMes(int mes){
  744.     static char* meses[12]={"Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"};
  745.     return meses[mes-1];
  746. }
  747.  
  748. void * ObtenerMemoriaShmget (key_t clave, size_t tam)
  749. {
  750.     void * p;
  751.     int aux,id,flags=0777;
  752.     struct shmid_ds s;
  753.     time_t t = time(NULL);
  754.     struct tm tm = *localtime(&t);
  755.  
  756.     if (tam)     /*tam distito de 0 indica crear */
  757.         flags=flags | IPC_CREAT | IPC_EXCL;
  758.     if (clave==IPC_PRIVATE)  /*no nos vale*/
  759.         {errno=EINVAL; return NULL;}
  760.     if ((id=shmget(clave, tam, flags))==-1)
  761.         return (NULL);
  762.     if ((p=shmat(id,NULL,0))==(void*) -1){
  763.         aux=errno;
  764.         if (tam)
  765.              shmctl(id,IPC_RMID,NULL);
  766.         errno=aux;
  767.         return (NULL);
  768.     }
  769.     shmctl (id,IPC_STAT,&s);
  770.     histSharedInsert(p, s.shm_segsz,tm.tm_mon + 1,tm.tm_mday,tm.tm_hour,tm.tm_min,"shared",clave);
  771.     return (p);
  772. }
  773.  
  774.  
  775. void * ObtenerMemoriaShmget2 (key_t clave, size_t tam)
  776. {
  777.     void * p;
  778.     int aux,id;
  779.     struct shmid_ds s;
  780.     time_t t = time(NULL);
  781.     struct tm tm = *localtime(&t);
  782.     if (clave==IPC_PRIVATE)  /*no nos vale*/
  783.         {
  784.         errno=EINVAL; return NULL;
  785.         }
  786.     if ((id=shmget(clave, tam, 0))==-1){
  787.         return (NULL);
  788.         }
  789.     if ((p=shmat(id,NULL,0))==(void*) -1){
  790.         aux=errno;
  791.         if (tam)
  792.              shmctl(id,IPC_RMID,NULL);
  793.         errno=aux;
  794.         return (NULL);
  795.     }
  796.     shmctl (id,IPC_STAT,&s);
  797.     histSharedInsert(p, s.shm_segsz,tm.tm_mon + 1,tm.tm_mday,tm.tm_hour,tm.tm_min,"shared",clave);
  798.     return (p);
  799. }
  800.  
  801. void * MapearFichero (char * fichero, int protection)
  802. {
  803.     int df, map=MAP_PRIVATE,modo=O_RDONLY;
  804.     struct stat s;
  805.     void *p;
  806.     time_t t = time(NULL);
  807.     struct tm tm = *localtime(&t);
  808.  
  809.     if (protection&PROT_WRITE)
  810.           modo=O_RDWR;
  811.     if (stat(fichero,&s)==-1 || (df=open(fichero, modo))==-1)
  812.           return NULL;
  813.     if ((p=mmap (NULL,s.st_size, protection,map,df,0))==MAP_FAILED)
  814.            return NULL;
  815.     histMmapInsert(p, s.st_size,tm.tm_mon + 1,tm.tm_mday,tm.tm_hour,tm.tm_min,trozos[2],df);
  816.     return p;
  817. }
  818.  
  819.  
  820. void cmdAllocate(){
  821.         int *p;
  822.         int i;
  823.         time_t t = time(NULL);
  824.         struct tm tm = *localtime(&t);
  825.  
  826.         if(numtrozos==1){
  827.             printf("******Lista de bloques asignados para el proceso %d\n", getpid());
  828.             for(i=0;i<nbloq;i++){
  829.                 printf("%p \t %d  %s  %d  %d:%02d  %s\n",histBloqElemento(i)->dir,histBloqElemento(i)->Bytes, nombreMes(histBloqElemento(i)->month), histBloqElemento(i)->dia, histBloqElemento(i)->hora, histBloqElemento(i)->min, histBloqElemento(i)->tipo);
  830.             }
  831.             for(i=0;i<nshared;i++){
  832.                 printf("%p \t %d  %s  %d  %d:%02d  %s (key %d)\n",histSharedElemento(i)->dir,histSharedElemento(i)->Bytes, nombreMes(histSharedElemento(i)->month), histSharedElemento(i)->dia, histSharedElemento(i)->hora, histSharedElemento(i)->min, histSharedElemento(i)->tipo, histSharedElemento(i)->key);
  833.             }
  834.             for(i=0;i<nmmap;i++){
  835.                 printf("%p \t %d  %s  %d  %d:%02d  %s (descriptor %d)\n",histMmapElemento(i)->dir,histMmapElemento(i)->Bytes, nombreMes(histMmapElemento(i)->month), histMmapElemento(i)->dia, histMmapElemento(i)->hora, histMmapElemento(i)->min, histMmapElemento(i)->nombre, histMmapElemento(i)->filedescriptor);
  836.             }
  837.             //////////IMPRIMIR RESTO DE LISTAS
  838.         }
  839.         else if(numtrozos>1 && strcmp(trozos[1],"-malloc")==0){
  840.             if(numtrozos==2){
  841.                 printf("******Lista de bloques asignados malloc para el proceso %d\n", getpid());
  842.             for(i=0;i<nbloq;i++){
  843.                 printf("%p \t %d  %s  %d  %d:%02d  %s\n",histBloqElemento(i)->dir,histBloqElemento(i)->Bytes, nombreMes(histBloqElemento(i)->month), histBloqElemento(i)->dia, histBloqElemento(i)->hora, histBloqElemento(i)->min, histBloqElemento(i)->tipo);
  844.              }
  845.             }
  846.             else if(strcmp(trozos[2],"0")==0){
  847.                 printf("No se asignan bloques de 0 bytes\n");
  848.             }else{
  849.                 p=malloc(atoi(trozos[2]));
  850.                 printf("Asignados %s bytes en %p\n",trozos[2],p);
  851.                 histBloqInsert(p,atoi(trozos[2]),tm.tm_mon + 1,tm.tm_mday,tm.tm_hour,tm.tm_min,"malloc");
  852.                 }
  853.         }
  854.         else if(numtrozos>1 && strcmp(trozos[1],"-createshared")==0){
  855.  
  856.         key_t cl;
  857.         size_t tam;
  858.         void *p;
  859.  
  860.         if(numtrozos==2 || numtrozos==3){
  861.             printf("******Lista de bloques asignados shared para el proceso %d\n", getpid());
  862.             for(i=0;i<nshared;i++){
  863.                 printf("%p \t %d  %s  %d  %d:%02d  %s (key %d)\n",histSharedElemento(i)->dir,histSharedElemento(i)->Bytes, nombreMes(histSharedElemento(i)->month), histSharedElemento(i)->dia, histSharedElemento(i)->hora, histSharedElemento(i)->min, histSharedElemento(i)->tipo, histSharedElemento(i)->key);
  864.             }
  865.         }else{
  866.  
  867.         cl=(key_t)  strtoul(trozos[2],NULL,10);
  868.         tam=(size_t) strtoul(trozos[3],NULL,10);
  869.         if (tam==0) {
  870.             printf ("No se asignan bloques de 0 bytes\n");
  871.             return;
  872.         }
  873.         if ((p=ObtenerMemoriaShmget(cl,tam))!=NULL)
  874.             printf ("Asignados %lu bytes en %p\n",(unsigned long) tam, p);
  875.         else
  876.             printf ("Imposible asignar memoria compartida clave %lu:%s\n",(unsigned long) cl,strerror(errno));
  877.     }
  878. }
  879.  
  880.         else if(numtrozos>1 && strcmp(trozos[1],"-shared")==0){
  881.  
  882.             if(numtrozos==2){
  883.             printf("******Lista de bloques asignados shared para el proceso %d\n", getpid());
  884.             for(i=0;i<nshared;i++){
  885.                 printf("%p \t %d  %s  %d  %d:%02d  %s (key %d)\n",histSharedElemento(i)->dir,histSharedElemento(i)->Bytes, nombreMes(histSharedElemento(i)->month), histSharedElemento(i)->dia, histSharedElemento(i)->hora, histSharedElemento(i)->min, histSharedElemento(i)->tipo, histSharedElemento(i)->key);
  886.             }
  887.         }else{
  888.  
  889.         key_t cl;
  890.         size_t tam;
  891.         void *p;
  892.  
  893.         for(i=0;i<nshared && histSharedElemento(i)->key!=atoi(trozos[2]);i++);
  894.  
  895.  
  896.         cl=(key_t)  strtoul(trozos[2],NULL,10);
  897.         tam=(size_t) (i<nshared) ? histSharedElemento(i)->Bytes : 10;
  898.         if (tam==0) {
  899.             printf ("No se asignan bloques de 0 bytes\n");
  900.             return;
  901.         }
  902.  
  903.         if ((p=ObtenerMemoriaShmget2(cl,tam))!=NULL)
  904.             printf ("Memoria compartida de clave %d en %p\n",histSharedElemento(i)->key, p);
  905.         else
  906.             printf ("Imposible asignar memoria compartida clave %lu:%s\n",(unsigned long) cl,strerror(errno));
  907.  
  908.         }
  909.     }
  910.  
  911.     else if(numtrozos>1 && strcmp(trozos[1],"-mmap")==0){
  912.  
  913.     if(numtrozos==2 || numtrozos==3){
  914.             printf("******Lista de bloques asignados mmap para el proceso %d\n", getpid());
  915.             for(i=0;i<nmmap;i++){
  916.                 printf("%p \t %d  %s  %d  %d:%02d  %s (descriptor %d)\n",histMmapElemento(i)->dir,histMmapElemento(i)->Bytes, nombreMes(histMmapElemento(i)->month), histMmapElemento(i)->dia, histMmapElemento(i)->hora, histMmapElemento(i)->min, histMmapElemento(i)->nombre, histMmapElemento(i)->filedescriptor);
  917.             }
  918.     }else{
  919.  
  920.      char *perm;
  921.      void *p;
  922.      int protection=0;
  923.  
  924.      if ((perm=trozos[3])!=NULL && strlen(perm)<4) {
  925.             if (strchr(perm,'r')!=NULL) protection|=PROT_READ;
  926.             if (strchr(perm,'w')!=NULL) protection|=PROT_WRITE;
  927.             if (strchr(perm,'x')!=NULL) protection|=PROT_EXEC;
  928.      }
  929.      if ((p=MapearFichero(trozos[2],protection))==NULL)
  930.              perror ("Imposible mapear fichero");
  931.      else
  932.              printf ("fichero %s mapeado en %p\n", trozos[2], p);
  933.  
  934.         }
  935.     }
  936. }
  937.  
  938. void do_DeallocateDelkey (char *key)
  939. {
  940.    key_t clave;
  941.    int id;
  942.  
  943.  
  944.    if (key==NULL || (clave=(key_t) strtoul(key,NULL,10))==IPC_PRIVATE){
  945.         printf ("      delkey necesita clave_valida\n");
  946.         return;
  947.    }
  948.    if ((id=shmget(clave,0,0666))==-1){
  949.         perror ("shmget: imposible obtener memoria compartida");
  950.         return;
  951.    }
  952.    if (shmctl(id,IPC_RMID,NULL)==-1)
  953.         perror ("shmctl: imposible eliminar memoria compartida\n");
  954. }
  955.  
  956. void cmdDeallocate(){
  957.     int i;
  958.  
  959.         if(numtrozos==1){
  960.             printf("******Lista de bloques asignados para el proceso %d\n", getpid());
  961.             for(i=0;i<nbloq;i++){
  962.                 printf("%p \t %d  %s  %d  %d:%02d  %s\n",histBloqElemento(i)->dir,histBloqElemento(i)->Bytes, nombreMes(histBloqElemento(i)->month), histBloqElemento(i)->dia, histBloqElemento(i)->hora, histBloqElemento(i)->min, histBloqElemento(i)->tipo);
  963.             }
  964.             for(i=0;i<nshared;i++){
  965.                 printf("%p \t %d  %s  %d  %d:%02d  %s (key %d)\n",histSharedElemento(i)->dir,histSharedElemento(i)->Bytes, nombreMes(histSharedElemento(i)->month), histSharedElemento(i)->dia, histSharedElemento(i)->hora, histSharedElemento(i)->min, histSharedElemento(i)->tipo, histSharedElemento(i)->key);
  966.             }
  967.             for(i=0;i<nmmap;i++){
  968.                 printf("%p \t %d  %s  %d  %d:%02d  %s (descriptor %d)\n",histMmapElemento(i)->dir,histMmapElemento(i)->Bytes, nombreMes(histMmapElemento(i)->month), histMmapElemento(i)->dia, histMmapElemento(i)->hora, histMmapElemento(i)->min, histMmapElemento(i)->nombre, histMmapElemento(i)->filedescriptor);
  969.             }
  970.             //////////IMPRIMIR RESTO DE LISTAS
  971.         }
  972.         else if(numtrozos>1 && strcmp(trozos[1],"-malloc")==0){
  973.             if(numtrozos==2){
  974.                 printf("******Lista de bloques asignados malloc para el proceso %d\n", getpid());
  975.             for(i=0;i<nbloq;i++){
  976.                 printf("%p \t %d  %s  %d  %d:%02d  %s\n",histBloqElemento(i)->dir,histBloqElemento(i)->Bytes, nombreMes(histBloqElemento(i)->month), histBloqElemento(i)->dia, histBloqElemento(i)->hora, histBloqElemento(i)->min, histBloqElemento(i)->tipo);
  977.              }
  978.             }
  979.             else if(strcmp(trozos[2],"0")==0){
  980.                 printf("No se asignan bloques de 0 bytes\n");
  981.             }else{
  982.                 if(nbloq ==0){
  983.                     printf("No hay bloque de ese tamaño asignado con malloc\n");
  984.                 }else{
  985.                 for(i=0;i<nbloq && histBloqElemento(i)->Bytes != atoi(trozos[2]) ;i++);
  986.                 if(i>=nbloq){
  987.                     printf("No hay bloque de ese tamaño asignado con malloc\n");
  988.                 }else{
  989.                     free(histBloqElemento(i)->dir);
  990.                     for(;i<nbloq-1;i++){
  991.                         HistBloq[i] =HistBloq[i+1];
  992.                         }
  993.                         nbloq--;
  994.                     }
  995.                 }
  996.         }
  997.        
  998.         }else if(numtrozos>1 && strcmp(trozos[1],"-delkey")==0){
  999.  
  1000.  
  1001.         if(numtrozos==2){
  1002.             printf("del_key necesita una clave válida\n");
  1003.         }else{
  1004.  
  1005.         do_DeallocateDelkey (trozos[2]);
  1006.     }
  1007. }
  1008.  
  1009.         else if(numtrozos>1 && strcmp(trozos[1],"-shared")==0){
  1010.  
  1011.             if(numtrozos==2){
  1012.             printf("******Lista de bloques asignados shared para el proceso %d\n", getpid());
  1013.             for(i=0;i<nshared;i++){
  1014.                 printf("%p \t %d  %s  %d  %d:%02d  %s (key %d)\n",histSharedElemento(i)->dir,histSharedElemento(i)->Bytes, nombreMes(histSharedElemento(i)->month), histSharedElemento(i)->dia, histSharedElemento(i)->hora, histSharedElemento(i)->min, histSharedElemento(i)->tipo, histSharedElemento(i)->key);
  1015.             }
  1016.         }else{
  1017.             if(nshared ==0){
  1018.                     printf("No hay bloque de esa clave mapeado en el proceso\n");
  1019.                 }else{
  1020.                 //NO HACER DEALLOCATE DELKEY
  1021.                 for(i=0;i<nshared && histSharedElemento(i)->key != atoi(trozos[2]) ;i++);
  1022.                 if(i>=nshared){
  1023.                     printf("No hay bloque de esa clave mapeado en el proceso\n");
  1024.                 }else{
  1025.                     for(;i<nshared-1;i++){
  1026.                         HistShared[i] =HistShared[i+1];
  1027.                         }
  1028.                         nshared--;
  1029.                     }
  1030.                 }
  1031.        
  1032.        
  1033.         }
  1034.     }
  1035.  
  1036.     else if(numtrozos>1 && strcmp(trozos[1],"-mmap")==0){
  1037.  
  1038.     if(numtrozos==2){
  1039.             printf("******Lista de bloques asignados mmap para el proceso %d\n", getpid());
  1040.             for(i=0;i<nmmap;i++){
  1041.                 printf("%p \t %d  %s  %d  %d:%02d  %s (descriptor %d)\n",histMmapElemento(i)->dir,histMmapElemento(i)->Bytes, nombreMes(histMmapElemento(i)->month), histMmapElemento(i)->dia, histMmapElemento(i)->hora, histMmapElemento(i)->min, histMmapElemento(i)->nombre, histMmapElemento(i)->filedescriptor);
  1042.             }
  1043.     }else{
  1044.         if(nmmap ==0){
  1045.                     printf("Fichero %s no mapeado\n",trozos[2]);
  1046.                 }else{
  1047.                 for(i=0;i<nmmap && strcmp(histMmapElemento(i)->nombre,trozos[2]) != 0 ;i++);
  1048.                 if(i>=nmmap){
  1049.                     printf("Fichero %s no mapeado\n",trozos[2]);
  1050.                 }else{
  1051.                     munmap(histMmapElemento(i)->dir,histMmapElemento(i)->Bytes);
  1052.                     for(;i<nmmap-1;i++){
  1053.                         HistMmap[i]=HistMmap[i+1];
  1054.                         }
  1055.                         nmmap--;
  1056.                     }
  1057.                 }
  1058.      
  1059.  
  1060.         }
  1061.     }
  1062.     else{
  1063.         int flagNoEsta=0;
  1064.         EntraEnBloque=0;
  1065.         EntraEnShared=0;
  1066.         EntraEnMmap=0;
  1067.        
  1068.         if(nbloq ==0 && nshared ==0 && nmmap ==0){
  1069.             printf("Direccion %s no asignada con malloc, shared o mmap\n",trozos[1]);
  1070.         }else{
  1071.        
  1072.         if(nbloq!=0){
  1073.         EntraEnBloque=1;
  1074.        
  1075.         char comp[20];
  1076.         sprintf(comp,"%p",histBloqElemento(0)->dir);
  1077.        
  1078.         for(i=0;i<nbloq && strcmp(comp,trozos[1])!=0 ;i++){
  1079.             if(i!=nbloq-1){
  1080.             sprintf(comp,"%p",histBloqElemento(i+1)->dir);
  1081.             }
  1082.         }
  1083.            
  1084.    
  1085.         if(i<nbloq){
  1086.                    
  1087.                     free(histBloqElemento(i)->dir);
  1088.                     for(;i<nbloq-1;i++){
  1089.                         HistBloq[i] =HistBloq[i+1];
  1090.                         }
  1091.                         nbloq--;
  1092.                     }else{flagNoEsta++;}
  1093.            
  1094.           }if(nshared!=0){
  1095.             EntraEnShared=1;
  1096.              
  1097.             char comp[20];
  1098.             sprintf(comp,"%p",histSharedElemento(0)->dir);
  1099.            
  1100.             for(i=0;i<nshared && strcmp(comp,trozos[1])!=0 ;i++){
  1101.                 if(i!=nshared-1){
  1102.                 sprintf(comp,"%p",histSharedElemento(i+1)->dir);
  1103.                 }
  1104.             }
  1105.            
  1106.             if(i<nshared){
  1107.             //NO HACER DEALLOCATE DELKEY
  1108.                     for(;i<nshared-1;i++){
  1109.                         HistShared[i] =HistShared[i+1];
  1110.                         }
  1111.                         nshared--;
  1112.                     }else{flagNoEsta++;}
  1113.          
  1114.          
  1115.          }if(nmmap!=0){
  1116.              EntraEnMmap=1;
  1117.              
  1118.             char comp[20];
  1119.             sprintf(comp,"%p",histMmapElemento(0)->dir);
  1120.            
  1121.             for(i=0;i<nmmap && strcmp(comp,trozos[1])!=0 ;i++){
  1122.                 if(i!=nmmap-1){
  1123.                 sprintf(comp,"%p",histMmapElemento(i+1)->dir);
  1124.                 }
  1125.             }
  1126.            
  1127.             if(i<nmmap){
  1128.                     munmap(histMmapElemento(i)->dir,histMmapElemento(i)->Bytes);
  1129.                     for(;i<nmmap-1;i++){
  1130.                         HistMmap[i]=HistMmap[i+1];
  1131.                         }
  1132.                         nmmap--;
  1133.                     }else{flagNoEsta++;}
  1134.              
  1135.            }if((flagNoEsta==3) || (flagNoEsta==1 && !EntraEnBloque && !EntraEnMmap) || (flagNoEsta==1 && !EntraEnBloque && !EntraEnShared) || (flagNoEsta==1 && !EntraEnShared && !EntraEnMmap) || (flagNoEsta==2 && !EntraEnBloque) || (flagNoEsta==2 && !EntraEnShared) || (flagNoEsta==2 && !EntraEnMmap)){
  1136.                
  1137.                printf("Direccion %s no asignada con malloc, shared o mmap\n",trozos[1]);
  1138.                }
  1139.           }
  1140.         }
  1141. }
  1142.  
  1143. void LlenarMemoria (void *p, size_t cont, unsigned char byte)
  1144. {
  1145.   unsigned char *arr=(unsigned char *) p;
  1146.   size_t i;
  1147.  
  1148.   for (i=0; i<cont;i++)
  1149.         arr[i]=byte;
  1150. }
  1151.  
  1152. void cmdMemfill(){
  1153.     char A='A';
  1154.     int Bytes=128;
  1155.     int *p,i;
  1156.    
  1157.     if(numtrozos==1){
  1158.         return;
  1159.     }if(numtrozos>2){
  1160.         Bytes=atoi(trozos[2]);
  1161.     }
  1162.     if(numtrozos>3){
  1163.         A=trozos[3][0];
  1164.         }
  1165.     if(nbloq!=0 || nshared!=0){
  1166.     if(nbloq!=0){
  1167.     char comp[20];
  1168.         sprintf(comp,"%p",histBloqElemento(0)->dir);
  1169.        
  1170.         for(i=0;i<nbloq && strcmp(comp,trozos[1])!=0 ;i++){
  1171.             if(i!=nbloq-1){
  1172.             sprintf(comp,"%p",histBloqElemento(i+1)->dir);
  1173.             }
  1174.         }
  1175.            
  1176.     }
  1177.         if(i<nbloq && nbloq!=0){
  1178.             p=histBloqElemento(i)->dir;
  1179.             if(histBloqElemento(i)->Bytes<Bytes){
  1180.                 printf("Violacion de segmento generado\n");
  1181.                 exit(0);
  1182.             }
  1183.          
  1184.        
  1185.         }else if(nshared!=0){
  1186.             char comp2[20];
  1187.             sprintf(comp2,"%p",histSharedElemento(0)->dir);
  1188.            
  1189.             for(i=0;i<nshared && strcmp(comp2,trozos[1])!=0 ;i++){
  1190.                 if(i!=nshared-1){
  1191.                 sprintf(comp2,"%p",histSharedElemento(i+1)->dir);
  1192.                 }
  1193.             }
  1194.            
  1195.             if(i<nshared){
  1196.                 p=histSharedElemento(i)->dir;
  1197.                 if(histSharedElemento(i)->Bytes<Bytes){
  1198.                 printf("Violacion de segmento generado\n");
  1199.                 exit(0);
  1200.                 }
  1201.             }else{
  1202.                 printf("Violacion de segmento generado\n");
  1203.                 exit(0);
  1204.                 }
  1205.                
  1206.         }else{
  1207.                 printf("Violacion de segmento generado\n");
  1208.                 exit(0);
  1209.                 }
  1210.                
  1211.         }else{
  1212.                 printf("Violacion de segmento generado\n");
  1213.                 exit(0);
  1214.                 }
  1215.    
  1216.        
  1217.     printf("Llenando %d bytes de memoria con el byte %c(%02x) a partir de la direccion %p\n",Bytes,A,A,p);
  1218.     LlenarMemoria(p,Bytes,(unsigned char)A);
  1219. }
  1220.  
  1221.  
  1222. void cmdMemdump(){
  1223.     int i, numbytes;
  1224.     char *p,*q,*r;
  1225.    
  1226.     if(numtrozos > 2){
  1227.         numbytes = atoi(trozos[2]);
  1228.     }
  1229.     else{
  1230.         numbytes = 25;
  1231.     }
  1232.    
  1233.     if(nbloq!=0 || nshared!=0){
  1234.     if(nbloq!=0){
  1235.     char comp[20];
  1236.         sprintf(comp,"%p",histBloqElemento(0)->dir);
  1237.        
  1238.         for(i=0;i<nbloq && strcmp(comp,trozos[1])!=0 ;i++){
  1239.             if(i!=nbloq-1){
  1240.             sprintf(comp,"%p",histBloqElemento(i+1)->dir);
  1241.             }
  1242.         }
  1243.            
  1244.     }
  1245.         if(i<nbloq && nbloq!=0){
  1246.             p=(char *)histBloqElemento(i)->dir;
  1247.             if(histBloqElemento(i)->Bytes<numbytes){
  1248.                 printf("Violacion de segmento generado\n");
  1249.                 exit(0);
  1250.             }
  1251.          
  1252.        
  1253.         }else if(nshared!=0){
  1254.             char comp2[20];
  1255.             sprintf(comp2,"%p",histSharedElemento(0)->dir);
  1256.            
  1257.             for(i=0;i<nshared && strcmp(comp2,trozos[1])!=0 ;i++){
  1258.                 if(i!=nshared-1){
  1259.                 sprintf(comp2,"%p",histSharedElemento(i+1)->dir);
  1260.                 }
  1261.             }
  1262.            
  1263.             if(i<nshared){
  1264.                 p=(char *)histSharedElemento(i)->dir;
  1265.                 if(histSharedElemento(i)->Bytes<numbytes){
  1266.                 printf("Violacion de segmento generado\n");
  1267.                 exit(0);
  1268.                 }
  1269.             }else{
  1270.                 printf("Violacion de segmento generado\n");
  1271.                 exit(0);
  1272.                 }
  1273.                
  1274.         }else{
  1275.                 printf("Violacion de segmento generado\n");
  1276.                 exit(0);
  1277.                 }
  1278.                
  1279.         }else{
  1280.                 printf("Violacion de segmento generado\n");
  1281.                 exit(0);
  1282.                 }
  1283.    
  1284.     printf("Volcando %d bytes desde la direccion %p\n", numbytes, p);
  1285.     q=p;
  1286.     r=p;
  1287.     int mod = numbytes % 25;  
  1288.    
  1289.     for(int j=0;j<numbytes/25;j++){
  1290.         for(i=0;i<numbytes&&i<25;i++,r++){
  1291.             printf("%2c ",*r);
  1292.             }
  1293.             printf("\n");
  1294.         for(i=0;i<numbytes&&i<25;i++,q++){
  1295.             char buf[10];
  1296.             sprintf(buf,"%x",*q);
  1297.             printf("%.2s ",buf);
  1298.             }
  1299.             printf("\n");
  1300.            
  1301.         }if(mod!=0){
  1302.             for(i=0;i<mod;i++,r++){
  1303.             printf("%2c ",*r);
  1304.             }
  1305.            
  1306.             printf("\n");
  1307.             for(i=0;i<mod;i++,q++){
  1308.             char buf[10];
  1309.             sprintf(buf,"%x",*q);
  1310.             printf("%.2s ",buf);
  1311.             }
  1312.        
  1313.        
  1314.             printf("\n");
  1315.          }
  1316.          
  1317. }
  1318.  
  1319. ssize_t LeerFichero (char *f, void *p, size_t cont)
  1320. {
  1321.    struct stat s;
  1322.    ssize_t  n;  
  1323.    int df,aux;
  1324.  
  1325.    if (stat (f,&s)==-1 || (df=open(f,O_RDONLY))==-1)
  1326.     return -1;    
  1327.    if (cont==-1)   /* si pasamos -1 como bytes a leer lo leemos entero*/
  1328.     cont=s.st_size;
  1329.    if ((n=read(df,p,cont))==-1){
  1330.     aux=errno;
  1331.     close(df);
  1332.     errno=aux;
  1333.     return -1;
  1334.    }
  1335.    close (df);
  1336.    return n;
  1337. }
  1338.  
  1339. ssize_t EscribirFichero (char *f, void *p, size_t cont,int overwrite)
  1340. {
  1341.    ssize_t  n;
  1342.    int df,aux, flags=O_CREAT | O_EXCL | O_WRONLY;
  1343.  
  1344.    if (overwrite)
  1345.     flags=O_CREAT | O_WRONLY | O_TRUNC;
  1346.  
  1347.    if ((df=open(f,flags,0777))==-1)
  1348.     return -1;
  1349.  
  1350.    if ((n=write(df,p,cont))==-1){
  1351.     aux=errno;
  1352.     close(df);
  1353.     errno=aux;
  1354.     return -1;
  1355.    }
  1356.    close (df);
  1357.    return n;
  1358. }
  1359.  
  1360.  
  1361. void cmdIo(){
  1362.    
  1363.     if( (strcmp(trozos[1], "read") == 0)){
  1364.         ssize_t cont = -1;
  1365.         char *file;
  1366.         void *addr;
  1367.  
  1368.         file = trozos[2];
  1369.         addr = (void *) strtol(trozos[3], NULL, 16);
  1370.    
  1371.         if(numtrozos == 5){
  1372.             cont = atoi(trozos[4]);
  1373.         }
  1374.    
  1375.         if((cont = LeerFichero(file, addr, cont)) == -1){
  1376.             printf("Imposible leer fichero");
  1377.         }
  1378.         printf("leidos %ld bytes de %s en %p\n", cont, file, addr);
  1379.     }
  1380.     else if((strcmp(trozos[1], "write") == 0)){
  1381.         int fd=0, numbytes;
  1382.         char *file;
  1383.         void *addr;
  1384.         struct stat filestat;
  1385.  
  1386.         //Sobreescritura con -o
  1387.         if (numtrozos == 6 && strcmp(trozos[2], "-o") == 0) {
  1388.             file = trozos[3];
  1389.             if ((fd = open(file, O_WRONLY)) == -1) {
  1390.                 return;
  1391.             }
  1392.             addr = (void *) strtol(trozos[4], NULL, 16);
  1393.             numbytes = atoi(trozos[5]);
  1394.             if (write(fd, addr, numbytes) == -1) {
  1395.                 close(fd);
  1396.             } else {
  1397.                 printf("escritos %d bytes en %s desde %p\n", numbytes, file, addr);
  1398.                 close(fd);
  1399.             }
  1400.         } else if (numtrozos == 5) { //Sobreescritura sin -o
  1401.             file = trozos[2];
  1402.             if (stat(file, &filestat) == 0) {
  1403.                 printf("Imposible escribir fichero: File exists\n");
  1404.                 return;
  1405.         }
  1406.        
  1407.         addr = (void *) strtol(trozos[3], NULL, 16);
  1408.         numbytes = (int) atoi(trozos[4]);
  1409.        
  1410.         if (write(fd, addr, numbytes) == -1) {
  1411.             close(fd);
  1412.             return;
  1413.         } else {
  1414.             printf("escritos %d bytes en %s desde %p\n", numbytes, file, addr);
  1415.             close(fd);
  1416.             }
  1417.         }  
  1418.     }
  1419.     else{
  1420.         printf("uso: e-s [read|write] ......");
  1421.     }
  1422. }
  1423.    
  1424.  
  1425. void Recursiva (int n)
  1426. {
  1427.   char automatico[TAMANO];
  1428.   static char estatico[TAMANO];
  1429.  
  1430.   printf ("parametro:%3d(%p) array %p, arr estatico %p\n",n,&n,automatico, estatico);
  1431.  
  1432.   if (n>0)
  1433.     Recursiva(n-1);
  1434. }
  1435.  
  1436. void cmdRecurse(){
  1437.     if(numtrozos>1){
  1438.         Recursiva(atoi(trozos[1]));
  1439.         }else return;
  1440. }
  1441.  
  1442. void Do_pmap (void) /*sin argumentos*/
  1443.  { pid_t pid;       /*hace el pmap (o equivalente) del proceso actual*/
  1444.    char elpid[32];
  1445.    char *argv[4]={"pmap",elpid,NULL};
  1446.    
  1447.    sprintf (elpid,"%d", (int) getpid());
  1448.    if ((pid=fork())==-1){
  1449.       perror ("Imposible crear proceso");
  1450.       return;
  1451.       }
  1452.    if (pid==0){
  1453.       if (execvp(argv[0],argv)==-1)
  1454.          perror("cannot execute pmap (linux, solaris)");
  1455.          
  1456.       argv[0]="procstat"; argv[1]="vm"; argv[2]=elpid; argv[3]=NULL;  
  1457.       if (execvp(argv[0],argv)==-1)/*No hay pmap, probamos procstat FreeBSD */
  1458.          perror("cannot execute procstat (FreeBSD)");
  1459.          
  1460.       argv[0]="procmap",argv[1]=elpid;argv[2]=NULL;    
  1461.             if (execvp(argv[0],argv)==-1)  /*probamos procmap OpenBSD*/
  1462.          perror("cannot execute procmap (OpenBSD)");
  1463.          
  1464.       argv[0]="vmmap"; argv[1]="-interleave"; argv[2]=elpid;argv[3]=NULL;
  1465.       if (execvp(argv[0],argv)==-1) /*probamos vmmap Mac-OS*/
  1466.          perror("cannot execute vmmap (Mac-OS)");      
  1467.       exit(1);
  1468.   }
  1469.   waitpid (pid,NULL,0);
  1470. }
  1471.  
  1472.  
  1473. void cmdMemory(){
  1474.     int i,j,k;
  1475.     if(numtrozos==1 || (numtrozos>1 && strcmp(trozos[1],"-all")==0)){
  1476.    
  1477.     printf("Variables locales %18p %18p %18p\n",&i,&j,&k);
  1478.     printf("Variables globales %18p %18p %18p\n",linea,trozos,&numtrozos);
  1479.     printf("Variables estaticas %18p %18p %18p\n",&varMem,&varMem2,&varMem3);
  1480.     printf("Funciones programa %18p %18p %18p\n",&cmdRecurse,&cmdMemory,&cmdAllocate);
  1481.     printf("Funciones libreria %18p %18p %18p\n",&malloc,&printf,&scanf);
  1482.     printf("******Lista de bloques asignados para el proceso %d\n", getpid());
  1483.             for(i=0;i<nbloq;i++){
  1484.                 printf("%p \t %d  %s  %d  %d:%02d  %s\n",histBloqElemento(i)->dir,histBloqElemento(i)->Bytes, nombreMes(histBloqElemento(i)->month), histBloqElemento(i)->dia, histBloqElemento(i)->hora, histBloqElemento(i)->min, histBloqElemento(i)->tipo);
  1485.             }
  1486.             for(i=0;i<nshared;i++){
  1487.                 printf("%p \t %d  %s  %d  %d:%02d  %s (key %d)\n",histSharedElemento(i)->dir,histSharedElemento(i)->Bytes, nombreMes(histSharedElemento(i)->month), histSharedElemento(i)->dia, histSharedElemento(i)->hora, histSharedElemento(i)->min, histSharedElemento(i)->tipo, histSharedElemento(i)->key);
  1488.             }
  1489.             for(i=0;i<nmmap;i++){
  1490.                 printf("%p \t %d  %s  %d  %d:%02d  %s (descriptor %d)\n",histMmapElemento(i)->dir,histMmapElemento(i)->Bytes, nombreMes(histMmapElemento(i)->month), histMmapElemento(i)->dia, histMmapElemento(i)->hora, histMmapElemento(i)->min, histMmapElemento(i)->nombre, histMmapElemento(i)->filedescriptor);
  1491.             }
  1492.        
  1493.     }else{
  1494.     if(strcmp("-blocks",trozos[1])==0){
  1495.         printf("******Lista de bloques asignados para el proceso %d\n", getpid());
  1496.             for(i=0;i<nbloq;i++){
  1497.                 printf("%p \t %d  %s  %d  %d:%02d  %s\n",histBloqElemento(i)->dir,histBloqElemento(i)->Bytes, nombreMes(histBloqElemento(i)->month), histBloqElemento(i)->dia, histBloqElemento(i)->hora, histBloqElemento(i)->min, histBloqElemento(i)->tipo);
  1498.             }
  1499.             for(i=0;i<nshared;i++){
  1500.                 printf("%p \t %d  %s  %d  %d:%02d  %s (key %d)\n",histSharedElemento(i)->dir,histSharedElemento(i)->Bytes, nombreMes(histSharedElemento(i)->month), histSharedElemento(i)->dia, histSharedElemento(i)->hora, histSharedElemento(i)->min, histSharedElemento(i)->tipo, histSharedElemento(i)->key);
  1501.             }
  1502.             for(i=0;i<nmmap;i++){
  1503.                 printf("%p \t %d  %s  %d  %d:%02d  %s (descriptor %d)\n",histMmapElemento(i)->dir,histMmapElemento(i)->Bytes, nombreMes(histMmapElemento(i)->month), histMmapElemento(i)->dia, histMmapElemento(i)->hora, histMmapElemento(i)->min, histMmapElemento(i)->nombre, histMmapElemento(i)->filedescriptor);
  1504.             }
  1505.         }else if(strcmp("-pmap",trozos[1])==0){
  1506.             Do_pmap();
  1507.         }else if(strcmp("-funcs",trozos[1])==0){
  1508.             printf("Funciones programa %18p %18p %18p\n",&cmdRecurse,&cmdMemory,&cmdAllocate);
  1509.             printf("Funciones libreria %18p %18p %18p\n",&malloc,&printf,&scanf);
  1510.         }else if(strcmp("-vars",trozos[1])==0){
  1511.             printf("Variables locales %18p %18p %18p\n",&i,&j,&k);
  1512.             printf("Variables globales %18p %18p %18p\n",linea,trozos,&numtrozos);
  1513.             printf("Variables estaticas %18p %18p %18p\n",&varMem,&varMem2,&varMem3);
  1514.         }
  1515.     }  
  1516. }
  1517.  
  1518. //P3
  1519.  
  1520. void cmdFork ()
  1521. {
  1522.     pid_t pid;
  1523.    
  1524.     if ((pid=fork())==0){
  1525.         HistProcesosBorrar();
  1526.         printf ("ejecutando proceso %d\n", getpid());
  1527.     }
  1528.     else if (pid!=-1)
  1529.         waitpid (pid,NULL,0);
  1530. }
  1531.  
  1532. int ValorSenal(char * sen)  /*devuelve el numero de senial a partir del nombre*/
  1533. {
  1534.   int i;
  1535.   for (i=0; sigstrnum[i].nombre!=NULL; i++)
  1536.     if (!strcmp(sen, sigstrnum[i].nombre))
  1537.         return sigstrnum[i].senal;
  1538.   return -1;
  1539. }
  1540.  
  1541.  
  1542. char *NombreSenal(int sen)  /*devuelve el nombre senal a partir de la senal*/
  1543. {           /* para sitios donde no hay sig2str*/
  1544.  int i;
  1545.   for (i=0; sigstrnum[i].nombre!=NULL; i++)
  1546.     if (sen==sigstrnum[i].senal)
  1547.         return sigstrnum[i].nombre;
  1548.  return ("SIGUNKNOWN");
  1549. }
  1550.  
  1551. void cmdListJobs(){
  1552.     int i;
  1553.     int status;
  1554.     for(i=0;i<nprocesos;i++){
  1555.         waitpid(HistProcesosElemento(i)->PID,&status,WNOHANG);
  1556.         if(WIFEXITED(status)){
  1557.             strcpy(HistProcesosElemento(i)->status,"FINISHED");
  1558.             HistProcesos[i]->prioridad=-1;
  1559.         }else if(WIFSIGNALED(status)){
  1560.             strcpy(HistProcesosElemento(i)->status,"SIGNALED");
  1561.             HistProcesos[i]->prioridad=-1;
  1562.         }else if(WIFSTOPPED(status)){
  1563.             strcpy(HistProcesosElemento(i)->status,"STOPPED");
  1564.         }else if(WIFCONTINUED(status)){
  1565.             strcpy(HistProcesosElemento(i)->status,"ACTIVE");
  1566.         }
  1567.         printf("%d \t %s p=%d  %s  %d  %d:%02d  %s  (%d)  %s\n",HistProcesosElemento(i)->PID,HistProcesosElemento(i)->usuario, HistProcesos[i]->prioridad,nombreMes(HistProcesosElemento(i)->month), HistProcesosElemento(i)->dia, HistProcesosElemento(i)->hora, HistProcesosElemento(i)->min, HistProcesosElemento(i)->status, HistProcesosElemento(i)->senal,HistProcesosElemento(i)->nombre);
  1568.         }
  1569.        
  1570.         printf("Nombre de la senal 000 es %s\n",NombreSenal(000));
  1571.    
  1572.     }
  1573.    
  1574. const char * Ejecutable(const char* file){
  1575.     char destino[20] = "/usr/bin/";
  1576.     char *destinos[] = {destino};
  1577.     strcat(destino,file);
  1578.     return destinos[0];
  1579. }
  1580.    
  1581. void OurExecvpe(const char *file, char *const argv[], char *const envp[])
  1582. {
  1583.     if( (execve(Ejecutable(file),argv, envp)==-1) ){
  1584.        perror("Imposible ejecutar: ");
  1585.        };
  1586. }
  1587.  
  1588. void cmdExecute(){
  1589.     int i,j;
  1590.     char* argv[TAMANO];
  1591.     char* envp[TAMANO];
  1592.     char x[TAMANO];
  1593.     char y[TAMANO];
  1594.     char entorno[TAMANO];
  1595.     bool flagEntorno=true;
  1596.     int var,cont=1;
  1597.  
  1598.     strcpy(x,getenv("XAUTHORITY"));
  1599.     strcpy(y,"XAUTHORITY=");
  1600.     strcat(y,x);
  1601.    
  1602.     if(numtrozos==2){
  1603.         envp[0]= (char *)"DISPLAY=:0.0";
  1604.         envp[1]=(char *)y;
  1605.         envp[2]=NULL;
  1606.        
  1607.         argv[0]= trozos[1];
  1608.         argv[1]= NULL;
  1609.     }else{
  1610.         if(!isupper(trozos[1][0])){
  1611.            
  1612.         envp[0]= (char *)"DISPLAY=:0.0";
  1613.         envp[1]=(char *)y;
  1614.         envp[2]=NULL;
  1615.            
  1616.         flagEntorno=false;
  1617.         argv[0]=trozos[1];
  1618.         for(i=2;i<numtrozos && i<20;i++){
  1619.             if(trozos[i][0]!='@'){
  1620.             argv[i-1]=trozos[i];
  1621.               }
  1622.             }
  1623.             argv[i-1]=NULL;
  1624.         }else{
  1625.            
  1626.             for(i=1;i<numtrozos;i++){
  1627.                 for(j=0;j<strlen(trozos[i])-1 && isupper(trozos[i][j]);j++);
  1628.                
  1629.                 if(j+1==strlen(trozos[i])){
  1630.                     strcpy(entorno,trozos[i]);
  1631.                     strcat(entorno,"=");
  1632.                    
  1633.                     strcat(entorno,getenv(trozos[i]));
  1634.                    
  1635.                     envp[i-1]=malloc(100);
  1636.                     strcpy(envp[i-1],entorno);
  1637.  
  1638.                 }else break;
  1639.             }
  1640.             envp[i-1]=NULL;
  1641.            
  1642.            
  1643.            
  1644.         argv[0]=malloc(100);
  1645.         strcpy(argv[0],trozos[i]);
  1646.  
  1647.        
  1648.         var=i;
  1649.         for(i=i+1;i<numtrozos && i<20;i++){
  1650.             if(trozos[i][0]!='@'){
  1651.             argv[cont]=malloc(100);
  1652.             strcpy(argv[cont],trozos[i]);
  1653.            
  1654.             cont++;
  1655.               }
  1656.             }
  1657.             if(var+1==numtrozos){
  1658.             argv[var-1]=NULL;
  1659.             } else argv[i-2]=NULL;
  1660.            
  1661.            
  1662.            
  1663.            
  1664.             }  
  1665.         }
  1666.        
  1667.         for(i = 1; i < numtrozos && trozos[i][0] != '@' ; i++);
  1668.             if(i<numtrozos){
  1669.             if(trozos[i][0] == '@'){
  1670.                 char *prioridad;
  1671.                 int prioridadint;
  1672.                 prioridad = trozos[i] + 1;
  1673.                 prioridadint= atoi(prioridad);
  1674.                 setpriority(PRIO_PROCESS,getpid(),prioridadint); //getpid() o 0
  1675.                 }
  1676.             }
  1677.            
  1678.            
  1679.            
  1680.            
  1681.     if(flagEntorno==false){
  1682.     OurExecvpe(trozos[1],argv,envp);
  1683.     }else {
  1684.         OurExecvpe(argv[0],argv,envp);
  1685.         }
  1686.     for(i=0;i<TAMANO;i++){
  1687.         free(envp[i]);      //Liberar
  1688.         }
  1689.        
  1690. }
  1691.  
  1692.  
  1693. //Comando ayuda
  1694. void cmdAyuda() {
  1695.     if (numtrozos == 1) {
  1696.         printf("'ayuda cmd' donde cmd es uno de los siguientes comandos:\n"
  1697.                "fin salir bye fecha pid autores hist comando carpeta infosis ayuda\n");
  1698.     } else if (numtrozos > 1 && strcmp(trozos[1], "fin") == 0) {
  1699.         printf("fin \tTermina la ejecucion del shell\n");
  1700.     } else if (numtrozos > 1 && strcmp(trozos[1], "salir") == 0) {
  1701.         printf("salir \tTermina la ejecucion del shell\n");
  1702.     } else if (numtrozos > 1 && strcmp(trozos[1], "bye") == 0) {
  1703.         printf("bye \tTermina la ejecucion del shell\n");
  1704.     } else if (numtrozos > 1 && strcmp(trozos[1], "fecha") == 0) {
  1705.         printf("fecha [-d|.h\tMuestra la fecha y o la hora actual\n");
  1706.     } else if (numtrozos > 1 && strcmp(trozos[1], "pid") == 0) {
  1707.         printf("pid [-p]\tMuestra el pid del shell o de su proceso padre\n");
  1708.     }else if (numtrozos > 1 && strcmp(trozos[1], "autores") == 0) {
  1709.         printf("autores [-n|-l]\tMuestra los nombres y logins de los autores\n");
  1710.     }else if (numtrozos > 1 && strcmp(trozos[1], "hist") == 0) {
  1711.         printf("hist [-c|-N]\tMuestra el historico de comandos, con -c lo borra\n");
  1712.     }else if (numtrozos > 1 && strcmp(trozos[1], "comando") == 0) {
  1713.         printf("comando [-N]\tRepite el comando N (del historico)\n");
  1714.     }else if (numtrozos > 1 && strcmp(trozos[1], "carpeta") == 0) {
  1715.         printf("carpeta [dir]\tCambia (o muestra) el directorio actual del shell\n");
  1716.     }else if (numtrozos > 1 && strcmp(trozos[1], "carpeta") == 0) {
  1717.         printf("infosis \tMuestra informacion de la maquina donde corre el shell\n");
  1718.     }else if (numtrozos > 1 && strcmp(trozos[1], "ayuda") == 0) {
  1719.         printf("ayuda [cmd]\tMuestra ayuda sobre los comandos\n");
  1720.     }else if (numtrozos > 1 && strcmp(trozos[1], "create") == 0) {
  1721.         printf("create [-f] [name]  Crea un directorio o un fichero (-f)\n");
  1722.     }else if (numtrozos > 1 && strcmp(trozos[1], "stat") == 0) {
  1723.         printf("stat [-long][-link][-acc] name1 name2 ..    lista ficheros;\n-long: listado largo\n-acc: acesstime\n-link: si es enlace simbolico, el path contenido\n");
  1724.     }else if (numtrozos > 1 && strcmp(trozos[1], "list") == 0) {
  1725.         printf("list [-reca] [-recb] [-hid][-long][-link][-acc] n1 n2 ..    lista contenidos de directorios\n-hid: incluye los ficheros ocultos\n-reca: recursivo (antes)\n-recb: recursivo (despues)\nresto parametros como stat\n");
  1726.     }else if (numtrozos > 1 && strcmp(trozos[1], "delete") == 0) {
  1727.         printf("delete [name1 name2 ..] Borra ficheros o directorios vacios\n");
  1728.     }else if (numtrozos > 1 && strcmp(trozos[1], "deltree") == 0) {
  1729.         printf("deltree [name1 name2 ..]    Borra ficheros o directorios no vacios recursivamente\n");
  1730.     }
  1731. }
  1732.  
  1733. struct cm_entrada{
  1734.     char *cm_nombre;
  1735.     void (*cm_fun)();
  1736. };
  1737.  
  1738. struct cm_entrada cm_tabla[] = {
  1739.     {"autores", cmdAutores},
  1740.     {"ayuda", cmdAyuda},
  1741.     {"bye", cmdFin},
  1742.     {"carpeta", cmdCarpeta},
  1743.     {"comando", cmdComandoN},
  1744.     {"create", cmdCreate},
  1745.     {"delete", cmdDelete},
  1746.     {"fecha", cmdFecha},
  1747.     {"fin", cmdFin},
  1748.     {"hist", cmdHist},
  1749.     {"infosis", cmdInfosis},
  1750.     {"pid", cmdPid},
  1751.     {"salir", cmdFin},
  1752.     {"stat", cmdStat},
  1753.     {"list", cmdList},
  1754.     {"allocate",cmdAllocate},
  1755.     {"deallocate",cmdDeallocate},
  1756.     {"memdump",cmdMemdump},
  1757.     {"recurse",cmdRecurse},
  1758.     {"memory",cmdMemory},
  1759.     {"memfill",cmdMemfill},
  1760.     {"i-o",cmdIo},
  1761.     {"fork",cmdFork},
  1762.     {"listjobs",cmdListJobs},
  1763.     {"execute",cmdExecute},
  1764.     //Actualizar número en función de abajo (Actual 25)
  1765. };
  1766.  
  1767. void comprobarSiEsta(char *linea){
  1768.     int i,j;
  1769.     int pid;
  1770.     int status;
  1771.     time_t t = time(NULL);
  1772.     struct tm tm = *localtime(&t);
  1773.     uid_t uid = geteuid();
  1774.     struct passwd *pws = getpwuid(uid);
  1775.    
  1776.     char aux[TAMANO], aux2[TAMANO];
  1777.     char *prioridad;
  1778.     int prioridadint;
  1779.    
  1780.                
  1781.    
  1782.     pid=fork();
  1783.     pidglobal=pid;
  1784.    
  1785.     char *copialinea = strdup(linea);
  1786.     numtrozos = TrocearCadena(copialinea, trozos);
  1787.    
  1788.     for(i=0;i<25 && strcmp(cm_tabla[i].cm_nombre, trozos[0]) != 0;i++);
  1789.    
  1790.     if(pid==0){
  1791.         if(i<25){
  1792.             if(strcmp(trozos[0],"execute")!=0){
  1793.             ejecutarComando(linea);
  1794.         }
  1795.            
  1796.         }else{
  1797.             if(strcmp(trozos[numtrozos-1],"&")!=0){
  1798.             //Programar *****
  1799.             trozos[numtrozos]=malloc(1000); //Hacer free
  1800.            
  1801.             for(i=1;i<numtrozos+1;i++){
  1802.                 if(i==1){
  1803.                     strcpy(aux,trozos[1]);
  1804.                    
  1805.                    
  1806.                     trozos[1]=malloc(TAMANO);
  1807.                     strcpy(trozos[1],trozos[0]);//AQUÍ
  1808.                    
  1809.                     }else{
  1810.                         if(i%2==0){
  1811.                             strcpy(aux2,trozos[i]);
  1812.                            
  1813.                             trozos[i]=malloc(TAMANO);
  1814.                             strcpy(trozos[i],aux);
  1815.                            
  1816.                             }else{
  1817.                                 strcpy(aux,trozos[i]);
  1818.                                
  1819.                                 trozos[i]=malloc(TAMANO);
  1820.                                 strcpy(trozos[i],aux2);
  1821.                                
  1822.                                 }
  1823.                        
  1824.                         }
  1825.             }numtrozos++; //Aumentar trozos
  1826.            
  1827.             cmdExecute();
  1828.         }else{
  1829.            
  1830.             numtrozos--;
  1831.             //Con &
  1832.             //Programar *****
  1833.             trozos[numtrozos]=malloc(1000); //Hacer free
  1834.            
  1835.             for(i=1;i<numtrozos+1;i++){
  1836.                 if(i==1){
  1837.                     strcpy(aux,trozos[1]);
  1838.                    
  1839.                    
  1840.                     trozos[1]=malloc(TAMANO);
  1841.                     strcpy(trozos[1],trozos[0]);//AQUÍ
  1842.                    
  1843.                     }else{
  1844.                         if(i%2==0){
  1845.                             strcpy(aux2,trozos[i]);
  1846.                            
  1847.                             trozos[i]=malloc(TAMANO);
  1848.                             strcpy(trozos[i],aux);
  1849.                            
  1850.                             }else{
  1851.                                 strcpy(aux,trozos[i]);
  1852.                                
  1853.                                 trozos[i]=malloc(TAMANO);
  1854.                                 strcpy(trozos[i],aux2);
  1855.                                
  1856.                                 }
  1857.                        
  1858.                         }
  1859.             }numtrozos++; //Aumentar trozos
  1860.            
  1861.             cmdExecute();
  1862.            
  1863.            
  1864.            
  1865.             }
  1866.         exit(0);
  1867.             }      
  1868.     }else{
  1869.        
  1870.         if(strcmp(trozos[0],"execute")==0){
  1871.             ejecutarComando(linea);
  1872.             waitpid(-1,&status,0);
  1873.         }
  1874.        
  1875.         if(strcmp(trozos[numtrozos-1],"&")==0){
  1876.             //
  1877.             for(i=0;i<numtrozos && isupper(trozos[i][0]);i++);
  1878.             for(j=0;j<numtrozos && trozos[i][0]!='@';j++);
  1879.             if(j==numtrozos){
  1880.                 histProcesoInsert(getpid(),tm.tm_mon + 1,tm.tm_mday,tm.tm_hour,tm.tm_min,"ACTIVE",ValorSenal("CONT"),pws->pw_name, trozos[i],0);
  1881.             }else{
  1882.                 prioridad = trozos[i] + 1;
  1883.                 prioridadint= atoi(prioridad);
  1884.                 histProcesoInsert(getpid(),tm.tm_mon + 1,tm.tm_mday,tm.tm_hour,tm.tm_min,"ACTIVE",ValorSenal("CONT"),pws->pw_name, trozos[i],prioridadint);
  1885.             }
  1886.             //
  1887.             waitpid(pid,&status,WNOHANG);
  1888.         }else{
  1889.         waitpid(-1,&status,0);
  1890.         }
  1891.        
  1892.     }
  1893.    
  1894.    
  1895.     free(copialinea);
  1896.     if(pid==0){
  1897.         exit(0);
  1898.         }
  1899.     }
  1900.  
  1901. void ejecutarComando(char *linea){
  1902.     int i;
  1903.    
  1904.  
  1905.     if(numtrozos == 0) {return;}
  1906.     for( i=0; ; i++){
  1907.         if(cm_tabla[i].cm_nombre == NULL){
  1908.             printf("%s: comando no reconocido\n", trozos[0]);
  1909.             break;
  1910.         }
  1911.         if(strcmp(cm_tabla[i].cm_nombre, trozos[0]) == 0){
  1912.             cm_tabla[i].cm_fun();
  1913.             break;
  1914.         }
  1915.     }
  1916. }
  1917.  
  1918. int main(){
  1919.  
  1920.     while(1){
  1921.         printf("%d @>",pidglobal);       //Prompt
  1922.         if( fgets(linea, 4096, stdin) == NULL ){
  1923.             exit(0);
  1924.         }
  1925.         comprobarSiEsta(linea);
  1926.         histInsert(linea);
  1927.     }
  1928.     for(int i=0; i < nhist; i++){
  1929.         free(Hist[i]);
  1930.     }
  1931.     for(int i=0; i < nbloq; i++){
  1932.         free(histBloqElemento(i)->dir);
  1933.         free(HistBloq[i]);
  1934.     }
  1935.     for(int i=0; i < nshared; i++){
  1936.         free(histSharedElemento(i)->dir);
  1937.         free(HistShared[i]);
  1938.     }
  1939.     for(int i=0; i < nmmap; i++){
  1940.         free(histMmapElemento(i)->dir);
  1941.         free(HistMmap[i]);
  1942.     }
  1943.     HistProcesosBorrar();
  1944.    
  1945.     for(int i=0;i<MaxTrozos;i++){
  1946.                 free (trozos[i]);
  1947.             }
  1948. }
  1949.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement