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; }
/* 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); }