Advertisement
techno-

main

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