Esempio n. 1
0
int bash_loop()
{
    struct sigaction act;
    act.sa_sigaction = &signal_handler;
    act.sa_flags = SA_SIGINFO;
   
    sigemptyset(&act.sa_mask);
    sigaddset(&act.sa_mask, SIGINT);
    sigaddset(&act.sa_mask, SIGCHLD);
    sigaction(SIGINT, &act, 0);
    sigaction(SIGCHLD, &act, 0);
 
    char buff[BUFF_FULLSIZE];
    size_t buffer_size;
   
    char *** args = NULL;
    size_t args_size = 0;
 
    while(1) {
        write(0, "$ ", 2);
       
        char * command = NULL;
        if ((command = bash_read(buff, &buffer_size)) == NULL && buffer_size == 0)
            break;
 
       
        if (command == NULL)
            continue;
 
        args = bash_parse(command, &args_size);
 
        free(command);
 
        bash_execute(buff, &buffer_size, args, args_size);
    }
 
    return 0;
}
Esempio n. 2
0
/* Linhas de codigo do projeto elua, shell.c */
static void processa_cmd(void) {
    char buf[128];
    int i, j;
    char c;
    char *p, *temp;
    int argc;
    char *argv[4];

    bash_read(buf, sizeof (buf) / sizeof (char));

    if (strlen(buf) == 0)
        return;

    if (buf[strlen(buf) - 1] != '\n')
        strcat(buf, "\n");

    /* converte \r \n e \t em ' ' */
    p = buf;
    while (*p) {
        if (*p == '\r' || *p == '\n' || *p == '\t')
            *p = ' ';
        p++;
    }

    for (i = 0, j = 0, c = '\0'; i < strlen(buf); i++)
        if ((buf[i] == '\'') || (buf[i] == '"')) {
            if (!j) {
                j = 1;
                c = buf[i];
            } else {
                if (buf[i] == c) {
                    j = 0;
                    c = '\0';
                }
            }
        } else if ((buf[i] == ' ') && j)
            buf[i] = '\x07';

    if (j) {
        usb_print("\r\nstring invalida");
        return;
    }

    /* retira os espacos desnecessarios */
    p = strchr(buf, ' ');
    while (p) {
        temp = p + 1;
        while (*temp && *temp == ' ')
            memmove(temp, temp + 1, strlen(temp));
        p = strchr(p + 1, ' ');
    }

    if (!strcmp(buf, " "))
        return;

    p = buf;
    if (*p == ' ')
        p++;

    /* adiciona o espaco */
    if (p[strlen(p) - 1] != ' ')
        strcat(p, " ");

    for (argc = 0; argc < 4; argc++)
        argv[argc] = NULL;

    argc = 0;

    /* salva argc e argv */
    while ((temp = strchr(p, ' ')) != NULL) {
        *temp = 0;
        if (argc == 4) {
            usb_print("\r\nerro: muitos argumentos");
            argc = -1;
            return;
        }
        argv[argc++] = p;
        p = temp + 1;
    }

    if (argc == -1)
        return;

    for (i = 0; i < argc; i++) {
        p = argv[i];
        for (j = 0; j < strlen(argv[i]); j++) {
            if (p[j] == '\x07')
                argv[i][j] = ' ';
        }
        if ((p[0] == '\'' || p[0] == '"') && (p[0] == p[strlen(p) - 1])) {
            argv[i] = p + 1;
            p[strlen(p) - 1] = '\0';
        }
    }

    //    for(i = 0; i < argc; i ++)
    //        printf("\r\nargv[%u] = %s", i, argv[i]);

    executa_cmd(argc, argv);

}