// GRUPO: 18 // DATA DO PRAZO DE ENTREGA: 29/10/2004 // NUMERO DO TRABALHO: 01 // NOME FICHEIRO: ligsh_18.c // SUMARIO DO PROGRAMA: // O program ligsh pretende funcionar como uma shell do sistema operativo UNIX, // como tal serve para a execucao de comandos internos a shell e possibilita a execucao // de programas externos a essa mesma shell. // --------------------------------------------------------------------------------------- #include #include #include #include #include #include #include #define MAXSTR 10 #define MAXOUT 200 char command_val[100]; char shellname[10]; // ID da ligsh FILE *lshlista; char prompt[20]; // formato da prompt char out[1]; int output=0; // modo de execucao (fg/bg) char destino[10]; // ID da ligsh de destino int pid; int read_funtion(); int count_shells(); char **parse(char *comando); void init_ligsh(); void init_prompt(); void get_command(); void select_function(char *comando); void exec_command(char **args, int type); void list_shells(); void exit_shell(); void muda_destino(char tmp[10]); void flush_file_buffer(); // ------------------------------------------------- // funcao main main () { init_ligsh(); pid=fork(); if (pid==0) flush_file_buffer(); else get_command(); } // ------------------------------------------------- // funcao flush_file_buffer void flush_file_buffer() { char cmdtmp[15]; char temp[200]; FILE *lshlista; while (1) { lshlista=fopen(shellname,"r"); if (lshlista != NULL){ while(fgets(temp,MAXOUT,lshlista) != NULL){ if (strcmp(temp,"")) printf("%s",temp); } fclose(lshlista); lshlista = fopen(shellname,"w"); fclose(lshlista); } } } // ------------------------------------------------- // funcao muda_destino void muda_destino(char tmp[10]) { int aux=0; char ligshtmp1[10]; char ligshtmp2[10]; strcpy(ligshtmp2,tmp); strcat(ligshtmp2,"\n"); lshlista=fopen("list.dt","r"); while (fgets(ligshtmp1,MAXSTR,lshlista) != NULL) { if(!(strcmp(ligshtmp1,ligshtmp2))){ aux=1; } } fclose(lshlista); if (aux==0) printf("ligsh de destino nao existe!\n"); else { strcpy(destino,tmp); printf("Destino alterado com sucesso!\n"); } } // ------------------------------------------------- // funcao exit_shell void exit_shell() { char cmdtmp[15]; char ligshtmp[10]; FILE *lshlista2; strcat(shellname,"\n"); lshlista=fopen("list.dt","r"); lshlista2=fopen("list.dt.bck","w+"); while (fgets(ligshtmp,MAXSTR,lshlista) != NULL) { if(strcmp(ligshtmp,shellname)) fputs(ligshtmp,lshlista2); } fclose(lshlista); fclose(lshlista2); strcpy(cmdtmp,"rm "); strcat(cmdtmp,shellname); system(cmdtmp); system("mv list.dt.bck list.dt -f"); kill(pid,9); exit(1); } // ------------------------------------------------- // funcao list_shells void list_shells() { char ligshtmp[10]; lshlista=fopen("list.dt","r"); if (lshlista == NULL) { printf("Ficheiro de listagem nao encontrado!\n"); } else { while (fgets(ligshtmp,MAXSTR,lshlista) != NULL) { printf("ligsh > %s",ligshtmp); } fclose(lshlista); } } // ------------------------------------------------- // funcao exec_command void exec_command(char **args, int type) { int pid,status,fd; pid=fork(); if (pid==0) { if (strcmp(shellname,destino)) { fd = open(destino,O_RDWR); dup2(fd,1); } if(execvp(args[0],args) != 0) { printf("Programa nao executado ou nao encontrado!\n"); exit(1); } } else { if (type==0) wait(&status); } } // ------------------------------------------------- // funcao select_function void select_function(char *comando) { char **args; args=parse(comando); if (!(strcmp(args[0],"sair"))) exit_shell(); else if (!(strcmp(args[0],"forexec"))) output=0; else if (!(strcmp(args[0],"backexec"))) output=1; else if (!(strcmp(args[0],"listar"))) list_shells(); else if(!(strcmp(args[0],"destino"))) muda_destino(args[1]); else if(!(strcmp(args[0],"shellname"))) printf("%s\n",shellname); else { if (output==0) exec_command(args,0); else if (output==1) exec_command(args,1); } } // ------------------------------------------------- // funcao get_command void get_command() { while (1) { init_prompt(); printf("%s",prompt); read_function(); if( !(command_val[0]=='\0')) select_function(command_val); } } // ------------------------------------------------- // funcao read_function int read_function() { int i = 0; char c; while ( (c=getc(stdin)) != '\n' ) { command_val[i] = c; i++; } command_val[i]='\0'; } // ------------------------------------------------- // funcao parse char **parse(char *comando) { int i; char **args; char *token; args = (char **)malloc(sizeof(char *)*20); i = 0; token = strtok(comando," "); args[i] = token; token = strtok(NULL," "); while(token != NULL) { i++; args[i] = token; token = strtok(NULL," "); } args[++i] = NULL; return(args); } // ------------------------------------------------- // funcao count_shells int count_shells() { int count=0; char ligshtmp[10]; lshlista=fopen("list.dt","r"); if (lshlista == NULL) { printf("Ficheiro de listagem nao encontrado!\n"); return 0; } else { while (fgets(ligshtmp,MAXSTR,lshlista) != NULL) { count++; } return count; } } // ------------------------------------------------- // funcao init_prompt void init_prompt() { int count=0; count = count_shells(); if (output==0) strcpy(out,"fg"); else strcpy(out,"bg"); sprintf(prompt,"lsh:%s.%s.%d$ ",destino,out,count); } // ------------------------------------------------- // funcao init_ligsh void init_ligsh() { int aux=0; lshlista=fopen("list.dt","r"); if (lshlista == NULL) { printf("Ficheiro de listagem Inicializado!\n"); aux++; sprintf(shellname,"%i",aux); sprintf(destino,"%i",aux); lshlista=fopen("list.dt","w+"); fputs("1\n",lshlista); fclose(lshlista); lshlista=fopen(destino,"w+"); fclose(lshlista); } else { while (fgets(shellname,MAXSTR,lshlista) != NULL) { } aux = atoi(shellname); aux++; sprintf(shellname,"%i",aux); sprintf(destino,"%i",aux); fclose(lshlista); lshlista=fopen("list.dt","a+"); fprintf(lshlista,"%s\n",shellname); fclose(lshlista); lshlista=fopen(destino,"w+"); fclose(lshlista); } }