Advertisement
techno-

p2 final

Nov 18th, 2022
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 44.11 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. void LlenarMemoria (void *p, size_t cont, unsigned char byte)
  1062. {
  1063.   unsigned char *arr=(unsigned char *) p;
  1064.   size_t i;
  1065.  
  1066.   for (i=0; i<cont;i++)
  1067.         arr[i]=byte;
  1068. }
  1069.  
  1070. void cmdMemfill(){
  1071.     char A='A';
  1072.     int Bytes=128;
  1073.     int *p,i;
  1074.    
  1075.     if(numtrozos==1){
  1076.         return;
  1077.     }if(numtrozos>2){
  1078.         Bytes=atoi(trozos[2]);
  1079.     }
  1080.     if(numtrozos>3){
  1081.         A=trozos[3][0];
  1082.         }
  1083.     if(nbloq!=0 || nshared!=0){
  1084.     if(nbloq!=0){
  1085.     char comp[20];
  1086.         sprintf(comp,"%p",histBloqElemento(0)->dir);
  1087.        
  1088.         for(i=0;i<nbloq && strcmp(comp,trozos[1])!=0 ;i++){
  1089.             if(i!=nbloq-1){
  1090.             sprintf(comp,"%p",histBloqElemento(i+1)->dir);
  1091.             }
  1092.         }
  1093.            
  1094.     }
  1095.         if(i<nbloq && nbloq!=0){
  1096.             p=histBloqElemento(i)->dir;
  1097.             if(histBloqElemento(i)->Bytes<Bytes){
  1098.                 printf("Violacion de segmento generado\n");
  1099.                 exit(0);
  1100.             }
  1101.          
  1102.        
  1103.         }else if(nshared!=0){
  1104.             char comp2[20];
  1105.             sprintf(comp2,"%p",histSharedElemento(0)->dir);
  1106.            
  1107.             for(i=0;i<nshared && strcmp(comp2,trozos[1])!=0 ;i++){
  1108.                 if(i!=nshared-1){
  1109.                 sprintf(comp2,"%p",histSharedElemento(i+1)->dir);
  1110.                 }
  1111.             }
  1112.            
  1113.             if(i<nshared){
  1114.                 p=histSharedElemento(i)->dir;
  1115.                 if(histSharedElemento(i)->Bytes<Bytes){
  1116.                 printf("Violacion de segmento generado\n");
  1117.                 exit(0);
  1118.                 }
  1119.             }else{
  1120.                 printf("Violacion de segmento generado\n");
  1121.                 exit(0);
  1122.                 }
  1123.                
  1124.         }else{
  1125.                 printf("Violacion de segmento generado\n");
  1126.                 exit(0);
  1127.                 }
  1128.                
  1129.         }else{
  1130.                 printf("Violacion de segmento generado\n");
  1131.                 exit(0);
  1132.                 }
  1133.    
  1134.        
  1135.     printf("Llenando %d bytes de memoria con el byte %c(%02x) a partir de la direccion %p\n",Bytes,A,A,p);
  1136.     LlenarMemoria(p,Bytes,(unsigned char)A);
  1137. }
  1138.  
  1139.  
  1140. void cmdMemdump(){
  1141.     int i, numbytes;
  1142.     char *p,*q,*r;
  1143.    
  1144.     if(numtrozos > 2){
  1145.         numbytes = atoi(trozos[2]);
  1146.     }
  1147.     else{
  1148.         numbytes = 25;
  1149.     }
  1150.    
  1151.     if(nbloq!=0 || nshared!=0){
  1152.     if(nbloq!=0){
  1153.     char comp[20];
  1154.         sprintf(comp,"%p",histBloqElemento(0)->dir);
  1155.        
  1156.         for(i=0;i<nbloq && strcmp(comp,trozos[1])!=0 ;i++){
  1157.             if(i!=nbloq-1){
  1158.             sprintf(comp,"%p",histBloqElemento(i+1)->dir);
  1159.             }
  1160.         }
  1161.            
  1162.     }
  1163.         if(i<nbloq && nbloq!=0){
  1164.             p=(char *)histBloqElemento(i)->dir;
  1165.             if(histBloqElemento(i)->Bytes<numbytes){
  1166.                 printf("Violacion de segmento generado\n");
  1167.                 exit(0);
  1168.             }
  1169.          
  1170.        
  1171.         }else if(nshared!=0){
  1172.             char comp2[20];
  1173.             sprintf(comp2,"%p",histSharedElemento(0)->dir);
  1174.            
  1175.             for(i=0;i<nshared && strcmp(comp2,trozos[1])!=0 ;i++){
  1176.                 if(i!=nshared-1){
  1177.                 sprintf(comp2,"%p",histSharedElemento(i+1)->dir);
  1178.                 }
  1179.             }
  1180.            
  1181.             if(i<nshared){
  1182.                 p=(char *)histSharedElemento(i)->dir;
  1183.                 if(histSharedElemento(i)->Bytes<numbytes){
  1184.                 printf("Violacion de segmento generado\n");
  1185.                 exit(0);
  1186.                 }
  1187.             }else{
  1188.                 printf("Violacion de segmento generado\n");
  1189.                 exit(0);
  1190.                 }
  1191.                
  1192.         }else{
  1193.                 printf("Violacion de segmento generado\n");
  1194.                 exit(0);
  1195.                 }
  1196.                
  1197.         }else{
  1198.                 printf("Violacion de segmento generado\n");
  1199.                 exit(0);
  1200.                 }
  1201.    
  1202.     printf("Volcando %d bytes desde la direccion %p\n", numbytes, p);
  1203.     q=p;
  1204.     r=p;
  1205.     int mod = numbytes % 25;  
  1206.    
  1207.     for(int j=0;j<numbytes/25;j++){
  1208.         for(i=0;i<numbytes&&i<25;i++,r++){
  1209.             printf("%2c ",*r);
  1210.             }
  1211.             printf("\n");
  1212.         for(i=0;i<numbytes&&i<25;i++,q++){
  1213.             char buf[10];
  1214.             sprintf(buf,"%x",*q);
  1215.             printf("%.2s ",buf);
  1216.             }
  1217.             printf("\n");
  1218.            
  1219.         }if(mod!=0){
  1220.             for(i=0;i<mod;i++,r++){
  1221.             printf("%2c ",*r);
  1222.             }
  1223.            
  1224.             printf("\n");
  1225.             for(i=0;i<mod;i++,q++){
  1226.             char buf[10];
  1227.             sprintf(buf,"%x",*q);
  1228.             printf("%.2s ",buf);
  1229.             }
  1230.        
  1231.        
  1232.             printf("\n");
  1233.          }
  1234.          
  1235. }
  1236.  
  1237. ssize_t LeerFichero (char *f, void *p, size_t cont)
  1238. {
  1239.    struct stat s;
  1240.    ssize_t  n;  
  1241.    int df,aux;
  1242.  
  1243.    if (stat (f,&s)==-1 || (df=open(f,O_RDONLY))==-1)
  1244.     return -1;    
  1245.    if (cont==-1)   /* si pasamos -1 como bytes a leer lo leemos entero*/
  1246.     cont=s.st_size;
  1247.    if ((n=read(df,p,cont))==-1){
  1248.     aux=errno;
  1249.     close(df);
  1250.     errno=aux;
  1251.     return -1;
  1252.    }
  1253.    close (df);
  1254.    return n;
  1255. }
  1256.  
  1257. ssize_t EscribirFichero (char *f, void *p, size_t cont,int overwrite)
  1258. {
  1259.    ssize_t  n;
  1260.    int df,aux, flags=O_CREAT | O_EXCL | O_WRONLY;
  1261.  
  1262.    if (overwrite)
  1263.     flags=O_CREAT | O_WRONLY | O_TRUNC;
  1264.  
  1265.    if ((df=open(f,flags,0777))==-1)
  1266.     return -1;
  1267.  
  1268.    if ((n=write(df,p,cont))==-1){
  1269.     aux=errno;
  1270.     close(df);
  1271.     errno=aux;
  1272.     return -1;
  1273.    }
  1274.    close (df);
  1275.    return n;
  1276. }
  1277.  
  1278.  
  1279. void cmdIo(){
  1280.    
  1281.     if( (strcmp(trozos[1], "read") == 0)){
  1282.         ssize_t cont = -1;
  1283.         char *file;
  1284.         void *addr;
  1285.  
  1286.         file = trozos[2];
  1287.         addr = (void *) strtol(trozos[3], NULL, 16);
  1288.    
  1289.         if(numtrozos == 5){
  1290.             cont = atoi(trozos[4]);
  1291.         }
  1292.    
  1293.         if((cont = LeerFichero(file, addr, cont)) == -1){
  1294.             printf("Imposible leer fichero");
  1295.         }
  1296.         printf("leidos %ld bytes de %s en %p\n", cont, file, addr);
  1297.     }
  1298.     else if((strcmp(trozos[1], "write") == 0)){
  1299.         int fd=0, numbytes;
  1300.         char *file;
  1301.         void *addr;
  1302.         struct stat filestat;
  1303.  
  1304.         //Sobreescritura con -o
  1305.         if (numtrozos == 6 && strcmp(trozos[2], "-o") == 0) {
  1306.             file = trozos[3];
  1307.             if ((fd = open(file, O_WRONLY)) == -1) {
  1308.                 return;
  1309.             }
  1310.             addr = (void *) strtol(trozos[4], NULL, 16);
  1311.             numbytes = atoi(trozos[5]);
  1312.             if (write(fd, addr, numbytes) == -1) {
  1313.                 close(fd);
  1314.             } else {
  1315.                 printf("escritos %d bytes en %s desde %p\n", numbytes, file, addr);
  1316.                 close(fd);
  1317.             }
  1318.         } else if (numtrozos == 5) { //Sobreescritura sin -o
  1319.             file = trozos[2];
  1320.             if (stat(file, &filestat) == 0) {
  1321.                 printf("Imposible escribir fichero: File exists\n");
  1322.                 return;
  1323.         }
  1324.        
  1325.         addr = (void *) strtol(trozos[3], NULL, 16);
  1326.         numbytes = (int) atoi(trozos[4]);
  1327.        
  1328.         if (write(fd, addr, numbytes) == -1) {
  1329.             close(fd);
  1330.             return;
  1331.         } else {
  1332.             printf("escritos %d bytes en %s desde %p\n", numbytes, file, addr);
  1333.             close(fd);
  1334.             }
  1335.         }  
  1336.     }
  1337.     else{
  1338.         printf("uso: e-s [read|write] ......");
  1339.     }
  1340. }
  1341.    
  1342.  
  1343. void Recursiva (int n)
  1344. {
  1345.   char automatico[TAMANO];
  1346.   static char estatico[TAMANO];
  1347.  
  1348.   printf ("parametro:%3d(%p) array %p, arr estatico %p\n",n,&n,automatico, estatico);
  1349.  
  1350.   if (n>0)
  1351.     Recursiva(n-1);
  1352. }
  1353.  
  1354. void cmdRecurse(){
  1355.     if(numtrozos>1){
  1356.         Recursiva(atoi(trozos[1]));
  1357.         }else return;
  1358. }
  1359.  
  1360. void Do_pmap (void) /*sin argumentos*/
  1361.  { pid_t pid;       /*hace el pmap (o equivalente) del proceso actual*/
  1362.    char elpid[32];
  1363.    char *argv[4]={"pmap",elpid,NULL};
  1364.    
  1365.    sprintf (elpid,"%d", (int) getpid());
  1366.    if ((pid=fork())==-1){
  1367.       perror ("Imposible crear proceso");
  1368.       return;
  1369.       }
  1370.    if (pid==0){
  1371.       if (execvp(argv[0],argv)==-1)
  1372.          perror("cannot execute pmap (linux, solaris)");
  1373.          
  1374.       argv[0]="procstat"; argv[1]="vm"; argv[2]=elpid; argv[3]=NULL;  
  1375.       if (execvp(argv[0],argv)==-1)/*No hay pmap, probamos procstat FreeBSD */
  1376.          perror("cannot execute procstat (FreeBSD)");
  1377.          
  1378.       argv[0]="procmap",argv[1]=elpid;argv[2]=NULL;    
  1379.             if (execvp(argv[0],argv)==-1)  /*probamos procmap OpenBSD*/
  1380.          perror("cannot execute procmap (OpenBSD)");
  1381.          
  1382.       argv[0]="vmmap"; argv[1]="-interleave"; argv[2]=elpid;argv[3]=NULL;
  1383.       if (execvp(argv[0],argv)==-1) /*probamos vmmap Mac-OS*/
  1384.          perror("cannot execute vmmap (Mac-OS)");      
  1385.       exit(1);
  1386.   }
  1387.   waitpid (pid,NULL,0);
  1388. }
  1389.  
  1390.  
  1391. void cmdMemory(){
  1392.     int i,j,k;
  1393.     if(numtrozos==1 || (numtrozos>1 && strcmp(trozos[1],"-all")==0)){
  1394.    
  1395.     printf("Variables locales %18p %18p %18p\n",&i,&j,&k);
  1396.     printf("Variables globales %18p %18p %18p\n",linea,trozos,&numtrozos);
  1397.     printf("Variables estaticas %18p %18p %18p\n",&varMem,&varMem2,&varMem3);
  1398.     printf("Funciones programa %18p %18p %18p\n",&cmdRecurse,&cmdMemory,&cmdAllocate);
  1399.     printf("Funciones libreria %18p %18p %18p\n",&malloc,&printf,&scanf);
  1400.     printf("******Lista de bloques asignados para el proceso %d\n", getpid());
  1401.             for(i=0;i<nbloq;i++){
  1402.                 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);
  1403.             }
  1404.             for(i=0;i<nshared;i++){
  1405.                 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);
  1406.             }
  1407.             for(i=0;i<nmmap;i++){
  1408.                 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);
  1409.             }
  1410.        
  1411.     }else{
  1412.     if(strcmp("-blocks",trozos[1])==0){
  1413.         printf("******Lista de bloques asignados para el proceso %d\n", getpid());
  1414.             for(i=0;i<nbloq;i++){
  1415.                 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);
  1416.             }
  1417.             for(i=0;i<nshared;i++){
  1418.                 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);
  1419.             }
  1420.             for(i=0;i<nmmap;i++){
  1421.                 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);
  1422.             }
  1423.         }else if(strcmp("-pmap",trozos[1])==0){
  1424.             Do_pmap();
  1425.         }else if(strcmp("-funcs",trozos[1])==0){
  1426.             printf("Funciones programa %18p %18p %18p\n",&cmdRecurse,&cmdMemory,&cmdAllocate);
  1427.             printf("Funciones libreria %18p %18p %18p\n",&malloc,&printf,&scanf);
  1428.         }else if(strcmp("-vars",trozos[1])==0){
  1429.             printf("Variables locales %18p %18p %18p\n",&i,&j,&k);
  1430.             printf("Variables globales %18p %18p %18p\n",linea,trozos,&numtrozos);
  1431.             printf("Variables estaticas %18p %18p %18p\n",&varMem,&varMem2,&varMem3);
  1432.         }
  1433.     }  
  1434. }
  1435.  
  1436. //
  1437.  
  1438. //Comando ayuda
  1439. void cmdAyuda() {
  1440.     if (numtrozos == 1) {
  1441.         printf("'ayuda cmd' donde cmd es uno de los siguientes comandos:\n"
  1442.                "fin salir bye fecha pid autores hist comando carpeta infosis ayuda\n");
  1443.     } else if (numtrozos > 1 && strcmp(trozos[1], "fin") == 0) {
  1444.         printf("fin \tTermina la ejecucion del shell\n");
  1445.     } else if (numtrozos > 1 && strcmp(trozos[1], "salir") == 0) {
  1446.         printf("salir \tTermina la ejecucion del shell\n");
  1447.     } else if (numtrozos > 1 && strcmp(trozos[1], "bye") == 0) {
  1448.         printf("bye \tTermina la ejecucion del shell\n");
  1449.     } else if (numtrozos > 1 && strcmp(trozos[1], "fecha") == 0) {
  1450.         printf("fecha [-d|.h\tMuestra la fecha y o la hora actual\n");
  1451.     } else if (numtrozos > 1 && strcmp(trozos[1], "pid") == 0) {
  1452.         printf("pid [-p]\tMuestra el pid del shell o de su proceso padre\n");
  1453.     }else if (numtrozos > 1 && strcmp(trozos[1], "autores") == 0) {
  1454.         printf("autores [-n|-l]\tMuestra los nombres y logins de los autores\n");
  1455.     }else if (numtrozos > 1 && strcmp(trozos[1], "hist") == 0) {
  1456.         printf("hist [-c|-N]\tMuestra el historico de comandos, con -c lo borra\n");
  1457.     }else if (numtrozos > 1 && strcmp(trozos[1], "comando") == 0) {
  1458.         printf("comando [-N]\tRepite el comando N (del historico)\n");
  1459.     }else if (numtrozos > 1 && strcmp(trozos[1], "carpeta") == 0) {
  1460.         printf("carpeta [dir]\tCambia (o muestra) el directorio actual del shell\n");
  1461.     }else if (numtrozos > 1 && strcmp(trozos[1], "carpeta") == 0) {
  1462.         printf("infosis \tMuestra informacion de la maquina donde corre el shell\n");
  1463.     }else if (numtrozos > 1 && strcmp(trozos[1], "ayuda") == 0) {
  1464.         printf("ayuda [cmd]\tMuestra ayuda sobre los comandos\n");
  1465.     }else if (numtrozos > 1 && strcmp(trozos[1], "create") == 0) {
  1466.         printf("create [-f] [name]  Crea un directorio o un fichero (-f)\n");
  1467.     }else if (numtrozos > 1 && strcmp(trozos[1], "stat") == 0) {
  1468.         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");
  1469.     }else if (numtrozos > 1 && strcmp(trozos[1], "list") == 0) {
  1470.         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");
  1471.     }else if (numtrozos > 1 && strcmp(trozos[1], "delete") == 0) {
  1472.         printf("delete [name1 name2 ..] Borra ficheros o directorios vacios\n");
  1473.     }else if (numtrozos > 1 && strcmp(trozos[1], "deltree") == 0) {
  1474.         printf("deltree [name1 name2 ..]    Borra ficheros o directorios no vacios recursivamente\n");
  1475.     }
  1476. }
  1477.  
  1478. struct cm_entrada{
  1479.     char *cm_nombre;
  1480.     void (*cm_fun)();
  1481. };
  1482.  
  1483. struct cm_entrada cm_tabla[] = {
  1484.     {"autores", cmdAutores},
  1485.     {"ayuda", cmdAyuda},
  1486.     {"bye", cmdFin},
  1487.     {"carpeta", cmdCarpeta},
  1488.     {"comando", cmdComandoN},
  1489.     {"create", cmdCreate},
  1490.     {"delete", cmdDelete},
  1491.     {"fecha", cmdFecha},
  1492.     {"fin", cmdFin},
  1493.     {"hist", cmdHist},
  1494.     {"infosis", cmdInfosis},
  1495.     {"pid", cmdPid},
  1496.     {"salir", cmdFin},
  1497.     {"stat", cmdStat},
  1498.     {"list", cmdList},
  1499.     {"allocate",cmdAllocate},
  1500.     {"deallocate",cmdDeallocate},
  1501.     {"memdump",cmdMemdump},
  1502.     {"recurse",cmdRecurse},
  1503.     {"memory",cmdMemory},
  1504.     {"memfill",cmdMemfill},
  1505.     {"i-o",cmdIo},
  1506. };
  1507.  
  1508.  
  1509. void ejecutarComando(char *linea){
  1510.     int i;
  1511.     char *copialinea = strdup(linea);
  1512.     numtrozos = TrocearCadena(copialinea, trozos);
  1513.  
  1514.     if(numtrozos == 0) {free(copialinea); return;}
  1515.     for( i=0; ; i++){
  1516.         if(cm_tabla[i].cm_nombre == NULL){
  1517.             printf("%s: comando no reconocido\n", trozos[0]);
  1518.             free(copialinea);
  1519.             break;
  1520.         }
  1521.         if(strcmp(cm_tabla[i].cm_nombre, trozos[0]) == 0){
  1522.             cm_tabla[i].cm_fun();
  1523.             free(copialinea);
  1524.             break;
  1525.         }
  1526.     }
  1527. }
  1528.  
  1529. int main(){
  1530.  
  1531.     while(1){
  1532.         printf("@>");       //Prompt
  1533.         if( fgets(linea, 4096, stdin) == NULL ){
  1534.             exit(0);
  1535.         }
  1536.         ejecutarComando(linea);
  1537.         histInsert(linea);
  1538.     }
  1539.     for(int i=0; i < nhist; i++){
  1540.         free(Hist[i]);
  1541.     }
  1542.     for(int i=0; i < nbloq; i++){
  1543.         free(HistBloq[i]);
  1544.     }
  1545.     for(int i=0; i < nshared; i++){
  1546.         free(HistShared[i]);
  1547.     }
  1548.     for(int i=0; i < nmmap; i++){
  1549.         free(HistMmap[i]);
  1550.     }
  1551. }
  1552.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement