115 lines
3.1 KiB
C
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;
|
|
}
|