Files
kernel-study/userprog/gmsh/gmsh.c
T

115 lines
3.1 KiB
C

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/reboot.h>
#include <sys/ioctl.h>
#include <dirent.h>
#include <fcntl.h>
#include <stdbool.h>
#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 <rows> <cols>\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;
}