Advertisement
techno-

p2

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