예제 #1
0
파일: shell.c 프로젝트: gmello/SHELL
/*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;
}
예제 #2
0
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)