Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- Javier Sobrino González
- Javier Loureiro Pérez
- */
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <unistd.h>
- #include <time.h>
- #include <sys/types.h>
- #include <limits.h>
- #include <sys/stat.h>
- #include <errno.h>
- #include <sys/utsname.h>
- #include <pwd.h>
- #include <grp.h>
- #include <dirent.h>
- #include <sys/shm.h>
- #include <sys/mman.h>
- #include <fcntl.h>
- #include <sys/wait.h>
- #include "ListaHistorial.h"
- #include "ListaBloques.h"
- #include "ListaShared.h"
- #include "ListaMmap.h"
- #define MaxTrozos 512
- #define MaxHist 4096
- #define TAMANO 2048
- char linea[4096];
- char *trozos[MaxTrozos];
- int numtrozos;
- int EntraEnBloque=0;
- int EntraEnShared=0;
- int EntraEnMmap=0;
- static int varMem;
- static int varMem2;
- static int varMem3;
- void ejecutarComando(char *linea);
- int TrocearCadena(char * cadena, char * trozos[]){
- int i=1;
- if ((trozos[0]=strtok(cadena," \n\t"))==NULL)
- return 0;
- while ((trozos[i]=strtok(NULL," \n\t"))!=NULL)
- i++;
- return i;
- }
- //Comandos del shell
- //Comando autores
- void cmdAutores(){
- char flagLogin= 1, flagNombre=1;
- if(numtrozos > 1 && strcmp(trozos[1], "-l") == 0)
- flagNombre= 0;
- if(numtrozos > 1 && strcmp(trozos[1], "-n") == 0)
- flagLogin = 0;
- if(flagLogin){
- printf("Login: j.loureirop\n");
- printf("Login: javier.sobrino\n");
- }
- if(flagNombre){
- printf("Nombre: Javier Loureiro\n");
- printf("Nombre: Javier Sobrino\n");
- }
- }
- //Comando Fin (sale del shell)
- void cmdFin(){
- exit(0);
- }
- //Comando Pid
- void cmdPid(){
- if(numtrozos == 1)
- printf("Pid del shell: %d\n", getpid());
- else if (numtrozos > 1)
- printf("Pid del padre del shell: %d\n", getppid());
- }
- //Comando Carpeta
- void cmdCarpeta(){
- char ruta[PATH_MAX];
- if(numtrozos == 1){
- if(getcwd(ruta, PATH_MAX) == NULL){
- perror("getcwd");
- return;
- }
- else{
- printf("%s\n", ruta);
- return;
- }
- }
- else if(numtrozos > 1){
- if (chdir(trozos[1]) == -1) {perror("chdir"); return;}
- else
- chdir(trozos[1]);
- }
- }
- //Comando comandoN
- void cmdComandoN(){
- int n;
- if(numtrozos == 1) {printf("Falta número de comando \n"); return;}
- n = atoi(trozos[1]);
- if(n < 0 || n >= histNumElementos()) {printf("Número de comando fuera de rango \n"); return;}
- else {
- printf(" %s",histElemento(n));
- }
- }
- //Comando fecha
- void cmdFecha(){
- struct tm *t;
- time_t tiempo;
- if(time(&tiempo) == -1) {perror("time"); return;}
- t = localtime(&tiempo);
- if(numtrozos > 1 && strcmp(trozos[1], "-d") == 0)
- printf("%d/%d/%d\n", t->tm_mday, t->tm_mon, t->tm_year+1900);
- else if(numtrozos > 1 && strcmp(trozos[1], "-h") == 0)
- printf("%d:%d:%d\n", t->tm_hour, t->tm_min, t->tm_sec);
- else{
- printf("%d:%d:%d\n", t->tm_hour, t->tm_min, t->tm_sec);
- printf("%d/%d/%d\n", t->tm_mday, t->tm_mon, t->tm_year+1900);
- }
- }
- //Comando historial
- void histImprimeN(){
- int i;
- for(i = 0; i <= trozos[1][1] - 48; i++){
- printf("%d->%s", i, histElemento(i));
- }
- }
- void cmdHist(){
- int i;
- if(numtrozos == 1){
- for(i = 0; i < histNumElementos() ; i++){
- printf("%d->%s", i, histElemento(i));
- }
- }
- else if(numtrozos > 1 && strcmp(trozos[1], "-c") == 0){
- histBorrar();
- return;
- }
- else if(numtrozos > 1)
- histImprimeN();
- }
- //Comando infosis
- void cmdInfosis(){
- struct utsname system;
- uname(&system);
- printf("%s (%s), OS: %s %s-%s\n", system.nodename, system.machine, system.sysname,
- system.release, system.version);
- }
- /*PRACTICA 1*/
- //Comando create
- void cmdCreate(){
- char ruta[PATH_MAX];
- if (numtrozos==1){
- getcwd(ruta, PATH_MAX);
- printf("%s\n", ruta);
- return;
- }else if(numtrozos==2){
- if(strcmp(trozos[1],"-f")==0){
- getcwd(ruta, PATH_MAX);
- printf("%s\n", ruta);
- return;
- }else{
- mkdir(trozos[1],0777);
- if(errno != 0){
- printf("Imposible crear: %s\n",strerror(errno));
- }
- }
- }else if(numtrozos==3){
- if(strcmp(trozos[1], "-f")==0){
- getcwd(ruta, PATH_MAX);
- strcat(ruta,"/");
- strcat(ruta,trozos[2]);
- FILE *fp;
- fp = fopen(trozos[2],"w");
- if(fp != NULL){
- fclose(fp);
- }
- if(errno != 0){
- printf("Imposible crear: %s\n",strerror(errno));
- }
- }
- }
- }
- //Comando borrar
- void cmdDelete(){
- int i;
- for(i=1;i<numtrozos;i++){
- if(errno != 0){
- printf("%s\n",strerror(errno));
- }
- remove(trozos[i]);
- if(errno != 0){
- printf("%s\n",strerror(errno));
- }
- }
- }
- //
- void st_mode_to_str(mode_t st_mode, char *mode){
- mode[0]= ' '; //(S_ISDIR(fileStat.st_mode)) ? 'd' : '-';
- mode[1]= (st_mode & S_IRUSR) ? 'r' : '-';
- mode[2]= (st_mode & S_IWUSR) ? 'w' : '-';
- mode[3]= (st_mode & S_IXUSR) ? 'x' : '-';
- mode[4]= (st_mode & S_IRGRP) ? 'r' : '-';
- mode[5]= (st_mode & S_IWGRP) ? 'w' : '-';
- mode[6]= (st_mode & S_IXGRP) ? 'x' : '-';
- mode[7]= (st_mode & S_IROTH) ? 'r' : '-';
- mode[8]= (st_mode & S_IWOTH) ? 'w' : '-';
- mode[9]= (st_mode & S_IXOTH) ? 'x' : '-';
- mode[10]= 0;
- }
- //Comando stat
- void cmdStat(){
- struct stat *statbuf;
- statbuf = malloc(sizeof(struct stat));
- char ruta[PATH_MAX];
- int flagLong=0, flagAcc=0, flagLink=0; //flags para detectar las opciones que se pasan
- struct passwd *pws; //Id dispositivo
- struct group *grp; //Id grupo
- struct tm dtc, dta;
- //Introducen stat
- if (numtrozos == 1)
- cmdCarpeta();
- //Introducen stat (algo)
- if(numtrozos == 2){
- getcwd(ruta, PATH_MAX);
- strcat(ruta, "/");
- strcat(ruta, trozos[1]);
- if(lstat(ruta, statbuf)== -1){
- printf("Ha habido un error: %s\n", strerror(errno));
- }
- else{
- printf("%ld %s\n", statbuf->st_size, trozos[1]);
- }
- }
- if(numtrozos>2){
- //Obtenemos los flags que se pasan
- for(int i = 1; i < numtrozos && trozos[i][0] == '-' ; i++){
- if(strcmp(trozos[i], "-long") == 0) flagLong = 1;
- else if(strcmp(trozos[i],"-link") == 0) flagLink = 1;
- else if(strcmp(trozos[i], "-acc") == 0) flagAcc = 1;
- }
- getcwd(ruta, PATH_MAX);
- strcat(ruta, "/");
- strcat(ruta, trozos[numtrozos-1]);
- if(lstat(ruta, statbuf)== -1){
- printf("Ha habido un error: %s\n", strerror(errno));
- }
- else{
- pws = getpwuid(statbuf->st_uid);
- grp = getgrgid(statbuf->st_gid);
- dtc = *(gmtime(&statbuf->st_ctime));
- dta = *(gmtime(&statbuf->st_atime));
- if(flagAcc == 1 && flagLong==0){
- printf("%d/%d/%d-%d:%.2d ", dta.tm_year + 1900, dta.tm_mon+1, dta.tm_mday,
- dta.tm_hour+2, dta.tm_min);
- }
- if(flagLong==1){
- //strmode(st_mode, statbuf->st_mode);
- char mode[11];
- st_mode_to_str(statbuf->st_mode,mode);
- printf("%d/%d/%d-%d:%.2d %ld, ( %ld) %s %s %s ", dtc.tm_year + 1900, dtc.tm_mon+1, dtc.tm_mday,
- dtc.tm_hour+2, dtc.tm_min,statbuf->st_nlink, statbuf->st_ino, pws->pw_name, grp->gr_name, mode);
- }
- if(flagLink==1){
- //hacer links
- }
- printf("%ld %s\n", statbuf->st_size, trozos[numtrozos-1]);
- }
- }
- }
- //Stat 2 (para list)
- void cmdStat2(const char d_name[],int flagLong, int flagAcc, char ruta[], int REC){
- struct stat *statbuf;
- statbuf = malloc(sizeof(struct stat));
- struct passwd *pws; //Id dispositivo
- struct group *grp; //Id grupo
- struct tm dtc, dta;
- if(numtrozos>2){
- if(REC==1){
- if(lstat(ruta, statbuf)== -1){
- }
- else{
- pws = getpwuid(statbuf->st_uid);
- grp = getgrgid(statbuf->st_gid);
- dtc = *(gmtime(&statbuf->st_ctime));
- dta = *(gmtime(&statbuf->st_atime));
- if(flagAcc == 1 && flagLong==0){
- printf("%d/%d/%d-%d:%.2d ", dta.tm_year + 1900, dta.tm_mon+1, dta.tm_mday,
- dta.tm_hour+2, dta.tm_min);
- }
- if(flagLong==1){
- //strmode(st_mode, statbuf->st_mode);
- char mode[11];
- st_mode_to_str(statbuf->st_mode,mode);
- printf("%d/%d/%d-%d:%.2d %ld, ( %ld) %s %s %s ", dtc.tm_year + 1900, dtc.tm_mon+1, dtc.tm_mday,
- dtc.tm_hour+2, dtc.tm_min,statbuf->st_nlink, statbuf->st_ino, pws->pw_name, grp->gr_name, mode);
- }
- printf("%ld %s\n", statbuf->st_size, d_name);
- }
- }
- else if(REC==0){
- if(lstat(d_name, statbuf)== -1){
- }
- else{
- pws = getpwuid(statbuf->st_uid);
- grp = getgrgid(statbuf->st_gid);
- dtc = *(gmtime(&statbuf->st_ctime));
- dta = *(gmtime(&statbuf->st_atime));
- if(flagAcc == 1 && flagLong==0){
- printf("%d/%d/%d-%d:%.2d ", dta.tm_year + 1900, dta.tm_mon+1, dta.tm_mday,
- dta.tm_hour+2, dta.tm_min);
- }
- if(flagLong==1){
- //strmode(st_mode, statbuf->st_mode);
- char mode[11];
- st_mode_to_str(statbuf->st_mode,mode);
- printf("%d/%d/%d-%d:%.2d %ld, ( %ld) %s %s %s ", dtc.tm_year + 1900, dtc.tm_mon+1, dtc.tm_mday,
- dtc.tm_hour+2, dtc.tm_min,statbuf->st_nlink, statbuf->st_ino, pws->pw_name, grp->gr_name, mode);
- }
- printf("%ld %s\n", statbuf->st_size, ruta);
- }
- }
- }
- }
- void cmdListaREC(const char *dirname,int fun, int flagHid, int flagLong){
- if(fun==0){
- DIR* dir = opendir(dirname);
- struct dirent* dirent;
- dirent = readdir(dir);
- char path[100];
- if (dir == NULL) {
- return;
- }
- printf("************%s\n",dirname);
- while (dirent != NULL) {
- strcpy(path, dirname);
- strcat(path, "/");
- strcat(path, dirent->d_name);
- if(dirent->d_name[0] != '.' || flagHid == 1){
- if(flagLong==1){
- cmdStat2(dirent->d_name,1,1,path,1);
- }else{
- printf("%hhd %s\n", dirent->d_type, dirent->d_name);
- }
- }
- dirent = readdir(dir);
- }
- closedir(dir);
- dir = opendir(dirname);
- if (dir == NULL) {
- return;
- }
- dirent = readdir(dir);
- while (dirent != NULL) {
- if (dirent->d_type == DT_DIR && strcmp(dirent->d_name, ".") != 0 && strcmp(dirent->d_name, "..") != 0 && (dirent->d_name[0] != '.'|| flagHid==1)){
- char path[100];
- strcpy(path, dirname);
- strcat(path, "/");
- strcat(path, dirent->d_name);
- cmdListaREC(path,0,flagHid,flagLong);
- }
- dirent = readdir(dir);
- }
- closedir(dir);
- }
- else if (fun==1){
- DIR* dir = opendir(dirname);
- struct dirent* dirent;
- dirent = readdir(dir);
- if (dir == NULL) {
- return;
- }
- while (dirent != NULL) {
- if (dirent->d_type == DT_DIR && strcmp(dirent->d_name, ".") != 0 && strcmp(dirent->d_name, "..") != 0 && (dirent->d_name[0] != '.' || flagHid ==1)) {
- char path[100];
- printf("************%s/%s\n",dirname,dirent->d_name);
- strcpy(path, dirname);
- strcat(path, "/");
- strcat(path, dirent->d_name);
- cmdListaREC(path,1,flagHid,flagLong);
- printf("************%s\n",dirname);
- }
- dirent = readdir(dir);
- }
- closedir(dir);
- dir = opendir(dirname);
- if (dir == NULL) {
- return;
- }
- dirent = readdir(dir);
- while (dirent != NULL) {
- char path[100];
- strcpy(path, dirname);
- strcat(path, "/");
- strcat(path, dirent->d_name);
- if(dirent->d_name[0] != '.' || flagHid == 1){
- if(flagLong==1){
- cmdStat2(dirent->d_name,1,1,path,1);
- }else{
- printf("%hhd %s\n", dirent->d_type, dirent->d_name);
- }
- }
- dirent = readdir(dir);
- }
- closedir(dir);
- }
- }
- //Comando list
- void cmdList(){
- char ruta[PATH_MAX];
- int flagHid=0,flagLong=0, flagAcc=0, flagReca=0, flagRecb=0; //flags para detectar las opciones que se pasan
- DIR *d;
- struct dirent *dirent;
- getcwd(ruta, PATH_MAX);
- strcat(ruta, "/");
- strcat(ruta, trozos[numtrozos-1]);
- if(numtrozos==1)
- cmdCarpeta();
- if(numtrozos==2){
- if((d=opendir(ruta)) == NULL){perror("opendir"); return;}
- printf("************%s\n",trozos[numtrozos-1]);
- while((dirent = readdir(d))!= NULL){
- if(dirent->d_name[0] != '.'){
- printf("%s\n", dirent->d_name);
- }
- }
- }
- if(numtrozos>2){
- //Obtenemos los flags que se pasan
- for(int i = 1; i < numtrozos && trozos[i][0] == '-' ; i++){
- if(strcmp(trozos[i],"-hid")==0) flagHid = 1;
- else if(strcmp(trozos[i], "-long") == 0) flagLong = 1;
- else if(strcmp(trozos[i], "-acc") == 0) flagAcc = 1;
- else if(strcmp(trozos[i], "-reca") == 0) flagReca = 1;
- else if(strcmp(trozos[i], "-recb") == 0) flagRecb = 1;
- }
- if((d=opendir(ruta)) == NULL){perror("opendir"); return;}
- if(flagAcc==1 && flagLong==0 && flagHid==0){
- printf("************%s\n",trozos[numtrozos-1]);
- while((dirent = readdir(d))!= NULL){
- getcwd(ruta, PATH_MAX);
- strcat(ruta,"/");
- strcat(ruta,trozos[numtrozos-1]);
- strcat(ruta,"/");
- strcat(ruta,dirent->d_name);
- if(dirent->d_name[0] != '.'){
- cmdStat2(ruta,0,1,dirent->d_name,0);
- }
- }
- }//
- if(flagAcc==1 && flagLong==0 && flagHid==1){
- printf("************%s\n",trozos[numtrozos-1]);
- while((dirent = readdir(d))!= NULL){
- getcwd(ruta, PATH_MAX);
- strcat(ruta,"/");
- strcat(ruta,trozos[numtrozos-1]);
- strcat(ruta,"/");
- strcat(ruta,dirent->d_name);
- cmdStat2(ruta,0,1,dirent->d_name,0);
- }
- }//
- if(flagHid==1 && flagLong==0 && flagAcc==0 && flagReca==0 && flagRecb==0){
- printf("************%s\n",trozos[numtrozos-1]);
- while((dirent = readdir(d))!= NULL){
- printf("%s\n", dirent->d_name);
- }
- }
- if(flagLong==1 && flagHid == 0 && flagAcc==0 && flagReca==0 && flagRecb==0){
- printf("************%s\n",trozos[numtrozos-1]);
- while((dirent = readdir(d))!= NULL){
- getcwd(ruta, PATH_MAX);
- strcat(ruta,"/");
- strcat(ruta,trozos[numtrozos-1]);
- strcat(ruta,"/");
- strcat(ruta,dirent->d_name);
- if(dirent->d_name[0] != '.'){
- cmdStat2(ruta,1,0,dirent->d_name,0);
- }
- }
- }
- if(flagLong==1 && flagHid == 1 && flagReca ==0 && flagRecb==0){
- printf("************%s\n",trozos[numtrozos-1]);
- while((dirent = readdir(d))!= NULL){
- getcwd(ruta, PATH_MAX);
- strcat(ruta,"/");
- strcat(ruta,trozos[numtrozos-1]);
- strcat(ruta,"/");
- strcat(ruta,dirent->d_name);
- cmdStat2(ruta,1,0,dirent->d_name,0);
- }
- }
- if(flagReca==1){
- cmdListaREC(trozos[numtrozos-1],0,flagHid, flagLong);
- }else if(flagRecb==1){
- cmdListaREC(trozos[numtrozos-1],1,flagHid, flagLong);
- }
- }
- }
- // PRÁCTICA 2
- char * nombreMes(int mes){
- static char* meses[12]={"Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"};
- return meses[mes-1];
- }
- void * ObtenerMemoriaShmget (key_t clave, size_t tam)
- {
- void * p;
- int aux,id,flags=0777;
- struct shmid_ds s;
- time_t t = time(NULL);
- struct tm tm = *localtime(&t);
- if (tam) /*tam distito de 0 indica crear */
- flags=flags | IPC_CREAT | IPC_EXCL;
- if (clave==IPC_PRIVATE) /*no nos vale*/
- {errno=EINVAL; return NULL;}
- if ((id=shmget(clave, tam, flags))==-1)
- return (NULL);
- if ((p=shmat(id,NULL,0))==(void*) -1){
- aux=errno;
- if (tam)
- shmctl(id,IPC_RMID,NULL);
- errno=aux;
- return (NULL);
- }
- shmctl (id,IPC_STAT,&s);
- histSharedInsert(p, s.shm_segsz,tm.tm_mon + 1,tm.tm_mday,tm.tm_hour,tm.tm_min,"shared",clave);
- return (p);
- }
- void * ObtenerMemoriaShmget2 (key_t clave, size_t tam)
- {
- void * p;
- int aux,id;
- struct shmid_ds s;
- time_t t = time(NULL);
- struct tm tm = *localtime(&t);
- if (clave==IPC_PRIVATE) /*no nos vale*/
- {
- errno=EINVAL; return NULL;
- }
- if ((id=shmget(clave, tam, 0))==-1){
- return (NULL);
- }
- if ((p=shmat(id,NULL,0))==(void*) -1){
- aux=errno;
- if (tam)
- shmctl(id,IPC_RMID,NULL);
- errno=aux;
- return (NULL);
- }
- shmctl (id,IPC_STAT,&s);
- histSharedInsert(p, s.shm_segsz,tm.tm_mon + 1,tm.tm_mday,tm.tm_hour,tm.tm_min,"shared",clave);
- return (p);
- }
- void * MapearFichero (char * fichero, int protection)
- {
- int df, map=MAP_PRIVATE,modo=O_RDONLY;
- struct stat s;
- void *p;
- time_t t = time(NULL);
- struct tm tm = *localtime(&t);
- if (protection&PROT_WRITE)
- modo=O_RDWR;
- if (stat(fichero,&s)==-1 || (df=open(fichero, modo))==-1)
- return NULL;
- if ((p=mmap (NULL,s.st_size, protection,map,df,0))==MAP_FAILED)
- return NULL;
- histMmapInsert(p, s.st_size,tm.tm_mon + 1,tm.tm_mday,tm.tm_hour,tm.tm_min,trozos[2],df);
- return p;
- }
- void cmdAllocate(){
- int *p;
- int i;
- time_t t = time(NULL);
- struct tm tm = *localtime(&t);
- if(numtrozos==1){
- printf("******Lista de bloques asignados para el proceso %d\n", getpid());
- for(i=0;i<nbloq;i++){
- 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);
- }
- for(i=0;i<nshared;i++){
- 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);
- }
- for(i=0;i<nmmap;i++){
- 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);
- }
- //////////IMPRIMIR RESTO DE LISTAS
- }
- else if(numtrozos>1 && strcmp(trozos[1],"-malloc")==0){
- if(numtrozos==2){
- printf("******Lista de bloques asignados malloc para el proceso %d\n", getpid());
- for(i=0;i<nbloq;i++){
- 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);
- }
- }
- else if(strcmp(trozos[2],"0")==0){
- printf("No se asignan bloques de 0 bytes\n");
- }else{
- p=malloc(atoi(trozos[2]));
- printf("Asignados %s bytes en %p\n",trozos[2],p);
- histBloqInsert(p,atoi(trozos[2]),tm.tm_mon + 1,tm.tm_mday,tm.tm_hour,tm.tm_min,"malloc");
- }
- }
- else if(numtrozos>1 && strcmp(trozos[1],"-createshared")==0){
- key_t cl;
- size_t tam;
- void *p;
- if(numtrozos==2 || numtrozos==3){
- printf("******Lista de bloques asignados shared para el proceso %d\n", getpid());
- for(i=0;i<nshared;i++){
- 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);
- }
- }else{
- cl=(key_t) strtoul(trozos[2],NULL,10);
- tam=(size_t) strtoul(trozos[3],NULL,10);
- if (tam==0) {
- printf ("No se asignan bloques de 0 bytes\n");
- return;
- }
- if ((p=ObtenerMemoriaShmget(cl,tam))!=NULL)
- printf ("Asignados %lu bytes en %p\n",(unsigned long) tam, p);
- else
- printf ("Imposible asignar memoria compartida clave %lu:%s\n",(unsigned long) cl,strerror(errno));
- }
- }
- else if(numtrozos>1 && strcmp(trozos[1],"-shared")==0){
- if(numtrozos==2){
- printf("******Lista de bloques asignados shared para el proceso %d\n", getpid());
- for(i=0;i<nshared;i++){
- 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);
- }
- }else{
- key_t cl;
- size_t tam;
- void *p;
- for(i=0;i<nshared && histSharedElemento(i)->key!=atoi(trozos[2]);i++);
- cl=(key_t) strtoul(trozos[2],NULL,10);
- tam=(size_t) (i<nshared) ? histSharedElemento(i)->Bytes : 10;
- if (tam==0) {
- printf ("No se asignan bloques de 0 bytes\n");
- return;
- }
- if ((p=ObtenerMemoriaShmget2(cl,tam))!=NULL)
- printf ("Memoria compartida de clave %d en %p\n",histSharedElemento(i)->key, p);
- else
- printf ("Imposible asignar memoria compartida clave %lu:%s\n",(unsigned long) cl,strerror(errno));
- }
- }
- else if(numtrozos>1 && strcmp(trozos[1],"-mmap")==0){
- if(numtrozos==2 || numtrozos==3){
- printf("******Lista de bloques asignados mmap para el proceso %d\n", getpid());
- for(i=0;i<nmmap;i++){
- 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);
- }
- }else{
- char *perm;
- void *p;
- int protection=0;
- if ((perm=trozos[3])!=NULL && strlen(perm)<4) {
- if (strchr(perm,'r')!=NULL) protection|=PROT_READ;
- if (strchr(perm,'w')!=NULL) protection|=PROT_WRITE;
- if (strchr(perm,'x')!=NULL) protection|=PROT_EXEC;
- }
- if ((p=MapearFichero(trozos[2],protection))==NULL)
- perror ("Imposible mapear fichero");
- else
- printf ("fichero %s mapeado en %p\n", trozos[2], p);
- }
- }
- }
- void do_DeallocateDelkey (char *key)
- {
- key_t clave;
- int id;
- if (key==NULL || (clave=(key_t) strtoul(key,NULL,10))==IPC_PRIVATE){
- printf (" delkey necesita clave_valida\n");
- return;
- }
- if ((id=shmget(clave,0,0666))==-1){
- perror ("shmget: imposible obtener memoria compartida");
- return;
- }
- if (shmctl(id,IPC_RMID,NULL)==-1)
- perror ("shmctl: imposible eliminar memoria compartida\n");
- }
- void cmdDeallocate(){
- int i;
- if(numtrozos==1){
- printf("******Lista de bloques asignados para el proceso %d\n", getpid());
- for(i=0;i<nbloq;i++){
- 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);
- }
- for(i=0;i<nshared;i++){
- 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);
- }
- for(i=0;i<nmmap;i++){
- 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);
- }
- //////////IMPRIMIR RESTO DE LISTAS
- }
- else if(numtrozos>1 && strcmp(trozos[1],"-malloc")==0){
- if(numtrozos==2){
- printf("******Lista de bloques asignados malloc para el proceso %d\n", getpid());
- for(i=0;i<nbloq;i++){
- 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);
- }
- }
- else if(strcmp(trozos[2],"0")==0){
- printf("No se asignan bloques de 0 bytes\n");
- }else{
- if(nbloq ==0){
- printf("No hay bloque de ese tamaño asignado con malloc\n");
- }else{
- for(i=0;i<nbloq && histBloqElemento(i)->Bytes != atoi(trozos[2]) ;i++);
- if(i>=nbloq){
- printf("No hay bloque de ese tamaño asignado con malloc\n");
- }else{
- free(histBloqElemento(i)->dir);
- for(;i<nbloq-1;i++){
- HistBloq[i] =HistBloq[i+1];
- }
- nbloq--;
- }
- }
- }
- }else if(numtrozos>1 && strcmp(trozos[1],"-delkey")==0){
- if(numtrozos==2){
- printf("del_key necesita una clave válida\n");
- }else{
- do_DeallocateDelkey (trozos[2]);
- }
- }
- else if(numtrozos>1 && strcmp(trozos[1],"-shared")==0){
- if(numtrozos==2){
- printf("******Lista de bloques asignados shared para el proceso %d\n", getpid());
- for(i=0;i<nshared;i++){
- 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);
- }
- }else{
- if(nshared ==0){
- printf("No hay bloque de esa clave mapeado en el proceso\n");
- }else{
- //NO HACER DEALLOCATE DELKEY
- for(i=0;i<nshared && histSharedElemento(i)->key != atoi(trozos[2]) ;i++);
- if(i>=nshared){
- printf("No hay bloque de esa clave mapeado en el proceso\n");
- }else{
- for(;i<nshared-1;i++){
- HistShared[i] =HistShared[i+1];
- }
- nshared--;
- }
- }
- }
- }
- else if(numtrozos>1 && strcmp(trozos[1],"-mmap")==0){
- if(numtrozos==2){
- printf("******Lista de bloques asignados mmap para el proceso %d\n", getpid());
- for(i=0;i<nmmap;i++){
- 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);
- }
- }else{
- if(nmmap ==0){
- printf("Fichero %s no mapeado\n",trozos[2]);
- }else{
- for(i=0;i<nmmap && strcmp(histMmapElemento(i)->nombre,trozos[2]) != 0 ;i++);
- if(i>=nmmap){
- printf("Fichero %s no mapeado\n",trozos[2]);
- }else{
- munmap(histMmapElemento(i)->dir,histMmapElemento(i)->Bytes);
- for(;i<nmmap-1;i++){
- HistMmap[i]=HistMmap[i+1];
- }
- nmmap--;
- }
- }
- }
- }
- else{
- int flagNoEsta=0;
- EntraEnBloque=0;
- EntraEnShared=0;
- EntraEnMmap=0;
- if(nbloq ==0 && nshared ==0 && nmmap ==0){
- printf("Direccion %s no asignada con malloc, shared o mmap\n",trozos[1]);
- }else{
- if(nbloq!=0){
- EntraEnBloque=1;
- char comp[20];
- sprintf(comp,"%p",histBloqElemento(0)->dir);
- for(i=0;i<nbloq && strcmp(comp,trozos[1])!=0 ;i++){
- if(i!=nbloq-1){
- sprintf(comp,"%p",histBloqElemento(i+1)->dir);
- }
- }
- if(i<nbloq){
- free(histBloqElemento(i)->dir);
- for(;i<nbloq-1;i++){
- HistBloq[i] =HistBloq[i+1];
- }
- nbloq--;
- }else{flagNoEsta++;}
- }if(nshared!=0){
- EntraEnShared=1;
- char comp[20];
- sprintf(comp,"%p",histSharedElemento(0)->dir);
- for(i=0;i<nshared && strcmp(comp,trozos[1])!=0 ;i++){
- if(i!=nshared-1){
- sprintf(comp,"%p",histSharedElemento(i+1)->dir);
- }
- }
- if(i<nshared){
- //NO HACER DEALLOCATE DELKEY
- for(;i<nshared-1;i++){
- HistShared[i] =HistShared[i+1];
- }
- nshared--;
- }else{flagNoEsta++;}
- }if(nmmap!=0){
- EntraEnMmap=1;
- char comp[20];
- sprintf(comp,"%p",histMmapElemento(0)->dir);
- for(i=0;i<nmmap && strcmp(comp,trozos[1])!=0 ;i++){
- if(i!=nmmap-1){
- sprintf(comp,"%p",histMmapElemento(i+1)->dir);
- }
- }
- if(i<nmmap){
- munmap(histMmapElemento(i)->dir,histMmapElemento(i)->Bytes);
- for(;i<nmmap-1;i++){
- HistMmap[i]=HistMmap[i+1];
- }
- nmmap--;
- }else{flagNoEsta++;}
- }if((flagNoEsta==3) || (flagNoEsta==1 && !EntraEnBloque && !EntraEnMmap) || (flagNoEsta==1 && !EntraEnBloque && !EntraEnShared) || (flagNoEsta==1 && !EntraEnShared && !EntraEnMmap) || (flagNoEsta==2 && !EntraEnBloque) || (flagNoEsta==2 && !EntraEnShared) || (flagNoEsta==2 && !EntraEnMmap)){
- printf("Direccion %s no asignada con malloc, shared o mmap\n",trozos[1]);
- }
- }
- }
- }
- void cmdMemdump(){
- int* dir = (int*)strtol(trozos[1],&trozos[1],16);
- int i;
- unsigned char data;
- for(i=0;i<25;i++){
- data= *(((unsigned char*)&dir) + i);
- printf("%02x ",data);
- }
- printf("\n");
- }
- void Recursiva (int n)
- {
- char automatico[TAMANO];
- static char estatico[TAMANO];
- printf ("parametro:%3d(%p) array %p, arr estatico %p\n",n,&n,automatico, estatico);
- if (n>0)
- Recursiva(n-1);
- }
- void cmdRecurse(){
- if(numtrozos>1){
- Recursiva(atoi(trozos[1]));
- }else return;
- }
- void Do_pmap (void) /*sin argumentos*/
- { pid_t pid; /*hace el pmap (o equivalente) del proceso actual*/
- char elpid[32];
- char *argv[4]={"pmap",elpid,NULL};
- sprintf (elpid,"%d", (int) getpid());
- if ((pid=fork())==-1){
- perror ("Imposible crear proceso");
- return;
- }
- if (pid==0){
- if (execvp(argv[0],argv)==-1)
- perror("cannot execute pmap (linux, solaris)");
- argv[0]="procstat"; argv[1]="vm"; argv[2]=elpid; argv[3]=NULL;
- if (execvp(argv[0],argv)==-1)/*No hay pmap, probamos procstat FreeBSD */
- perror("cannot execute procstat (FreeBSD)");
- argv[0]="procmap",argv[1]=elpid;argv[2]=NULL;
- if (execvp(argv[0],argv)==-1) /*probamos procmap OpenBSD*/
- perror("cannot execute procmap (OpenBSD)");
- argv[0]="vmmap"; argv[1]="-interleave"; argv[2]=elpid;argv[3]=NULL;
- if (execvp(argv[0],argv)==-1) /*probamos vmmap Mac-OS*/
- perror("cannot execute vmmap (Mac-OS)");
- exit(1);
- }
- waitpid (pid,NULL,0);
- }
- void cmdMemory(){
- int i,j,k;
- if(numtrozos==1 || (numtrozos>1 && strcmp(trozos[1],"-all")==0)){
- printf("Variables locales %18p %18p %18p\n",&i,&j,&k);
- printf("Variables globales %18p %18p %18p\n",linea,trozos,&numtrozos);
- printf("Variables estaticas %18p %18p %18p\n",&varMem,&varMem2,&varMem3);
- printf("Funciones programa %18p %18p %18p\n",&cmdRecurse,&cmdMemory,&cmdAllocate);
- printf("Funciones libreria %18p %18p %18p\n",&malloc,&printf,&scanf);
- printf("******Lista de bloques asignados para el proceso %d\n", getpid());
- for(i=0;i<nbloq;i++){
- 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);
- }
- for(i=0;i<nshared;i++){
- 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);
- }
- for(i=0;i<nmmap;i++){
- 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);
- }
- }else{
- if(strcmp("-blocks",trozos[1])==0){
- printf("******Lista de bloques asignados para el proceso %d\n", getpid());
- for(i=0;i<nbloq;i++){
- 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);
- }
- for(i=0;i<nshared;i++){
- 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);
- }
- for(i=0;i<nmmap;i++){
- 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);
- }
- }else if(strcmp("-pmap",trozos[1])==0){
- Do_pmap();
- }else if(strcmp("-funcs",trozos[1])==0){
- printf("Funciones programa %18p %18p %18p\n",&cmdRecurse,&cmdMemory,&cmdAllocate);
- printf("Funciones libreria %18p %18p %18p\n",&malloc,&printf,&scanf);
- }else if(strcmp("-vars",trozos[1])==0){
- printf("Variables locales %18p %18p %18p\n",&i,&j,&k);
- printf("Variables globales %18p %18p %18p\n",linea,trozos,&numtrozos);
- printf("Variables estaticas %18p %18p %18p\n",&varMem,&varMem2,&varMem3);
- }
- }
- }
- //
- //Comando ayuda
- void cmdAyuda() {
- if (numtrozos == 1) {
- printf("'ayuda cmd' donde cmd es uno de los siguientes comandos:\n"
- "fin salir bye fecha pid autores hist comando carpeta infosis ayuda\n");
- } else if (numtrozos > 1 && strcmp(trozos[1], "fin") == 0) {
- printf("fin \tTermina la ejecucion del shell\n");
- } else if (numtrozos > 1 && strcmp(trozos[1], "salir") == 0) {
- printf("salir \tTermina la ejecucion del shell\n");
- } else if (numtrozos > 1 && strcmp(trozos[1], "bye") == 0) {
- printf("bye \tTermina la ejecucion del shell\n");
- } else if (numtrozos > 1 && strcmp(trozos[1], "fecha") == 0) {
- printf("fecha [-d|.h\tMuestra la fecha y o la hora actual\n");
- } else if (numtrozos > 1 && strcmp(trozos[1], "pid") == 0) {
- printf("pid [-p]\tMuestra el pid del shell o de su proceso padre\n");
- }else if (numtrozos > 1 && strcmp(trozos[1], "autores") == 0) {
- printf("autores [-n|-l]\tMuestra los nombres y logins de los autores\n");
- }else if (numtrozos > 1 && strcmp(trozos[1], "hist") == 0) {
- printf("hist [-c|-N]\tMuestra el historico de comandos, con -c lo borra\n");
- }else if (numtrozos > 1 && strcmp(trozos[1], "comando") == 0) {
- printf("comando [-N]\tRepite el comando N (del historico)\n");
- }else if (numtrozos > 1 && strcmp(trozos[1], "carpeta") == 0) {
- printf("carpeta [dir]\tCambia (o muestra) el directorio actual del shell\n");
- }else if (numtrozos > 1 && strcmp(trozos[1], "carpeta") == 0) {
- printf("infosis \tMuestra informacion de la maquina donde corre el shell\n");
- }else if (numtrozos > 1 && strcmp(trozos[1], "ayuda") == 0) {
- printf("ayuda [cmd]\tMuestra ayuda sobre los comandos\n");
- }else if (numtrozos > 1 && strcmp(trozos[1], "create") == 0) {
- printf("create [-f] [name] Crea un directorio o un fichero (-f)\n");
- }else if (numtrozos > 1 && strcmp(trozos[1], "stat") == 0) {
- 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");
- }else if (numtrozos > 1 && strcmp(trozos[1], "list") == 0) {
- 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");
- }else if (numtrozos > 1 && strcmp(trozos[1], "delete") == 0) {
- printf("delete [name1 name2 ..] Borra ficheros o directorios vacios\n");
- }else if (numtrozos > 1 && strcmp(trozos[1], "deltree") == 0) {
- printf("deltree [name1 name2 ..] Borra ficheros o directorios no vacios recursivamente\n");
- }
- }
- struct cm_entrada{
- char *cm_nombre;
- void (*cm_fun)();
- };
- struct cm_entrada cm_tabla[] = {
- {"autores", cmdAutores},
- {"ayuda", cmdAyuda},
- {"bye", cmdFin},
- {"carpeta", cmdCarpeta},
- {"comando", cmdComandoN},
- {"create", cmdCreate},
- {"delete", cmdDelete},
- {"fecha", cmdFecha},
- {"fin", cmdFin},
- {"hist", cmdHist},
- {"infosis", cmdInfosis},
- {"pid", cmdPid},
- {"salir", cmdFin},
- {"stat", cmdStat},
- {"list", cmdList},
- {"allocate",cmdAllocate},
- {"deallocate",cmdDeallocate},
- {"memdump",cmdMemdump},
- {"recurse",cmdRecurse},
- {"memory",cmdMemory},
- };
- void ejecutarComando(char *linea){
- int i;
- char *copialinea = strdup(linea);
- numtrozos = TrocearCadena(copialinea, trozos);
- if(numtrozos == 0) {free(copialinea); return;}
- for( i=0; ; i++){
- if(cm_tabla[i].cm_nombre == NULL){
- printf("%s: comando no reconocido\n", trozos[0]);
- free(copialinea);
- break;
- }
- if(strcmp(cm_tabla[i].cm_nombre, trozos[0]) == 0){
- cm_tabla[i].cm_fun();
- free(copialinea);
- break;
- }
- }
- }
- int main(){
- while(1){
- printf("@>"); //Prompt
- if( fgets(linea, 4096, stdin) == NULL ){
- exit(0);
- }
- ejecutarComando(linea);
- histInsert(linea);
- }
- for(int i=0; i < nhist; i++){
- free(Hist[i]);
- }
- for(int i=0; i < nbloq; i++){
- free(HistBloq[i]);
- }
- for(int i=0; i < nshared; i++){
- free(HistShared[i]);
- }
- for(int i=0; i < nmmap; i++){
- free(HistMmap[i]);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement