Advertisement
techno-

p1 ¿final?

Oct 21st, 2022
54
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 19.17 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 "ListaHistorial.h"
  20.  
  21. #define MaxTrozos 512
  22. #define MaxHist 4096
  23.  
  24. char linea[4096];
  25. char *trozos[MaxTrozos];
  26. int numtrozos;
  27.  
  28. void ejecutarComando(char *linea);
  29.  
  30. int TrocearCadena(char * cadena, char * trozos[]){
  31.     int i=1;
  32.     if ((trozos[0]=strtok(cadena," \n\t"))==NULL)
  33.     return 0;
  34.     while ((trozos[i]=strtok(NULL," \n\t"))!=NULL)
  35.         i++;
  36.     return i;
  37. }
  38.  
  39.  
  40. //Comandos del shell
  41.  
  42. //Comando autores
  43. void cmdAutores(){
  44.  
  45.     char flagLogin= 1, flagNombre=1;
  46.  
  47.     if(numtrozos > 1 && strcmp(trozos[1], "-l") == 0)
  48.         flagNombre= 0;
  49.     if(numtrozos > 1 && strcmp(trozos[1], "-n") == 0)
  50.         flagLogin = 0;
  51.  
  52.     if(flagLogin){
  53.         printf("Login: j.loureirop\n");
  54.         printf("Login: javier.sobrino\n");
  55.     }
  56.     if(flagNombre){
  57.         printf("Nombre: Javier Loureiro\n");
  58.         printf("Nombre: Javier Sobrino\n");
  59.     }
  60. }
  61.  
  62. //Comando Fin (sale del shell)
  63. void cmdFin(){
  64.     exit(0);
  65. }
  66.  
  67. //Comando Pid
  68. void cmdPid(){
  69.  
  70.     if(numtrozos == 1)
  71.         printf("Pid del shell: %d\n", getpid());
  72.     else if (numtrozos > 1)
  73.         printf("Pid del padre del shell: %d\n", getppid());
  74. }
  75.  
  76.  
  77. //Comando Carpeta
  78. void cmdCarpeta(){
  79.     char ruta[PATH_MAX];
  80.  
  81.     if(numtrozos == 1){
  82.         if(getcwd(ruta, PATH_MAX) == NULL){
  83.             perror("getcwd");
  84.             return;
  85.         }
  86.         else{
  87.             printf("%s\n", ruta);
  88.             return;
  89.         }
  90.     }
  91.     else if(numtrozos > 1){
  92.         if (chdir(trozos[1]) == -1) {perror("chdir"); return;}
  93.         else
  94.             chdir(trozos[1]);
  95.     }
  96. }
  97.  
  98. //Comando comandoN
  99. void cmdComandoN(){
  100.     int n;
  101.  
  102.     if(numtrozos == 1) {printf("Falta número de comando \n"); return;}
  103.     n = atoi(trozos[1]);
  104.  
  105.     if(n < 0 || n >= histNumElementos()) {printf("Número de comando fuera de rango \n"); return;}
  106.     else {
  107.         printf(" %s",histElemento(n));
  108.     }
  109. }
  110.  
  111. //Comando fecha
  112. void cmdFecha(){
  113.  
  114.     struct tm *t;
  115.     time_t tiempo;
  116.  
  117.     if(time(&tiempo) == -1) {perror("time"); return;}
  118.     t = localtime(&tiempo);
  119.  
  120.     if(numtrozos > 1 && strcmp(trozos[1], "-d") == 0)
  121.         printf("%d/%d/%d\n", t->tm_mday, t->tm_mon, t->tm_year+1900);
  122.     else if(numtrozos > 1 && strcmp(trozos[1], "-h") == 0)
  123.         printf("%d:%d:%d\n", t->tm_hour, t->tm_min, t->tm_sec);
  124.     else{
  125.         printf("%d:%d:%d\n", t->tm_hour, t->tm_min, t->tm_sec);
  126.         printf("%d/%d/%d\n", t->tm_mday, t->tm_mon, t->tm_year+1900);
  127.     }
  128.  
  129. }
  130.  
  131. //Comando historial
  132. void histImprimeN(){
  133.     int i;
  134.  
  135.     for(i = 0; i <= trozos[1][1] - 48; i++){
  136.         printf("%d->%s", i, histElemento(i));
  137.     }
  138. }
  139.  
  140. void cmdHist(){
  141.     int i;
  142.  
  143.     if(numtrozos == 1){
  144.         for(i = 0; i < histNumElementos() ; i++){
  145.         printf("%d->%s", i, histElemento(i));
  146.         }
  147.     }
  148.     else if(numtrozos > 1 && strcmp(trozos[1], "-c") == 0){
  149.         histBorrar();
  150.         return;
  151.     }
  152.     else if(numtrozos > 1)
  153.         histImprimeN();
  154. }
  155.  
  156. //Comando infosis
  157. void cmdInfosis(){
  158.     struct utsname system;
  159.     uname(&system);
  160.  
  161.     printf("%s (%s), OS: %s %s-%s\n", system.nodename, system.machine, system.sysname,
  162.                                                                 system.release, system.version);
  163. }
  164.  
  165. /*PRACTICA 1*/
  166.  
  167. //Comando create
  168. void cmdCreate(){
  169.     char ruta[PATH_MAX];
  170.     if (numtrozos==1){
  171.         getcwd(ruta, PATH_MAX);
  172.         printf("%s\n", ruta);
  173.         return;
  174.     }else if(numtrozos==2){
  175.         if(strcmp(trozos[1],"-f")==0){
  176.         getcwd(ruta, PATH_MAX);
  177.         printf("%s\n", ruta);
  178.         return;
  179.         }else{
  180.         mkdir(trozos[1],0777);
  181.         if(errno != 0){
  182.         printf("Imposible crear: %s\n",strerror(errno));
  183.         }
  184.     }
  185.  
  186.     }else if(numtrozos==3){
  187.         if(strcmp(trozos[1], "-f")==0){
  188.         getcwd(ruta, PATH_MAX);
  189.         strcat(ruta,"/");
  190.         strcat(ruta,trozos[2]);
  191.  
  192.         FILE *fp;
  193.         fp = fopen(trozos[2],"w");
  194.         if(fp != NULL){
  195.         fclose(fp);
  196.         }
  197.         if(errno != 0){
  198.         printf("Imposible crear: %s\n",strerror(errno));
  199.         }
  200.  
  201.       }
  202.     }
  203.  
  204. }
  205. //Comando borrar
  206.  
  207. void cmdDelete(){
  208.     int i;
  209.     for(i=1;i<numtrozos;i++){
  210.  
  211.         if(errno != 0){
  212.         printf("aaa %s\n",strerror(errno));
  213.         }
  214.         remove(trozos[i]);
  215.         if(errno != 0){
  216.         printf("%s\n",strerror(errno));
  217.         }
  218.         }
  219.  
  220.     }
  221.  
  222.  
  223.  
  224. //
  225.  
  226.  
  227. void st_mode_to_str(mode_t st_mode, char *mode){
  228.     mode[0]= ' '; //(S_ISDIR(fileStat.st_mode)) ? 'd' : '-';
  229.     mode[1]= (st_mode & S_IRUSR) ? 'r' : '-';
  230.     mode[2]= (st_mode & S_IWUSR) ? 'w' : '-';
  231.     mode[3]= (st_mode & S_IXUSR) ? 'x' : '-';
  232.     mode[4]= (st_mode & S_IRGRP) ? 'r' : '-';
  233.     mode[5]= (st_mode & S_IWGRP) ? 'w' : '-';
  234.     mode[6]= (st_mode & S_IXGRP) ? 'x' : '-';
  235.     mode[7]= (st_mode & S_IROTH) ? 'r' : '-';
  236.     mode[8]= (st_mode & S_IWOTH) ? 'w' : '-';
  237.     mode[9]= (st_mode & S_IXOTH) ? 'x' : '-';
  238.     mode[10]= 0;
  239.     }
  240.  
  241. //Comando stat
  242. void cmdStat(){
  243.  
  244.     struct stat *statbuf;
  245.     statbuf = malloc(sizeof(struct stat));
  246.  
  247.  
  248.     char ruta[PATH_MAX];
  249.     int flagLong=0, flagAcc=0, flagLink=0; //flags para detectar las opciones que se pasan
  250.     struct passwd *pws; //Id dispositivo
  251.     struct group *grp; //Id grupo
  252.     struct tm dtc, dta;
  253.  
  254.     //Introducen stat
  255.     if (numtrozos == 1)
  256.         cmdCarpeta();
  257.  
  258.     //Introducen stat (algo)
  259.     if(numtrozos == 2){
  260.  
  261.         getcwd(ruta, PATH_MAX);
  262.         strcat(ruta, "/");
  263.         strcat(ruta, trozos[1]);
  264.  
  265.         if(lstat(ruta, statbuf)== -1){
  266.             printf("Ha habido un error: %s\n", strerror(errno));
  267.         }
  268.         else{
  269.             printf("%ld %s\n", statbuf->st_size, trozos[1]);
  270.         }
  271.     }
  272.  
  273.     if(numtrozos>2){
  274.         //Obtenemos los flags que se pasan
  275.         for(int i = 1; i < numtrozos && trozos[i][0] == '-' ; i++){
  276.             if(strcmp(trozos[i], "-long") == 0) flagLong = 1;
  277.             else if(strcmp(trozos[i],"-link") == 0) flagLink = 1;
  278.             else if(strcmp(trozos[i], "-acc") == 0) flagAcc = 1;
  279.         }
  280.  
  281.         getcwd(ruta, PATH_MAX);
  282.         strcat(ruta, "/");
  283.         strcat(ruta, trozos[numtrozos-1]);
  284.  
  285.         if(lstat(ruta, statbuf)== -1){
  286.             printf("Ha habido un error: %s\n", strerror(errno));
  287.         }
  288.         else{
  289.             pws = getpwuid(statbuf->st_uid);
  290.             grp = getgrgid(statbuf->st_gid);
  291.  
  292.             dtc = *(gmtime(&statbuf->st_ctime));
  293.             dta = *(gmtime(&statbuf->st_atime));
  294.  
  295.  
  296.             if(flagAcc == 1 && flagLong==0){
  297.                 printf("%d/%d/%d-%d:%.2d  ", dta.tm_year + 1900, dta.tm_mon+1, dta.tm_mday,
  298.                 dta.tm_hour+2, dta.tm_min);
  299.             }
  300.             if(flagLong==1){
  301.                 //strmode(st_mode, statbuf->st_mode);
  302.                 char mode[11];
  303.                 st_mode_to_str(statbuf->st_mode,mode);
  304.                 printf("%d/%d/%d-%d:%.2d %ld, ( %ld)    %s %s %s ", dtc.tm_year + 1900, dtc.tm_mon+1, dtc.tm_mday,
  305.                 dtc.tm_hour+2, dtc.tm_min,statbuf->st_nlink, statbuf->st_ino, pws->pw_name, grp->gr_name, mode);
  306.             }
  307.             if(flagLink==1){
  308.                 //hacer links
  309.             }
  310.             printf("%ld %s\n", statbuf->st_size, trozos[numtrozos-1]);
  311.         }
  312.     }
  313.  
  314. }
  315.  
  316.  
  317.  
  318. //Stat 2 (para list)
  319.  
  320. void cmdStat2(const char d_name[],int flagLong, int flagAcc, char ruta[], int REC){
  321.     struct stat *statbuf;
  322.     statbuf = malloc(sizeof(struct stat));
  323.  
  324.  
  325.  
  326.     struct passwd *pws; //Id dispositivo
  327.     struct group *grp; //Id grupo
  328.     struct tm dtc, dta;
  329.  
  330.  
  331.  
  332.     if(numtrozos>2){
  333.  
  334. if(REC==1){
  335.  
  336.         if(lstat(ruta, statbuf)== -1){
  337.         }
  338.         else{
  339.             pws = getpwuid(statbuf->st_uid);
  340.             grp = getgrgid(statbuf->st_gid);
  341.  
  342.             dtc = *(gmtime(&statbuf->st_ctime));
  343.             dta = *(gmtime(&statbuf->st_atime));
  344.  
  345.  
  346.             if(flagAcc == 1 && flagLong==0){
  347.                 printf("%d/%d/%d-%d:%.2d  ", dta.tm_year + 1900, dta.tm_mon+1, dta.tm_mday,
  348.                 dta.tm_hour+2, dta.tm_min);
  349.             }
  350.  
  351.             if(flagLong==1){
  352.                 //strmode(st_mode, statbuf->st_mode);
  353.                 char mode[11];
  354.                 st_mode_to_str(statbuf->st_mode,mode);
  355.                 printf("%d/%d/%d-%d:%.2d %ld, ( %ld)    %s %s %s ", dtc.tm_year + 1900, dtc.tm_mon+1, dtc.tm_mday,
  356.                 dtc.tm_hour+2, dtc.tm_min,statbuf->st_nlink, statbuf->st_ino, pws->pw_name, grp->gr_name, mode);
  357.             }
  358.             printf("%ld %s\n", statbuf->st_size, d_name);
  359.         }
  360.        
  361.       }
  362.      
  363.       else if(REC==0){
  364.          
  365.            if(lstat(d_name, statbuf)== -1){
  366.         }
  367.         else{
  368.             pws = getpwuid(statbuf->st_uid);
  369.             grp = getgrgid(statbuf->st_gid);
  370.  
  371.             dtc = *(gmtime(&statbuf->st_ctime));
  372.             dta = *(gmtime(&statbuf->st_atime));
  373.  
  374.  
  375.             if(flagAcc == 1 && flagLong==0){
  376.                 printf("%d/%d/%d-%d:%.2d  ", dta.tm_year + 1900, dta.tm_mon+1, dta.tm_mday,
  377.                 dta.tm_hour+2, dta.tm_min);
  378.             }
  379.  
  380.             if(flagLong==1){
  381.                 //strmode(st_mode, statbuf->st_mode);
  382.                 char mode[11];
  383.                 st_mode_to_str(statbuf->st_mode,mode);
  384.                 printf("%d/%d/%d-%d:%.2d %ld, ( %ld)    %s %s %s ", dtc.tm_year + 1900, dtc.tm_mon+1, dtc.tm_mday,
  385.                 dtc.tm_hour+2, dtc.tm_min,statbuf->st_nlink, statbuf->st_ino, pws->pw_name, grp->gr_name, mode);
  386.             }
  387.             printf("%ld %s\n", statbuf->st_size, ruta);
  388.         }
  389.          
  390.           }
  391.     }
  392.  
  393. }
  394.  
  395.  
  396. void cmdListaREC(const char *dirname,int fun, int flagHid, int flagLong){
  397.     if(fun==0){
  398.  
  399.     DIR* dir = opendir(dirname);
  400.  
  401.     struct dirent* dirent;
  402.     dirent = readdir(dir);
  403.     char path[100];
  404.  
  405.  
  406.  
  407.  
  408.   if (dir == NULL) {
  409.         return;
  410.     }
  411.  
  412.     printf("************%s\n",dirname);
  413.  
  414.  
  415.     while (dirent != NULL) {
  416.         strcpy(path, dirname);
  417.         strcat(path, "/");
  418.         strcat(path, dirent->d_name);
  419.  
  420.         if(dirent->d_name[0] != '.' || flagHid == 1){
  421.             if(flagLong==1){
  422.                 cmdStat2(dirent->d_name,1,1,path,1);
  423.                 }else{
  424.                     printf("%hhd %s\n", dirent->d_type, dirent->d_name);
  425.                     }
  426.         }
  427.  
  428.         dirent = readdir(dir);
  429.     }
  430.  
  431.     closedir(dir);
  432.  
  433.  
  434.     dir = opendir(dirname);
  435.     if (dir == NULL) {
  436.         return;
  437.     }
  438.  
  439.  
  440.     dirent = readdir(dir);
  441.     while (dirent != NULL) {
  442.  
  443.  
  444.  
  445.        if (dirent->d_type == DT_DIR && strcmp(dirent->d_name, ".") != 0 && strcmp(dirent->d_name, "..") != 0 && (dirent->d_name[0] != '.'|| flagHid==1)){
  446.  
  447.            char path[100];
  448.             strcpy(path, dirname);
  449.             strcat(path, "/");
  450.             strcat(path, dirent->d_name);
  451.             cmdListaREC(path,0,flagHid,flagLong);
  452.         }
  453.         dirent = readdir(dir);
  454.     }
  455.  
  456.     closedir(dir);
  457.  
  458.     }
  459.  
  460.     else if (fun==1){
  461.  
  462.  
  463.  
  464.     DIR* dir = opendir(dirname);
  465.  
  466.     struct dirent* dirent;
  467.     dirent = readdir(dir);
  468.  
  469.  
  470.     if (dir == NULL) {
  471.         return;
  472.     }
  473.  
  474.  
  475.     while (dirent != NULL) {
  476.  
  477.         if (dirent->d_type == DT_DIR && strcmp(dirent->d_name, ".") != 0 && strcmp(dirent->d_name, "..") != 0 && (dirent->d_name[0] != '.' || flagHid ==1)) {
  478.             char path[100];
  479.             printf("************%s/%s\n",dirname,dirent->d_name);
  480.             strcpy(path, dirname);
  481.             strcat(path, "/");
  482.             strcat(path, dirent->d_name);
  483.             cmdListaREC(path,1,flagHid,flagLong);
  484.             printf("************%s\n",dirname);
  485.         }
  486.  
  487.         dirent = readdir(dir);
  488.     }
  489.  
  490.     closedir(dir);
  491.  
  492.  
  493.     dir = opendir(dirname);
  494.     if (dir == NULL) {
  495.         return;
  496.     }
  497.  
  498.  
  499.     dirent = readdir(dir);
  500.     while (dirent != NULL) {
  501.         char path[100];
  502.         strcpy(path, dirname);
  503.         strcat(path, "/");
  504.         strcat(path, dirent->d_name);
  505.  
  506.        if(dirent->d_name[0] != '.' || flagHid == 1){
  507.             if(flagLong==1){
  508.                 cmdStat2(dirent->d_name,1,1,path,1);
  509.                 }else{
  510.                     printf("%hhd %s\n", dirent->d_type, dirent->d_name);
  511.                     }
  512.         }
  513.  
  514.         dirent = readdir(dir);
  515.     }
  516.  
  517.     closedir(dir);
  518.  
  519.     }
  520. }
  521.  
  522. //Comando list
  523. void cmdList(){
  524.  
  525.  
  526.     char ruta[PATH_MAX];
  527.     int flagHid=0,flagLong=0, flagAcc=0, flagReca=0, flagRecb=0; //flags para detectar las opciones que se pasan
  528.  
  529.  
  530.     DIR *d;
  531.     struct dirent *dirent;
  532.     getcwd(ruta, PATH_MAX);
  533.     strcat(ruta, "/");
  534.     strcat(ruta, trozos[numtrozos-1]);
  535.  
  536.     if(numtrozos==1)
  537.         cmdCarpeta();
  538.  
  539.     if(numtrozos==2){
  540.  
  541.  
  542.         if((d=opendir(ruta)) == NULL){perror("opendir"); return;}
  543.         printf("************%s\n",trozos[numtrozos-1]);
  544.         while((dirent = readdir(d))!= NULL){
  545.             if(dirent->d_name[0] != '.'){
  546.             printf("%s\n", dirent->d_name);
  547.         }
  548.        }
  549.     }
  550.  
  551.  
  552.     if(numtrozos>2){
  553.  
  554.  
  555.  
  556.         //Obtenemos los flags que se pasan
  557.         for(int i = 1; i < numtrozos && trozos[i][0] == '-' ; i++){
  558.             if(strcmp(trozos[i],"-hid")==0) flagHid = 1;
  559.             else if(strcmp(trozos[i], "-long") == 0) flagLong = 1;
  560.             else if(strcmp(trozos[i], "-acc") == 0) flagAcc = 1;
  561.             else if(strcmp(trozos[i], "-reca") == 0) flagReca = 1;
  562.             else if(strcmp(trozos[i], "-recb") == 0) flagRecb = 1;
  563.         }
  564.  
  565.  
  566.     if((d=opendir(ruta)) == NULL){perror("opendir"); return;}
  567.  
  568.  
  569.  
  570.         if(flagAcc==1 && flagLong==0 && flagHid==0){
  571.             printf("************%s\n",trozos[numtrozos-1]);
  572.             while((dirent = readdir(d))!= NULL){
  573.             getcwd(ruta, PATH_MAX);
  574.             strcat(ruta,"/");
  575.             strcat(ruta,trozos[numtrozos-1]);
  576.             strcat(ruta,"/");
  577.             strcat(ruta,dirent->d_name);
  578.             if(dirent->d_name[0] != '.'){
  579.             cmdStat2(ruta,0,1,dirent->d_name,0);
  580.         }
  581.        }
  582.     }//
  583.  
  584.         if(flagAcc==1 && flagLong==0 && flagHid==1){
  585.             printf("************%s\n",trozos[numtrozos-1]);
  586.             while((dirent = readdir(d))!= NULL){
  587.             getcwd(ruta, PATH_MAX);
  588.             strcat(ruta,"/");
  589.             strcat(ruta,trozos[numtrozos-1]);
  590.             strcat(ruta,"/");
  591.             strcat(ruta,dirent->d_name);
  592.             cmdStat2(ruta,0,1,dirent->d_name,0);
  593.        }
  594.     }//
  595.  
  596.         if(flagHid==1 && flagLong==0 && flagAcc==0 && flagReca==0 && flagRecb==0){
  597.             printf("************%s\n",trozos[numtrozos-1]);
  598.             while((dirent = readdir(d))!= NULL){
  599.             printf("%s\n", dirent->d_name);
  600.         }
  601.       }
  602.  
  603.       if(flagLong==1 && flagHid == 0 && flagAcc==0 && flagReca==0 && flagRecb==0){
  604.  
  605.  
  606.           printf("************%s\n",trozos[numtrozos-1]);
  607.             while((dirent = readdir(d))!= NULL){
  608.             getcwd(ruta, PATH_MAX);
  609.             strcat(ruta,"/");
  610.             strcat(ruta,trozos[numtrozos-1]);
  611.             strcat(ruta,"/");
  612.             strcat(ruta,dirent->d_name);
  613.             if(dirent->d_name[0] != '.'){
  614.             cmdStat2(ruta,1,0,dirent->d_name,0);
  615.         }
  616.        }
  617.       }
  618.  
  619.  
  620.       if(flagLong==1 && flagHid == 1 && flagReca ==0 && flagRecb==0){
  621.           printf("************%s\n",trozos[numtrozos-1]);
  622.             while((dirent = readdir(d))!= NULL){
  623.             getcwd(ruta, PATH_MAX);
  624.             strcat(ruta,"/");
  625.             strcat(ruta,trozos[numtrozos-1]);
  626.             strcat(ruta,"/");
  627.             strcat(ruta,dirent->d_name);
  628.             cmdStat2(ruta,1,0,dirent->d_name,0);
  629.        }
  630.       }
  631.  
  632.  
  633.       if(flagReca==1){
  634.         cmdListaREC(trozos[numtrozos-1],0,flagHid, flagLong);
  635.       }else if(flagRecb==1){
  636.         cmdListaREC(trozos[numtrozos-1],1,flagHid, flagLong);
  637.       }
  638.  
  639.  
  640.     }
  641. }
  642.  
  643.  
  644.  
  645. //Comando ayuda
  646. void cmdAyuda() {
  647.     if (numtrozos == 1) {
  648.         printf("'ayuda cmd' donde cmd es uno de los siguientes comandos:\n"
  649.                "fin salir bye fecha pid autores hist comando carpeta infosis ayuda\n");
  650.     } else if (numtrozos > 1 && strcmp(trozos[1], "fin") == 0) {
  651.         printf("fin \tTermina la ejecucion del shell\n");
  652.     } else if (numtrozos > 1 && strcmp(trozos[1], "salir") == 0) {
  653.         printf("salir \tTermina la ejecucion del shell\n");
  654.     } else if (numtrozos > 1 && strcmp(trozos[1], "bye") == 0) {
  655.         printf("bye \tTermina la ejecucion del shell\n");
  656.     } else if (numtrozos > 1 && strcmp(trozos[1], "fecha") == 0) {
  657.         printf("fecha [-d|.h\tMuestra la fecha y o la hora actual\n");
  658.     } else if (numtrozos > 1 && strcmp(trozos[1], "pid") == 0) {
  659.         printf("pid [-p]\tMuestra el pid del shell o de su proceso padre\n");
  660.     }else if (numtrozos > 1 && strcmp(trozos[1], "autores") == 0) {
  661.         printf("autores [-n|-l]\tMuestra los nombres y logins de los autores\n");
  662.     }else if (numtrozos > 1 && strcmp(trozos[1], "hist") == 0) {
  663.         printf("hist [-c|-N]\tMuestra el historico de comandos, con -c lo borra\n");
  664.     }else if (numtrozos > 1 && strcmp(trozos[1], "comando") == 0) {
  665.         printf("comando [-N]\tRepite el comando N (del historico)\n");
  666.     }else if (numtrozos > 1 && strcmp(trozos[1], "carpeta") == 0) {
  667.         printf("carpeta [dir]\tCambia (o muestra) el directorio actual del shell\n");
  668.     }else if (numtrozos > 1 && strcmp(trozos[1], "carpeta") == 0) {
  669.         printf("infosis \tMuestra informacion de la maquina donde corre el shell\n");
  670.     }else if (numtrozos > 1 && strcmp(trozos[1], "ayuda") == 0) {
  671.         printf("ayuda [cmd]\tMuestra ayuda sobre los comandos\n");
  672.     }else if (numtrozos > 1 && strcmp(trozos[1], "create") == 0) {
  673.         printf("create [-f] [name]  Crea un directorio o un fichero (-f)\n");
  674.     }else if (numtrozos > 1 && strcmp(trozos[1], "stat") == 0) {
  675.         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");
  676.     }else if (numtrozos > 1 && strcmp(trozos[1], "list") == 0) {
  677.         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");
  678.     }else if (numtrozos > 1 && strcmp(trozos[1], "delete") == 0) {
  679.         printf("delete [name1 name2 ..] Borra ficheros o directorios vacios\n");
  680.     }else if (numtrozos > 1 && strcmp(trozos[1], "deltree") == 0) {
  681.         printf("deltree [name1 name2 ..]    Borra ficheros o directorios no vacios recursivamente\n");
  682.     }
  683. }
  684.  
  685. struct cm_entrada{
  686.     char *cm_nombre;
  687.     void (*cm_fun)();
  688. };
  689.  
  690. struct cm_entrada cm_tabla[] = {
  691.     {"autores", cmdAutores},
  692.     {"ayuda", cmdAyuda},
  693.     {"bye", cmdFin},
  694.     {"carpeta", cmdCarpeta},
  695.     {"comando", cmdComandoN},
  696.     {"create", cmdCreate},
  697.     {"delete", cmdDelete},
  698.     {"fecha", cmdFecha},
  699.     {"fin", cmdFin},
  700.     {"hist", cmdHist},
  701.     {"infosis", cmdInfosis},
  702.     {"pid", cmdPid},
  703.     {"salir", cmdFin},
  704.     {"stat", cmdStat},
  705.     {"list", cmdList},
  706. };
  707.  
  708.  
  709. void ejecutarComando(char *linea){
  710.     int i;
  711.     char *copialinea = strdup(linea);
  712.     numtrozos = TrocearCadena(copialinea, trozos);
  713.  
  714.     if(numtrozos == 0) {free(copialinea); return;}
  715.     for( i=0; ; i++){
  716.         if(cm_tabla[i].cm_nombre == NULL){
  717.             printf("%s: comando no reconocido\n", trozos[0]);
  718.             free(copialinea);
  719.             break;
  720.         }
  721.         if(strcmp(cm_tabla[i].cm_nombre, trozos[0]) == 0){
  722.             cm_tabla[i].cm_fun();
  723.             free(copialinea);
  724.             break;
  725.         }
  726.     }
  727. }
  728.  
  729. int main(){
  730.  
  731.     while(1){
  732.         printf("@>");       //Prompt
  733.         if( fgets(linea, 4096, stdin) == NULL ){
  734.             exit(0);
  735.         }
  736.         ejecutarComando(linea);
  737.         histInsert(linea);
  738.     }
  739.     for(int i=0; i <= nhist; i++){
  740.         free(Hist[i]);
  741.     }
  742. }
  743.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement