Advertisement
techno-

p2 con deallocate SO

Nov 16th, 2022
91
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 33.57 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 "ListaHistorial.h"
  23. #include "ListaBloques.h"
  24. #include "ListaShared.h"
  25. #include "ListaMmap.h"
  26.  
  27. #define MaxTrozos 512
  28. #define MaxHist 4096
  29. #define TAMANO 2048
  30.  
  31. char linea[4096];
  32. char *trozos[MaxTrozos];
  33. int numtrozos;
  34.  
  35. int EntraEnBloque=0;
  36. int EntraEnShared=0;
  37. int EntraEnMmap=0;
  38.  
  39. void ejecutarComando(char *linea);
  40.  
  41. int TrocearCadena(char * cadena, char * trozos[]){
  42.     int i=1;
  43.     if ((trozos[0]=strtok(cadena," \n\t"))==NULL)
  44.     return 0;
  45.     while ((trozos[i]=strtok(NULL," \n\t"))!=NULL)
  46.         i++;
  47.     return i;
  48. }
  49.  
  50.  
  51. //Comandos del shell
  52.  
  53. //Comando autores
  54. void cmdAutores(){
  55.  
  56.     char flagLogin= 1, flagNombre=1;
  57.  
  58.     if(numtrozos > 1 && strcmp(trozos[1], "-l") == 0)
  59.         flagNombre= 0;
  60.     if(numtrozos > 1 && strcmp(trozos[1], "-n") == 0)
  61.         flagLogin = 0;
  62.  
  63.     if(flagLogin){
  64.         printf("Login: j.loureirop\n");
  65.         printf("Login: javier.sobrino\n");
  66.     }
  67.     if(flagNombre){
  68.         printf("Nombre: Javier Loureiro\n");
  69.         printf("Nombre: Javier Sobrino\n");
  70.     }
  71. }
  72.  
  73. //Comando Fin (sale del shell)
  74. void cmdFin(){
  75.     exit(0);
  76. }
  77.  
  78. //Comando Pid
  79. void cmdPid(){
  80.  
  81.     if(numtrozos == 1)
  82.         printf("Pid del shell: %d\n", getpid());
  83.     else if (numtrozos > 1)
  84.         printf("Pid del padre del shell: %d\n", getppid());
  85. }
  86.  
  87.  
  88. //Comando Carpeta
  89. void cmdCarpeta(){
  90.     char ruta[PATH_MAX];
  91.  
  92.     if(numtrozos == 1){
  93.         if(getcwd(ruta, PATH_MAX) == NULL){
  94.             perror("getcwd");
  95.             return;
  96.         }
  97.         else{
  98.             printf("%s\n", ruta);
  99.             return;
  100.         }
  101.     }
  102.     else if(numtrozos > 1){
  103.         if (chdir(trozos[1]) == -1) {perror("chdir"); return;}
  104.         else
  105.             chdir(trozos[1]);
  106.     }
  107. }
  108.  
  109. //Comando comandoN
  110. void cmdComandoN(){
  111.     int n;
  112.  
  113.     if(numtrozos == 1) {printf("Falta número de comando \n"); return;}
  114.     n = atoi(trozos[1]);
  115.  
  116.     if(n < 0 || n >= histNumElementos()) {printf("Número de comando fuera de rango \n"); return;}
  117.     else {
  118.         printf(" %s",histElemento(n));
  119.     }
  120. }
  121.  
  122. //Comando fecha
  123. void cmdFecha(){
  124.  
  125.     struct tm *t;
  126.     time_t tiempo;
  127.  
  128.     if(time(&tiempo) == -1) {perror("time"); return;}
  129.     t = localtime(&tiempo);
  130.  
  131.     if(numtrozos > 1 && strcmp(trozos[1], "-d") == 0)
  132.         printf("%d/%d/%d\n", t->tm_mday, t->tm_mon, t->tm_year+1900);
  133.     else if(numtrozos > 1 && strcmp(trozos[1], "-h") == 0)
  134.         printf("%d:%d:%d\n", t->tm_hour, t->tm_min, t->tm_sec);
  135.     else{
  136.         printf("%d:%d:%d\n", t->tm_hour, t->tm_min, t->tm_sec);
  137.         printf("%d/%d/%d\n", t->tm_mday, t->tm_mon, t->tm_year+1900);
  138.     }
  139.  
  140. }
  141.  
  142. //Comando historial
  143. void histImprimeN(){
  144.     int i;
  145.  
  146.     for(i = 0; i <= trozos[1][1] - 48; i++){
  147.         printf("%d->%s", i, histElemento(i));
  148.     }
  149. }
  150.  
  151. void cmdHist(){
  152.     int i;
  153.  
  154.     if(numtrozos == 1){
  155.         for(i = 0; i < histNumElementos() ; i++){
  156.         printf("%d->%s", i, histElemento(i));
  157.         }
  158.     }
  159.     else if(numtrozos > 1 && strcmp(trozos[1], "-c") == 0){
  160.         histBorrar();
  161.         return;
  162.     }
  163.     else if(numtrozos > 1)
  164.         histImprimeN();
  165. }
  166.  
  167. //Comando infosis
  168. void cmdInfosis(){
  169.     struct utsname system;
  170.     uname(&system);
  171.  
  172.     printf("%s (%s), OS: %s %s-%s\n", system.nodename, system.machine, system.sysname,
  173.                                                                 system.release, system.version);
  174. }
  175.  
  176. /*PRACTICA 1*/
  177.  
  178. //Comando create
  179. void cmdCreate(){
  180.     char ruta[PATH_MAX];
  181.     if (numtrozos==1){
  182.         getcwd(ruta, PATH_MAX);
  183.         printf("%s\n", ruta);
  184.         return;
  185.     }else if(numtrozos==2){
  186.         if(strcmp(trozos[1],"-f")==0){
  187.         getcwd(ruta, PATH_MAX);
  188.         printf("%s\n", ruta);
  189.         return;
  190.         }else{
  191.         mkdir(trozos[1],0777);
  192.         if(errno != 0){
  193.         printf("Imposible crear: %s\n",strerror(errno));
  194.         }
  195.     }
  196.  
  197.     }else if(numtrozos==3){
  198.         if(strcmp(trozos[1], "-f")==0){
  199.         getcwd(ruta, PATH_MAX);
  200.         strcat(ruta,"/");
  201.         strcat(ruta,trozos[2]);
  202.  
  203.         FILE *fp;
  204.         fp = fopen(trozos[2],"w");
  205.         if(fp != NULL){
  206.         fclose(fp);
  207.         }
  208.         if(errno != 0){
  209.         printf("Imposible crear: %s\n",strerror(errno));
  210.         }
  211.  
  212.       }
  213.     }
  214.  
  215. }
  216. //Comando borrar
  217.  
  218. void cmdDelete(){
  219.     int i;
  220.     for(i=1;i<numtrozos;i++){
  221.  
  222.         if(errno != 0){
  223.         printf("%s\n",strerror(errno));
  224.         }
  225.         remove(trozos[i]);
  226.         if(errno != 0){
  227.         printf("%s\n",strerror(errno));
  228.         }
  229.         }
  230.  
  231.     }
  232.  
  233.  
  234.  
  235. //
  236.  
  237.  
  238. void st_mode_to_str(mode_t st_mode, char *mode){
  239.     mode[0]= ' '; //(S_ISDIR(fileStat.st_mode)) ? 'd' : '-';
  240.     mode[1]= (st_mode & S_IRUSR) ? 'r' : '-';
  241.     mode[2]= (st_mode & S_IWUSR) ? 'w' : '-';
  242.     mode[3]= (st_mode & S_IXUSR) ? 'x' : '-';
  243.     mode[4]= (st_mode & S_IRGRP) ? 'r' : '-';
  244.     mode[5]= (st_mode & S_IWGRP) ? 'w' : '-';
  245.     mode[6]= (st_mode & S_IXGRP) ? 'x' : '-';
  246.     mode[7]= (st_mode & S_IROTH) ? 'r' : '-';
  247.     mode[8]= (st_mode & S_IWOTH) ? 'w' : '-';
  248.     mode[9]= (st_mode & S_IXOTH) ? 'x' : '-';
  249.     mode[10]= 0;
  250.     }
  251.  
  252. //Comando stat
  253. void cmdStat(){
  254.  
  255.     struct stat *statbuf;
  256.     statbuf = malloc(sizeof(struct stat));
  257.  
  258.  
  259.     char ruta[PATH_MAX];
  260.     int flagLong=0, flagAcc=0, flagLink=0; //flags para detectar las opciones que se pasan
  261.     struct passwd *pws; //Id dispositivo
  262.     struct group *grp; //Id grupo
  263.     struct tm dtc, dta;
  264.  
  265.     //Introducen stat
  266.     if (numtrozos == 1)
  267.         cmdCarpeta();
  268.  
  269.     //Introducen stat (algo)
  270.     if(numtrozos == 2){
  271.  
  272.         getcwd(ruta, PATH_MAX);
  273.         strcat(ruta, "/");
  274.         strcat(ruta, trozos[1]);
  275.  
  276.         if(lstat(ruta, statbuf)== -1){
  277.             printf("Ha habido un error: %s\n", strerror(errno));
  278.         }
  279.         else{
  280.             printf("%ld %s\n", statbuf->st_size, trozos[1]);
  281.         }
  282.     }
  283.  
  284.     if(numtrozos>2){
  285.         //Obtenemos los flags que se pasan
  286.         for(int i = 1; i < numtrozos && trozos[i][0] == '-' ; i++){
  287.             if(strcmp(trozos[i], "-long") == 0) flagLong = 1;
  288.             else if(strcmp(trozos[i],"-link") == 0) flagLink = 1;
  289.             else if(strcmp(trozos[i], "-acc") == 0) flagAcc = 1;
  290.         }
  291.  
  292.         getcwd(ruta, PATH_MAX);
  293.         strcat(ruta, "/");
  294.         strcat(ruta, trozos[numtrozos-1]);
  295.  
  296.         if(lstat(ruta, statbuf)== -1){
  297.             printf("Ha habido un error: %s\n", strerror(errno));
  298.         }
  299.         else{
  300.             pws = getpwuid(statbuf->st_uid);
  301.             grp = getgrgid(statbuf->st_gid);
  302.  
  303.             dtc = *(gmtime(&statbuf->st_ctime));
  304.             dta = *(gmtime(&statbuf->st_atime));
  305.  
  306.  
  307.             if(flagAcc == 1 && flagLong==0){
  308.                 printf("%d/%d/%d-%d:%.2d  ", dta.tm_year + 1900, dta.tm_mon+1, dta.tm_mday,
  309.                 dta.tm_hour+2, dta.tm_min);
  310.             }
  311.             if(flagLong==1){
  312.                 //strmode(st_mode, statbuf->st_mode);
  313.                 char mode[11];
  314.                 st_mode_to_str(statbuf->st_mode,mode);
  315.                 printf("%d/%d/%d-%d:%.2d %ld, ( %ld)    %s %s %s ", dtc.tm_year + 1900, dtc.tm_mon+1, dtc.tm_mday,
  316.                 dtc.tm_hour+2, dtc.tm_min,statbuf->st_nlink, statbuf->st_ino, pws->pw_name, grp->gr_name, mode);
  317.             }
  318.             if(flagLink==1){
  319.                 //hacer links
  320.             }
  321.             printf("%ld %s\n", statbuf->st_size, trozos[numtrozos-1]);
  322.         }
  323.     }
  324.  
  325. }
  326.  
  327.  
  328.  
  329. //Stat 2 (para list)
  330.  
  331. void cmdStat2(const char d_name[],int flagLong, int flagAcc, char ruta[], int REC){
  332.     struct stat *statbuf;
  333.     statbuf = malloc(sizeof(struct stat));
  334.  
  335.  
  336.  
  337.     struct passwd *pws; //Id dispositivo
  338.     struct group *grp; //Id grupo
  339.     struct tm dtc, dta;
  340.  
  341.  
  342.  
  343.     if(numtrozos>2){
  344.  
  345. if(REC==1){
  346.  
  347.         if(lstat(ruta, statbuf)== -1){
  348.         }
  349.         else{
  350.             pws = getpwuid(statbuf->st_uid);
  351.             grp = getgrgid(statbuf->st_gid);
  352.  
  353.             dtc = *(gmtime(&statbuf->st_ctime));
  354.             dta = *(gmtime(&statbuf->st_atime));
  355.  
  356.  
  357.             if(flagAcc == 1 && flagLong==0){
  358.                 printf("%d/%d/%d-%d:%.2d  ", dta.tm_year + 1900, dta.tm_mon+1, dta.tm_mday,
  359.                 dta.tm_hour+2, dta.tm_min);
  360.             }
  361.  
  362.             if(flagLong==1){
  363.                 //strmode(st_mode, statbuf->st_mode);
  364.                 char mode[11];
  365.                 st_mode_to_str(statbuf->st_mode,mode);
  366.                 printf("%d/%d/%d-%d:%.2d %ld, ( %ld)    %s %s %s ", dtc.tm_year + 1900, dtc.tm_mon+1, dtc.tm_mday,
  367.                 dtc.tm_hour+2, dtc.tm_min,statbuf->st_nlink, statbuf->st_ino, pws->pw_name, grp->gr_name, mode);
  368.             }
  369.             printf("%ld %s\n", statbuf->st_size, d_name);
  370.         }
  371.  
  372.       }
  373.  
  374.       else if(REC==0){
  375.  
  376.            if(lstat(d_name, statbuf)== -1){
  377.         }
  378.         else{
  379.             pws = getpwuid(statbuf->st_uid);
  380.             grp = getgrgid(statbuf->st_gid);
  381.  
  382.             dtc = *(gmtime(&statbuf->st_ctime));
  383.             dta = *(gmtime(&statbuf->st_atime));
  384.  
  385.  
  386.             if(flagAcc == 1 && flagLong==0){
  387.                 printf("%d/%d/%d-%d:%.2d  ", dta.tm_year + 1900, dta.tm_mon+1, dta.tm_mday,
  388.                 dta.tm_hour+2, dta.tm_min);
  389.             }
  390.  
  391.             if(flagLong==1){
  392.                 //strmode(st_mode, statbuf->st_mode);
  393.                 char mode[11];
  394.                 st_mode_to_str(statbuf->st_mode,mode);
  395.                 printf("%d/%d/%d-%d:%.2d %ld, ( %ld)    %s %s %s ", dtc.tm_year + 1900, dtc.tm_mon+1, dtc.tm_mday,
  396.                 dtc.tm_hour+2, dtc.tm_min,statbuf->st_nlink, statbuf->st_ino, pws->pw_name, grp->gr_name, mode);
  397.             }
  398.             printf("%ld %s\n", statbuf->st_size, ruta);
  399.         }
  400.  
  401.           }
  402.     }
  403.  
  404. }
  405.  
  406.  
  407. void cmdListaREC(const char *dirname,int fun, int flagHid, int flagLong){
  408.     if(fun==0){
  409.  
  410.     DIR* dir = opendir(dirname);
  411.  
  412.     struct dirent* dirent;
  413.     dirent = readdir(dir);
  414.     char path[100];
  415.  
  416.  
  417.  
  418.  
  419.   if (dir == NULL) {
  420.         return;
  421.     }
  422.  
  423.     printf("************%s\n",dirname);
  424.  
  425.  
  426.     while (dirent != NULL) {
  427.         strcpy(path, dirname);
  428.         strcat(path, "/");
  429.         strcat(path, dirent->d_name);
  430.  
  431.         if(dirent->d_name[0] != '.' || flagHid == 1){
  432.             if(flagLong==1){
  433.                 cmdStat2(dirent->d_name,1,1,path,1);
  434.                 }else{
  435.                     printf("%hhd %s\n", dirent->d_type, dirent->d_name);
  436.                     }
  437.         }
  438.  
  439.         dirent = readdir(dir);
  440.     }
  441.  
  442.     closedir(dir);
  443.  
  444.  
  445.     dir = opendir(dirname);
  446.     if (dir == NULL) {
  447.         return;
  448.     }
  449.  
  450.  
  451.     dirent = readdir(dir);
  452.     while (dirent != NULL) {
  453.  
  454.  
  455.  
  456.        if (dirent->d_type == DT_DIR && strcmp(dirent->d_name, ".") != 0 && strcmp(dirent->d_name, "..") != 0 && (dirent->d_name[0] != '.'|| flagHid==1)){
  457.  
  458.            char path[100];
  459.             strcpy(path, dirname);
  460.             strcat(path, "/");
  461.             strcat(path, dirent->d_name);
  462.             cmdListaREC(path,0,flagHid,flagLong);
  463.         }
  464.         dirent = readdir(dir);
  465.     }
  466.  
  467.     closedir(dir);
  468.  
  469.     }
  470.  
  471.     else if (fun==1){
  472.  
  473.  
  474.  
  475.     DIR* dir = opendir(dirname);
  476.  
  477.     struct dirent* dirent;
  478.     dirent = readdir(dir);
  479.  
  480.  
  481.     if (dir == NULL) {
  482.         return;
  483.     }
  484.  
  485.  
  486.     while (dirent != NULL) {
  487.  
  488.         if (dirent->d_type == DT_DIR && strcmp(dirent->d_name, ".") != 0 && strcmp(dirent->d_name, "..") != 0 && (dirent->d_name[0] != '.' || flagHid ==1)) {
  489.             char path[100];
  490.             printf("************%s/%s\n",dirname,dirent->d_name);
  491.             strcpy(path, dirname);
  492.             strcat(path, "/");
  493.             strcat(path, dirent->d_name);
  494.             cmdListaREC(path,1,flagHid,flagLong);
  495.             printf("************%s\n",dirname);
  496.         }
  497.  
  498.         dirent = readdir(dir);
  499.     }
  500.  
  501.     closedir(dir);
  502.  
  503.  
  504.     dir = opendir(dirname);
  505.     if (dir == NULL) {
  506.         return;
  507.     }
  508.  
  509.  
  510.     dirent = readdir(dir);
  511.     while (dirent != NULL) {
  512.         char path[100];
  513.         strcpy(path, dirname);
  514.         strcat(path, "/");
  515.         strcat(path, dirent->d_name);
  516.  
  517.        if(dirent->d_name[0] != '.' || flagHid == 1){
  518.             if(flagLong==1){
  519.                 cmdStat2(dirent->d_name,1,1,path,1);
  520.                 }else{
  521.                     printf("%hhd %s\n", dirent->d_type, dirent->d_name);
  522.                     }
  523.         }
  524.  
  525.         dirent = readdir(dir);
  526.     }
  527.  
  528.     closedir(dir);
  529.  
  530.     }
  531. }
  532.  
  533. //Comando list
  534. void cmdList(){
  535.  
  536.  
  537.     char ruta[PATH_MAX];
  538.     int flagHid=0,flagLong=0, flagAcc=0, flagReca=0, flagRecb=0; //flags para detectar las opciones que se pasan
  539.  
  540.  
  541.     DIR *d;
  542.     struct dirent *dirent;
  543.     getcwd(ruta, PATH_MAX);
  544.     strcat(ruta, "/");
  545.     strcat(ruta, trozos[numtrozos-1]);
  546.  
  547.     if(numtrozos==1)
  548.         cmdCarpeta();
  549.  
  550.     if(numtrozos==2){
  551.  
  552.  
  553.         if((d=opendir(ruta)) == NULL){perror("opendir"); return;}
  554.         printf("************%s\n",trozos[numtrozos-1]);
  555.         while((dirent = readdir(d))!= NULL){
  556.             if(dirent->d_name[0] != '.'){
  557.             printf("%s\n", dirent->d_name);
  558.         }
  559.        }
  560.     }
  561.  
  562.  
  563.     if(numtrozos>2){
  564.  
  565.  
  566.  
  567.         //Obtenemos los flags que se pasan
  568.         for(int i = 1; i < numtrozos && trozos[i][0] == '-' ; i++){
  569.             if(strcmp(trozos[i],"-hid")==0) flagHid = 1;
  570.             else if(strcmp(trozos[i], "-long") == 0) flagLong = 1;
  571.             else if(strcmp(trozos[i], "-acc") == 0) flagAcc = 1;
  572.             else if(strcmp(trozos[i], "-reca") == 0) flagReca = 1;
  573.             else if(strcmp(trozos[i], "-recb") == 0) flagRecb = 1;
  574.         }
  575.  
  576.  
  577.     if((d=opendir(ruta)) == NULL){perror("opendir"); return;}
  578.  
  579.  
  580.  
  581.         if(flagAcc==1 && flagLong==0 && flagHid==0){
  582.             printf("************%s\n",trozos[numtrozos-1]);
  583.             while((dirent = readdir(d))!= NULL){
  584.             getcwd(ruta, PATH_MAX);
  585.             strcat(ruta,"/");
  586.             strcat(ruta,trozos[numtrozos-1]);
  587.             strcat(ruta,"/");
  588.             strcat(ruta,dirent->d_name);
  589.             if(dirent->d_name[0] != '.'){
  590.             cmdStat2(ruta,0,1,dirent->d_name,0);
  591.         }
  592.        }
  593.     }//
  594.  
  595.         if(flagAcc==1 && flagLong==0 && flagHid==1){
  596.             printf("************%s\n",trozos[numtrozos-1]);
  597.             while((dirent = readdir(d))!= NULL){
  598.             getcwd(ruta, PATH_MAX);
  599.             strcat(ruta,"/");
  600.             strcat(ruta,trozos[numtrozos-1]);
  601.             strcat(ruta,"/");
  602.             strcat(ruta,dirent->d_name);
  603.             cmdStat2(ruta,0,1,dirent->d_name,0);
  604.        }
  605.     }//
  606.  
  607.         if(flagHid==1 && flagLong==0 && flagAcc==0 && flagReca==0 && flagRecb==0){
  608.             printf("************%s\n",trozos[numtrozos-1]);
  609.             while((dirent = readdir(d))!= NULL){
  610.             printf("%s\n", dirent->d_name);
  611.         }
  612.       }
  613.  
  614.       if(flagLong==1 && flagHid == 0 && flagAcc==0 && flagReca==0 && flagRecb==0){
  615.  
  616.  
  617.           printf("************%s\n",trozos[numtrozos-1]);
  618.             while((dirent = readdir(d))!= NULL){
  619.             getcwd(ruta, PATH_MAX);
  620.             strcat(ruta,"/");
  621.             strcat(ruta,trozos[numtrozos-1]);
  622.             strcat(ruta,"/");
  623.             strcat(ruta,dirent->d_name);
  624.             if(dirent->d_name[0] != '.'){
  625.             cmdStat2(ruta,1,0,dirent->d_name,0);
  626.         }
  627.        }
  628.       }
  629.  
  630.  
  631.       if(flagLong==1 && flagHid == 1 && flagReca ==0 && flagRecb==0){
  632.           printf("************%s\n",trozos[numtrozos-1]);
  633.             while((dirent = readdir(d))!= NULL){
  634.             getcwd(ruta, PATH_MAX);
  635.             strcat(ruta,"/");
  636.             strcat(ruta,trozos[numtrozos-1]);
  637.             strcat(ruta,"/");
  638.             strcat(ruta,dirent->d_name);
  639.             cmdStat2(ruta,1,0,dirent->d_name,0);
  640.        }
  641.       }
  642.  
  643.  
  644.       if(flagReca==1){
  645.         cmdListaREC(trozos[numtrozos-1],0,flagHid, flagLong);
  646.       }else if(flagRecb==1){
  647.         cmdListaREC(trozos[numtrozos-1],1,flagHid, flagLong);
  648.       }
  649.  
  650.  
  651.     }
  652. }
  653.  
  654. // PRÁCTICA 2
  655.  
  656. char * nombreMes(int mes){
  657.     static char* meses[12]={"Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"};
  658.     return meses[mes-1];
  659. }
  660.  
  661. void * ObtenerMemoriaShmget (key_t clave, size_t tam)
  662. {
  663.     void * p;
  664.     int aux,id,flags=0777;
  665.     struct shmid_ds s;
  666.     time_t t = time(NULL);
  667.     struct tm tm = *localtime(&t);
  668.  
  669.     if (tam)     /*tam distito de 0 indica crear */
  670.         flags=flags | IPC_CREAT | IPC_EXCL;
  671.     if (clave==IPC_PRIVATE)  /*no nos vale*/
  672.         {errno=EINVAL; return NULL;}
  673.     if ((id=shmget(clave, tam, flags))==-1)
  674.         return (NULL);
  675.     if ((p=shmat(id,NULL,0))==(void*) -1){
  676.         aux=errno;
  677.         if (tam)
  678.              shmctl(id,IPC_RMID,NULL);
  679.         errno=aux;
  680.         return (NULL);
  681.     }
  682.     shmctl (id,IPC_STAT,&s);
  683.     histSharedInsert(p, s.shm_segsz,tm.tm_mon + 1,tm.tm_mday,tm.tm_hour,tm.tm_min,"shared",clave);
  684.     return (p);
  685. }
  686.  
  687.  
  688. void * ObtenerMemoriaShmget2 (key_t clave, size_t tam)
  689. {
  690.     void * p;
  691.     int aux,id;
  692.     struct shmid_ds s;
  693.     time_t t = time(NULL);
  694.     struct tm tm = *localtime(&t);
  695.     if (clave==IPC_PRIVATE)  /*no nos vale*/
  696.         {
  697.         errno=EINVAL; return NULL;
  698.         }
  699.     if ((id=shmget(clave, tam, 0))==-1){
  700.         return (NULL);
  701.         }
  702.     if ((p=shmat(id,NULL,0))==(void*) -1){
  703.         aux=errno;
  704.         if (tam)
  705.              shmctl(id,IPC_RMID,NULL);
  706.         errno=aux;
  707.         return (NULL);
  708.     }
  709.     shmctl (id,IPC_STAT,&s);
  710.     histSharedInsert(p, s.shm_segsz,tm.tm_mon + 1,tm.tm_mday,tm.tm_hour,tm.tm_min,"shared",clave);
  711.     return (p);
  712. }
  713.  
  714. void * MapearFichero (char * fichero, int protection)
  715. {
  716.     int df, map=MAP_PRIVATE,modo=O_RDONLY;
  717.     struct stat s;
  718.     void *p;
  719.     time_t t = time(NULL);
  720.     struct tm tm = *localtime(&t);
  721.  
  722.     if (protection&PROT_WRITE)
  723.           modo=O_RDWR;
  724.     if (stat(fichero,&s)==-1 || (df=open(fichero, modo))==-1)
  725.           return NULL;
  726.     if ((p=mmap (NULL,s.st_size, protection,map,df,0))==MAP_FAILED)
  727.            return NULL;
  728.     histMmapInsert(p, s.st_size,tm.tm_mon + 1,tm.tm_mday,tm.tm_hour,tm.tm_min,trozos[2],df);
  729.     return p;
  730. }
  731.  
  732.  
  733. void cmdAllocate(){
  734.         int *p;
  735.         int i;
  736.         time_t t = time(NULL);
  737.         struct tm tm = *localtime(&t);
  738.  
  739.         if(numtrozos==1){
  740.             printf("******Lista de bloques asignados para el proceso %d\n", getpid());
  741.             for(i=0;i<nbloq;i++){
  742.                 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);
  743.             }
  744.             for(i=0;i<nshared;i++){
  745.                 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);
  746.             }
  747.             for(i=0;i<nmmap;i++){
  748.                 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);
  749.             }
  750.             //////////IMPRIMIR RESTO DE LISTAS
  751.         }
  752.         else if(numtrozos>1 && strcmp(trozos[1],"-malloc")==0){
  753.             if(numtrozos==2){
  754.                 printf("******Lista de bloques asignados malloc para el proceso %d\n", getpid());
  755.             for(i=0;i<nbloq;i++){
  756.                 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);
  757.              }
  758.             }
  759.             else if(strcmp(trozos[2],"0")==0){
  760.                 printf("No se asignan bloques de 0 bytes\n");
  761.             }else{
  762.                 p=malloc(atoi(trozos[2]));
  763.                 printf("Asignados %s bytes en %p\n",trozos[2],p);
  764.                 histBloqInsert(p,atoi(trozos[2]),tm.tm_mon + 1,tm.tm_mday,tm.tm_hour,tm.tm_min,"malloc");
  765.                 }
  766.         }
  767.         else if(numtrozos>1 && strcmp(trozos[1],"-createshared")==0){
  768.  
  769.         key_t cl;
  770.         size_t tam;
  771.         void *p;
  772.  
  773.         if(numtrozos==2 || numtrozos==3){
  774.             printf("******Lista de bloques asignados shared para el proceso %d\n", getpid());
  775.             for(i=0;i<nshared;i++){
  776.                 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);
  777.             }
  778.         }else{
  779.  
  780.         cl=(key_t)  strtoul(trozos[2],NULL,10);
  781.         tam=(size_t) strtoul(trozos[3],NULL,10);
  782.         if (tam==0) {
  783.             printf ("No se asignan bloques de 0 bytes\n");
  784.             return;
  785.         }
  786.         if ((p=ObtenerMemoriaShmget(cl,tam))!=NULL)
  787.             printf ("Asignados %lu bytes en %p\n",(unsigned long) tam, p);
  788.         else
  789.             printf ("Imposible asignar memoria compartida clave %lu:%s\n",(unsigned long) cl,strerror(errno));
  790.     }
  791. }
  792.  
  793.         else if(numtrozos>1 && strcmp(trozos[1],"-shared")==0){
  794.  
  795.             if(numtrozos==2){
  796.             printf("******Lista de bloques asignados shared para el proceso %d\n", getpid());
  797.             for(i=0;i<nshared;i++){
  798.                 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);
  799.             }
  800.         }else{
  801.  
  802.         key_t cl;
  803.         size_t tam;
  804.         void *p;
  805.  
  806.         for(i=0;i<nshared && histSharedElemento(i)->key!=atoi(trozos[2]);i++);
  807.  
  808.  
  809.         cl=(key_t)  strtoul(trozos[2],NULL,10);
  810.         tam=(size_t) (i<nshared) ? histSharedElemento(i)->Bytes : 10;
  811.         if (tam==0) {
  812.             printf ("No se asignan bloques de 0 bytes\n");
  813.             return;
  814.         }
  815.  
  816.         if ((p=ObtenerMemoriaShmget2(cl,tam))!=NULL)
  817.             printf ("Memoria compartida de clave %d en %p\n",histSharedElemento(i)->key, p);
  818.         else
  819.             printf ("Imposible asignar memoria compartida clave %lu:%s\n",(unsigned long) cl,strerror(errno));
  820.  
  821.         }
  822.     }
  823.  
  824.     else if(numtrozos>1 && strcmp(trozos[1],"-mmap")==0){
  825.  
  826.     if(numtrozos==2 || numtrozos==3){
  827.             printf("******Lista de bloques asignados mmap para el proceso %d\n", getpid());
  828.             for(i=0;i<nmmap;i++){
  829.                 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);
  830.             }
  831.     }else{
  832.  
  833.      char *perm;
  834.      void *p;
  835.      int protection=0;
  836.  
  837.      if ((perm=trozos[3])!=NULL && strlen(perm)<4) {
  838.             if (strchr(perm,'r')!=NULL) protection|=PROT_READ;
  839.             if (strchr(perm,'w')!=NULL) protection|=PROT_WRITE;
  840.             if (strchr(perm,'x')!=NULL) protection|=PROT_EXEC;
  841.      }
  842.      if ((p=MapearFichero(trozos[2],protection))==NULL)
  843.              perror ("Imposible mapear fichero");
  844.      else
  845.              printf ("fichero %s mapeado en %p\n", trozos[2], p);
  846.  
  847.         }
  848.     }
  849. }
  850.  
  851. void do_DeallocateDelkey (char *key)
  852. {
  853.    key_t clave;
  854.    int id;
  855.  
  856.  
  857.    if (key==NULL || (clave=(key_t) strtoul(key,NULL,10))==IPC_PRIVATE){
  858.         printf ("      delkey necesita clave_valida\n");
  859.         return;
  860.    }
  861.    if ((id=shmget(clave,0,0666))==-1){
  862.         perror ("shmget: imposible obtener memoria compartida");
  863.         return;
  864.    }
  865.    if (shmctl(id,IPC_RMID,NULL)==-1)
  866.         perror ("shmctl: imposible eliminar memoria compartida\n");
  867. }
  868.  
  869. void cmdDeallocate(){
  870.     int i;
  871.  
  872.         if(numtrozos==1){
  873.             printf("******Lista de bloques asignados para el proceso %d\n", getpid());
  874.             for(i=0;i<nbloq;i++){
  875.                 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);
  876.             }
  877.             for(i=0;i<nshared;i++){
  878.                 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);
  879.             }
  880.             for(i=0;i<nmmap;i++){
  881.                 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);
  882.             }
  883.             //////////IMPRIMIR RESTO DE LISTAS
  884.         }
  885.         else if(numtrozos>1 && strcmp(trozos[1],"-malloc")==0){
  886.             if(numtrozos==2){
  887.                 printf("******Lista de bloques asignados malloc para el proceso %d\n", getpid());
  888.             for(i=0;i<nbloq;i++){
  889.                 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);
  890.              }
  891.             }
  892.             else if(strcmp(trozos[2],"0")==0){
  893.                 printf("No se asignan bloques de 0 bytes\n");
  894.             }else{
  895.                 if(nbloq ==0){
  896.                     printf("No hay bloque de ese tamaño asignado con malloc\n");
  897.                 }else{
  898.                 for(i=0;i<nbloq && histBloqElemento(i)->Bytes != atoi(trozos[2]) ;i++);
  899.                 if(i>=nbloq){
  900.                     printf("No hay bloque de ese tamaño asignado con malloc\n");
  901.                 }else{
  902.                     free(histBloqElemento(i)->dir);
  903.                     for(;i<nbloq-1;i++){
  904.                         HistBloq[i] =HistBloq[i+1];
  905.                         }
  906.                         nbloq--;
  907.                     }
  908.                 }
  909.         }
  910.        
  911.         }else if(numtrozos>1 && strcmp(trozos[1],"-delkey")==0){
  912.  
  913.  
  914.         if(numtrozos==2){
  915.             printf("del_key necesita una clave válida\n");
  916.         }else{
  917.  
  918.         do_DeallocateDelkey (trozos[2]);
  919.     }
  920. }
  921.  
  922.         else if(numtrozos>1 && strcmp(trozos[1],"-shared")==0){
  923.  
  924.             if(numtrozos==2){
  925.             printf("******Lista de bloques asignados shared para el proceso %d\n", getpid());
  926.             for(i=0;i<nshared;i++){
  927.                 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);
  928.             }
  929.         }else{
  930.             if(nshared ==0){
  931.                     printf("No hay bloque de esa clave mapeado en el proceso\n");
  932.                 }else{
  933.                 for(i=0;i<nshared && histSharedElemento(i)->key != atoi(trozos[2]) ;i++);
  934.                 if(i>=nshared){
  935.                     printf("No hay bloque de esa clave mapeado en el proceso\n");
  936.                 }else{
  937.                     for(;i<nshared-1;i++){
  938.                         HistShared[i] =HistShared[i+1];
  939.                         }
  940.                         nshared--;
  941.                     }
  942.                 }
  943.        
  944.        
  945.         }
  946.     }
  947.  
  948.     else if(numtrozos>1 && strcmp(trozos[1],"-mmap")==0){
  949.  
  950.     if(numtrozos==2){
  951.             printf("******Lista de bloques asignados mmap para el proceso %d\n", getpid());
  952.             for(i=0;i<nmmap;i++){
  953.                 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);
  954.             }
  955.     }else{
  956.         if(nmmap ==0){
  957.                     printf("Fichero %s no mapeado\n",trozos[2]);
  958.                 }else{
  959.                 for(i=0;i<nmmap && strcmp(histMmapElemento(i)->nombre,trozos[2]) != 0 ;i++);
  960.                 if(i>=nmmap){
  961.                     printf("Fichero %s no mapeado\n",trozos[2]);
  962.                 }else{
  963.                     for(;i<nmmap-1;i++){
  964.                         HistMmap[i]=HistMmap[i+1];
  965.                         }
  966.                         nmmap--;
  967.                     }
  968.                 }
  969.      
  970.  
  971.         }
  972.     }
  973.     else{
  974.         int flagNoEsta=0;
  975.         EntraEnBloque=0;
  976.         EntraEnShared=0;
  977.         EntraEnMmap=0;
  978.        
  979.         if(nbloq ==0 && nshared ==0 && nmmap ==0){
  980.             printf("Direccion %s no asignada con malloc, shared o mmap\n",trozos[1]);
  981.         }else{
  982.        
  983.         if(nbloq!=0){
  984.         EntraEnBloque=1;
  985.        
  986.         char comp[20];
  987.         sprintf(comp,"%p",histBloqElemento(0)->dir);
  988.        
  989.         for(i=0;i<nbloq && strcmp(comp,trozos[1])!=0 ;i++){
  990.             if(i!=nbloq-1){
  991.             sprintf(comp,"%p",histBloqElemento(i+1)->dir);
  992.             }
  993.         }
  994.            
  995.    
  996.         if(i<nbloq){
  997.                    
  998.                     free(histBloqElemento(i)->dir);
  999.                     for(;i<nbloq-1;i++){
  1000.                         HistBloq[i] =HistBloq[i+1];
  1001.                         }
  1002.                         nbloq--;
  1003.                     }else{flagNoEsta++;}
  1004.            
  1005.           }if(nshared!=0){
  1006.             EntraEnShared=1;
  1007.              
  1008.             char comp[20];
  1009.             sprintf(comp,"%p",histSharedElemento(0)->dir);
  1010.            
  1011.             for(i=0;i<nshared && strcmp(comp,trozos[1])!=0 ;i++){
  1012.                 if(i!=nshared-1){
  1013.                 sprintf(comp,"%p",histSharedElemento(i+1)->dir);
  1014.                 }
  1015.             }
  1016.            
  1017.             if(i<nshared){
  1018.                     for(;i<nshared-1;i++){
  1019.                         HistShared[i] =HistShared[i+1];
  1020.                         }
  1021.                         nshared--;
  1022.                     }else{flagNoEsta++;}
  1023.          
  1024.          
  1025.          }if(nmmap!=0){
  1026.              EntraEnMmap=1;
  1027.              
  1028.             char comp[20];
  1029.             sprintf(comp,"%p",histMmapElemento(0)->dir);
  1030.            
  1031.             for(i=0;i<nmmap && strcmp(comp,trozos[1])!=0 ;i++){
  1032.                 if(i!=nmmap-1){
  1033.                 sprintf(comp,"%p",histMmapElemento(i+1)->dir);
  1034.                 }
  1035.             }
  1036.            
  1037.             if(i<nmmap){
  1038.                     for(;i<nmmap-1;i++){
  1039.                         HistMmap[i]=HistMmap[i+1];
  1040.                         }
  1041.                         nmmap--;
  1042.                     }else{flagNoEsta++;}
  1043.              
  1044.            }if((flagNoEsta==3) || (flagNoEsta==1 && !EntraEnBloque && !EntraEnMmap) || (flagNoEsta==1 && !EntraEnBloque && !EntraEnShared) || (flagNoEsta==1 && !EntraEnShared && !EntraEnMmap) || (flagNoEsta==2 && !EntraEnBloque) || (flagNoEsta==2 && !EntraEnShared) || (flagNoEsta==2 && !EntraEnMmap)){
  1045.                
  1046.                printf("Direccion %s no asignada con malloc, shared o mmap\n",trozos[1]);
  1047.                }
  1048.           }
  1049.         }
  1050. }
  1051.  
  1052.  
  1053. void cmdMemdump(){
  1054.     int* dir = (int*)strtol(trozos[1],&trozos[1],16);
  1055.     int i;
  1056.     unsigned char data;
  1057.  
  1058.     for(i=0;i<25;i++){
  1059.     data= *(((unsigned char*)&dir) + i);
  1060.     printf("%02x ",data);
  1061. }
  1062.     printf("\n");
  1063.  
  1064. }
  1065.  
  1066. void Recursiva (int n)
  1067. {
  1068.   char automatico[TAMANO];
  1069.   static char estatico[TAMANO];
  1070.  
  1071.   printf ("parametro:%3d(%p) array %p, arr estatico %p\n",n,&n,automatico, estatico);
  1072.  
  1073.   if (n>0)
  1074.     Recursiva(n-1);
  1075. }
  1076.  
  1077. void cmdRecurse(){
  1078.     if(numtrozos>1){
  1079.         Recursiva(atoi(trozos[1]));
  1080.         }else return;
  1081.     }
  1082.  
  1083. //
  1084.  
  1085. //Comando ayuda
  1086. void cmdAyuda() {
  1087.     if (numtrozos == 1) {
  1088.         printf("'ayuda cmd' donde cmd es uno de los siguientes comandos:\n"
  1089.                "fin salir bye fecha pid autores hist comando carpeta infosis ayuda\n");
  1090.     } else if (numtrozos > 1 && strcmp(trozos[1], "fin") == 0) {
  1091.         printf("fin \tTermina la ejecucion del shell\n");
  1092.     } else if (numtrozos > 1 && strcmp(trozos[1], "salir") == 0) {
  1093.         printf("salir \tTermina la ejecucion del shell\n");
  1094.     } else if (numtrozos > 1 && strcmp(trozos[1], "bye") == 0) {
  1095.         printf("bye \tTermina la ejecucion del shell\n");
  1096.     } else if (numtrozos > 1 && strcmp(trozos[1], "fecha") == 0) {
  1097.         printf("fecha [-d|.h\tMuestra la fecha y o la hora actual\n");
  1098.     } else if (numtrozos > 1 && strcmp(trozos[1], "pid") == 0) {
  1099.         printf("pid [-p]\tMuestra el pid del shell o de su proceso padre\n");
  1100.     }else if (numtrozos > 1 && strcmp(trozos[1], "autores") == 0) {
  1101.         printf("autores [-n|-l]\tMuestra los nombres y logins de los autores\n");
  1102.     }else if (numtrozos > 1 && strcmp(trozos[1], "hist") == 0) {
  1103.         printf("hist [-c|-N]\tMuestra el historico de comandos, con -c lo borra\n");
  1104.     }else if (numtrozos > 1 && strcmp(trozos[1], "comando") == 0) {
  1105.         printf("comando [-N]\tRepite el comando N (del historico)\n");
  1106.     }else if (numtrozos > 1 && strcmp(trozos[1], "carpeta") == 0) {
  1107.         printf("carpeta [dir]\tCambia (o muestra) el directorio actual del shell\n");
  1108.     }else if (numtrozos > 1 && strcmp(trozos[1], "carpeta") == 0) {
  1109.         printf("infosis \tMuestra informacion de la maquina donde corre el shell\n");
  1110.     }else if (numtrozos > 1 && strcmp(trozos[1], "ayuda") == 0) {
  1111.         printf("ayuda [cmd]\tMuestra ayuda sobre los comandos\n");
  1112.     }else if (numtrozos > 1 && strcmp(trozos[1], "create") == 0) {
  1113.         printf("create [-f] [name]  Crea un directorio o un fichero (-f)\n");
  1114.     }else if (numtrozos > 1 && strcmp(trozos[1], "stat") == 0) {
  1115.         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");
  1116.     }else if (numtrozos > 1 && strcmp(trozos[1], "list") == 0) {
  1117.         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");
  1118.     }else if (numtrozos > 1 && strcmp(trozos[1], "delete") == 0) {
  1119.         printf("delete [name1 name2 ..] Borra ficheros o directorios vacios\n");
  1120.     }else if (numtrozos > 1 && strcmp(trozos[1], "deltree") == 0) {
  1121.         printf("deltree [name1 name2 ..]    Borra ficheros o directorios no vacios recursivamente\n");
  1122.     }
  1123. }
  1124.  
  1125. struct cm_entrada{
  1126.     char *cm_nombre;
  1127.     void (*cm_fun)();
  1128. };
  1129.  
  1130. struct cm_entrada cm_tabla[] = {
  1131.     {"autores", cmdAutores},
  1132.     {"ayuda", cmdAyuda},
  1133.     {"bye", cmdFin},
  1134.     {"carpeta", cmdCarpeta},
  1135.     {"comando", cmdComandoN},
  1136.     {"create", cmdCreate},
  1137.     {"delete", cmdDelete},
  1138.     {"fecha", cmdFecha},
  1139.     {"fin", cmdFin},
  1140.     {"hist", cmdHist},
  1141.     {"infosis", cmdInfosis},
  1142.     {"pid", cmdPid},
  1143.     {"salir", cmdFin},
  1144.     {"stat", cmdStat},
  1145.     {"list", cmdList},
  1146.     {"allocate",cmdAllocate},
  1147.     {"deallocate",cmdDeallocate},
  1148.     {"memdump",cmdMemdump},
  1149.     {"recurse",cmdRecurse},
  1150. };
  1151.  
  1152.  
  1153. void ejecutarComando(char *linea){
  1154.     int i;
  1155.     char *copialinea = strdup(linea);
  1156.     numtrozos = TrocearCadena(copialinea, trozos);
  1157.  
  1158.     if(numtrozos == 0) {free(copialinea); return;}
  1159.     for( i=0; ; i++){
  1160.         if(cm_tabla[i].cm_nombre == NULL){
  1161.             printf("%s: comando no reconocido\n", trozos[0]);
  1162.             free(copialinea);
  1163.             break;
  1164.         }
  1165.         if(strcmp(cm_tabla[i].cm_nombre, trozos[0]) == 0){
  1166.             cm_tabla[i].cm_fun();
  1167.             free(copialinea);
  1168.             break;
  1169.         }
  1170.     }
  1171. }
  1172.  
  1173. int main(){
  1174.  
  1175.     while(1){
  1176.         printf("@>");       //Prompt
  1177.         if( fgets(linea, 4096, stdin) == NULL ){
  1178.             exit(0);
  1179.         }
  1180.         ejecutarComando(linea);
  1181.         histInsert(linea);
  1182.     }
  1183.     for(int i=0; i < nhist; i++){
  1184.         free(Hist[i]);
  1185.     }
  1186.     for(int i=0; i < nbloq; i++){
  1187.         free(HistBloq[i]);
  1188.     }
  1189.     for(int i=0; i < nshared; i++){
  1190.         free(HistShared[i]);
  1191.     }
  1192.     for(int i=0; i < nmmap; i++){
  1193.         free(HistMmap[i]);
  1194.     }
  1195. }
  1196.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement