// Shell primitivo, para demonstrar o uso prático de fork+execve.
// Carlos Maziero, 08/2026

// ATENÇÃO: este é um exemplo mínimo, com várias deficiências:
// - não trata parâmetros da linha de comando e variáveis de ambiente
// - não trata erros nas operações com strings
// - não encerra corretamente

#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <sys/wait.h>

#define MAX_CMD 1024

// executa um comando em um caminho
void run_cmd(char *path, char *cmd)
{
    char full_cmd[MAX_CMD];

    strcpy(full_cmd, path);
    strcat(full_cmd, cmd);
    execve(full_cmd, NULL, NULL);
}

int main(int argc, char **argv, char **envp)
{
    int ret;
    char cmd[MAX_CMD];

    for(;;)
    {
        // prompt e leitura da linha de comando sem o "\n" no fim
        printf("# ");
        fgets(cmd, MAX_CMD-1, stdin);
        cmd[strcspn(cmd, "\n")] = 0;

        // cria um filho para tratar o comando lido
        ret = fork();
        if (ret < 0)
            perror("Error");
        else
            if (ret > 0)
                wait(0);
            else
            {
                // tenta executar o comando em vários locais (PATH)
                run_cmd("/usr/bin/", cmd);
                run_cmd("/usr/local/bin/", cmd);
                run_cmd("./", cmd);
                perror("Error");
            }
    }
}

