#include #include #include #include #include #include #include #include #include #include #include "builtin.h" #include "para.h" #include "job.h" job_t *parse_line(char *line); void launch_job(job_t *job); static bool verbose = false; volatile pid_t fg_pgid = 0; void handle_sigint(int sig) { printf("\n"); } void handle_sigchld(int sig) { while (waitpid(-1, NULL, WNOHANG) > 0); } int builtin_cmd(job_t *job) { command_t *cmd = job->head; if (!cmd || !cmd->argv[0]) return 0; // if (strcmp(cmd->argv[0], "exit") == 0) exit(0); // if (strcmp(cmd->argv[0], "cd") == 0) { // if (cmd->argc < 2) fprintf(stderr, "cd: missing argument\n"); // else if (chdir(cmd->argv[1]) != 0) perror("cd"); // return 1; // } bool ret = 0; if (strcmp(cmd->argv[0], "exit") == 0) exit(0), ret = 1; else if (strcmp(cmd->argv[0], "ls") == 0) cmd_ls(cmd->argv[1]), ret = 1; else if (strcmp(cmd->argv[0], "cd") == 0) cmd_cd(cmd->argv[1]), ret = 1; else if (strcmp(cmd->argv[0], "pwd") == 0) cmd_pwd(), ret = 1; // else if (strcmp(cmd->argv[0], "cat") == 0) cmd_cat(argc, (const char**) argv); // else if (strcmp(cmd->argv[0], "proc") == 0) cmd_proc(); // else if (strcmp(cmd->argv[0], "echo") == 0) cmd_echo(argc, (const char**) argv); else if (strcmp(cmd->argv[0], "size") == 0) cmd_size(), ret = 1; else if (strcmp(cmd->argv[0], "resize") == 0){ if(cmd->argc != 3){ printf("Usage: resize \n"); } else cmd_resize(cmd->argv[1], cmd->argv[2]); ret = 1; } else if (strcmp(cmd->argv[0], "poweroff") == 0) cmd_poweroff(), ret = 1; else if (strcmp(cmd->argv[0], "reboot") == 0) cmd_reboot(), ret = 1; else if (strcmp(cmd->argv[0], "help") == 0) cmd_help(), ret = 1; return ret; } void run_shell() { char cmd_buf[MAX_CMD_LEN]; char cwd[1024]; while (1) { if (getcwd(cwd, sizeof(cwd))) printf("\033[1;32mgmsh\033[0m:%s$ ", cwd); else printf("gmsh:$ "); fflush(stdout); if (!fgets(cmd_buf, sizeof(cmd_buf), stdin)) break; cmd_buf[strcspn(cmd_buf, "\n")] = 0; if (strlen(cmd_buf) == 0) continue; job_t *job = parse_line(cmd_buf); if (job == NULL) continue; if (builtin_cmd(job)) { free_job(job); continue; } launch_job(job); if (!job->is_bg) free_job(job); } } int main(int argc, char** argv) { signal(SIGINT, handle_sigint); signal(SIGCHLD, handle_sigchld); signal(SIGTTOU, SIG_IGN); int opt; while ((opt = getopt(argc, argv, "v")) != -1) { switch (opt) { case 'v': verbose = 1; printf("[gmsh] Verbose mode enabled.\n"); break; default: fprintf(stderr, "Usage: %s [-v]\n", argv[0]); exit(1); } } if(verbose) printf("GMSH (GMS Minimal SHell) v1.0 initialized.\n"); run_shell(); return 0; }