/*Depois do parse, multiplexa acoes a serem tomadas*/ int comandos_builtin(char *op){ char dir [256]; int i,fd, flag=0, sc=0; /*Le comando de args*/ strncpy(op, args[0], strlen(args[0])); strncat(op, "\0", 1); /*Testa se nao ha caminho no comando*/ if(index(op, '/') == NULL) { /*Se encontrou o caminho real do comando executa*/ if(encontra_path(op) == 0) executa_processo(op); else flag = 1; } else /*Se foi dado o caminho inteiro*/ if((fd = open(op, O_RDONLY)) > 0){ close(fd); executa_processo(op); } else flag = 1; if (!strcmp(op,"pwd")) sc = 1; else if (!strcmp(op,"cd")) sc = 2; else if (!strcmp(op,"exit")) sc = 3; else if (!strcmp(op,"jobs")) sc = 4; else if (!strcmp(op,"bg")) sc = 5; else if (!strcmp(op,"fg")) sc = 6; else if (!strcmp(op,"about")) sc = 7; if (flag == 1){ flag = 0; switch(sc){ case 1: getcwd(dir, 256); printf("%s\n", dir); break; case 2: if (chdir(args[1]) != 0) printf("Caminho invalido.\n"); break; case 3: for (i=1;i<MAX_JOBS && jobs[i].p_id != 0;i++) kill(jobs[i].p_id, 15); exit(0); case 4: imprimejob(); break; case 5: envia_background(args[1]); break; case 6: if (args[1] != NULL) { envia_foreground(args[1]); } else puts("Parametro (PID ou JID) requerido."); break; default:flag = 1; break; } } return flag; }
int main(int argc, char *argv[]) { Useradd login; int retorno; char *comando=(char *) malloc(sizeof(char)); char *p1, *p2; char nome[MAX]; char senha[MAX]; FILE *passwd; login: printf("\e[H\e[2J"); printf("\n\n"); printf("login: "******"passwd: "); gets(senha); passwd=fopen(PASS_PATH, "r"); rewind(passwd); while(!feof(passwd)) { fread(&login, sizeof(Useradd), 1, passwd); if( strcmp(login.user, nome) == 0 && strcmp(login.senha,senha) == 0 && login.bloqueado==0) { if(strcmp(login.user, "root") != 0) { suid=500; goto shell; } else { suid=0; goto shell; } } } goto login; shell: mtod(); while(1) { //fclose(passwd); if(suid==0) printf("[>]# "); else printf("[>]$ "); gets(comando); p1=strtok(comando, " "); p2=strtok(NULL, "#"); comando_vish[0]=p1; comando_vish[1]=p2; /*funcao execve exige que o ultimo valor seja NULL*/ comando_vish[2]=NULL; if(strcmp(p1, "cat")==0) { executa_processo(CAT_PATH); } else if(strcmp(p1, "exit")==0) { comando_exit(login.user); goto login; } else if(strcmp(p1, "clear")==0) { printf("\e[H\e[2J"); } else if(strcmp(p1, "creditos")==0)