aboutsummaryrefslogtreecommitdiff
path: root/comhan.c
diff options
context:
space:
mode:
Diffstat (limited to 'comhan.c')
-rw-r--r--comhan.c294
1 files changed, 272 insertions, 22 deletions
diff --git a/comhan.c b/comhan.c
index 556aab2..73b0c54 100644
--- a/comhan.c
+++ b/comhan.c
@@ -17,18 +17,22 @@
#define HELP 4
#define PROMPT 5
#define ALIAS 6
+#define SHOW 7
+#define ALLOCATE 8
+#define CMD_FREE 9
-
-int length; /* Length of the command line. */
+int length; /* Length of the command line. */
char prompt[20] = "mpx>";
const char version[] = "MPX OS - Version 1.0\n";
char date[] = "01/09/1991";
-char *cmds[] = {"version", "date", "directory","stop",
- "help", "prompt", "alias", NULL};
-char *aliases[] = {"", "", "", "", "", "", "", NULL};
+char *cmds[] = {"version", "date", "directory","stop","help",
+ "prompt", "alias", "show", "allocate", "free", NULL};
+char *aliases[] = {" ", " ", " ", " ",
+ " ", " ", " ", " ",
+ " ", " ", NULL};
/*
* comhan() This is the command handler for the MPX OS.
@@ -45,6 +49,7 @@ void comhan() {
int argc;
int cmd_num;
char buffer[BUF_SIZE];
+ int do_stop = 0;
do {
printf("%s ",prompt); /* Print a prompt. */
@@ -54,18 +59,21 @@ void comhan() {
argc = set_args(buffer, args);
switch (cmd_num = get_cmd(args[0])) {
- case VERSION: cmd_version(); break;
- case DATE: cmd_date(args); break;
- case DIRECTORY: cmd_directory(); break;
- case STOP: cmd_stop(); break;
- case HELP: cmd_help(args); break;
- case PROMPT: cmd_prompt(args); break;
- case ALIAS: cmd_alias(args); break;
+ case VERSION: cmd_version(); break;
+ case DATE: cmd_date(args); break;
+ case DIRECTORY: cmd_directory(); break;
+ case STOP: do_stop = cmd_stop(); break;
+ case HELP: cmd_help(args); break;
+ case PROMPT: cmd_prompt(args); break;
+ case ALIAS: cmd_alias(args); break;
+ case SHOW: cmd_show(args); break;
+ case ALLOCATE: cmd_allocate(args); break;
+ case CMD_FREE: cmd_free(args); break;
default:
printf("Can't recognize.\n");
break;
}
- } while (cmd_num != STOP);
+ } while (!do_stop);
}
int get_cmd(char cmd[]){
@@ -158,8 +166,20 @@ void cmd_directory(){
/**
* Print a goodbye message
*/
-void cmd_stop(){
- printf("**COMHAN execution complete **\n");
+int cmd_stop(){
+ char buffer[2];
+ int length = 2;
+
+ printf("Are you sure you want to exit? [y/n]: ");
+ sys_req(CON,READ,buffer,&length);
+
+ if (strcmp(buffer, "y") == 0 || strcmp(buffer, "Y") == 0) {
+ printf("**COMHAN execution complete **\n");
+ return 1;
+ } else {
+ printf("Okay! \n");
+ return 0;
+ }
}
/**
@@ -168,13 +188,16 @@ void cmd_stop(){
* argument if given.
*/
void cmd_help(char *args[]){
- char ver[] = "version Display version number\n";
- char hlp[] = "help Provide information about commands\n";
- char dir[] = "directory List .mpx files\n";
- char dat[] = "date [mm/dd/yyyy] Display or set the system date\n";
- char stp[] = "stop Terminate execution of COMHAN\n";
- char prmpt[] = "prompt string Change the prompt for commands\n";
- char als[] = "alias command=string Create an alias for a command\n";
+ char ver[] = "version Display version number \n";
+ char hlp[] = "help Provide information about commands \n";
+ char dir[] = "directory List .mpx files \n";
+ char dat[] = "date [mm/dd/yyyy] Display or set the system date \n";
+ char stp[] = "stop Terminate execution of COMHAN \n";
+ char prmpt[] = "prompt string Change the prompt for commands \n";
+ char als[] = "alias command=string Create an alias for a command \n";
+ char shw[] = "show Prints PCB information \n";
+ char alloc[] = "allocate Builds PCB with specified options \n";
+ char free[] = "free name Frees the PCB called name \n";
switch(get_cmd(args[1])){
case VERSION: printf(ver); break;
@@ -184,6 +207,9 @@ void cmd_help(char *args[]){
case HELP: printf(hlp); break;
case PROMPT: printf(prmpt); break;
case ALIAS: printf(als); break;
+ case SHOW: printf(shw); break;
+ case ALLOCATE: printf(alloc); break;
+ case CMD_FREE: printf(free); break;
default:
printf("**\tCommand Summary\t**\n");
printf("Name Use\n");
@@ -195,6 +221,9 @@ void cmd_help(char *args[]){
printf(hlp);
printf(prmpt);
printf(als);
+ printf(shw);
+ printf(alloc);
+ printf(free);
}
}
@@ -211,3 +240,224 @@ void cmd_alias(char *args[]){
strcpy(aliases[num], args[2]);
num ++;
}
+
+void print_pcb(pcb * p) {
+
+ char str[4];
+
+ if (p->type == FREE) {
+ str[0] = 'f';
+ } else if (p->type == SYS_PROCESS) {
+ str[0] = 's';
+ } else if (p->type == APP_PROCESS) {
+ str[0] = 'a';
+ } else {
+ str[0] = '-';
+ }
+
+ if (p->state == READY) {
+ str[1] = 'r';
+ } else if (p->state == RUNNING) {
+ str[1] = 'o';
+ } else if (p->state == BLOCKED) {
+ str[1] = 'b';
+ } else {
+ str[1] = '-';
+ }
+
+ if (p->suspend == SUSPENDED) {
+ str[2] = 'y';
+ } else if (p->suspend == NOT_SUSPENDED) {
+ str[2] = 'n';
+ } else {
+ str[2] = '-';
+ }
+
+ str[3] = '\0';
+
+ printf("0x%04x %8s %s 0x%04x 0x%04x 0x%04x %3d 0x%04x \n",
+ p, p->name, str, p->chain, p->prev,
+ p->next, p->priority, p->loadaddr);
+}
+
+void cmd_show(char *args[]) {
+ pcb * current = pcb_list;
+
+ if (!args[1]) {
+ printf("Show: free, all, system, application, \n");
+ printf(" suspended, ready, init. \n");
+ return;
+ }
+
+ printf("PCB_Ad Name TSP chain prev next pri l_addr \n");
+ printf("------ -------- --- ------ ------ ------ --- ------ \n");
+
+ if (strcmp(args[1], "init") == 0 || strcmp(args[1], "ready") == 0) {
+ current = (strcmp(args[1], "init") == 0)? io_init_queue : ready_queue;
+
+ if (current == NULL) {
+ return;
+ }
+
+ do {
+ print_pcb(current);
+ current = current->next;
+ } while (current != NULL);
+ return;
+ }
+
+ do {
+ if (strcmp(args[1], "free") == 0 && current->type == FREE) {
+ print_pcb(current);
+ } else if (strcmp(args[1], "all") == 0) {
+ print_pcb(current);
+ } else if (strcmp(args[1], "system") == 0 &&
+ current->type == SYS_PROCESS) {
+ print_pcb(current);
+ } else if (strcmp(args[1], "application") == 0 &&
+ current->type == APP_PROCESS) {
+ print_pcb(current);
+ } else if (strcmp(args[1], "suspended") == 0 &&
+ current->suspend == SUSPENDED) {
+ print_pcb(current);
+ } else if (strcmp(args[1], "ready") == 0 &&
+ current->state == READY) {
+ print_pcb(current);
+ }
+
+ current = current->chain;
+ } while (current != NULL);
+}
+
+void cmd_allocate(char *args[]) {
+ pcb * new;
+ int result;
+ int type, state, suspend, priority;
+ pcb * exists;
+
+ if (!args[1] || !args[2] || !args[3] || !args[4] || !args[5]) {
+ printf("***Error*** \n");
+ printf("Please use the correct number of arguments. \n");
+ return;
+ }
+
+ if (strcmp(args[2], "f") != 0 &&
+ strcmp(args[2], "a") != 0 &&
+ strcmp(args[2], "s") != 0) {
+ printf("***Error*** \n");
+ printf("PCB type must be f(ree), a(pplication) or s(ystem). \n");
+ printf("You said: %s \n", args[2]);
+ return;
+ }
+
+ if (strcmp(args[3], "r") != 0 &&
+ strcmp(args[3], "o") != 0 &&
+ strcmp(args[3], "b") != 0) {
+ printf("***Error*** \n");
+ printf("PCB state must be r(eady), o(running), or b(locked). \n");
+ printf("You said: %s \n", args[3]);
+ return;
+ }
+
+ if (strcmp(args[4], "y") != 0 &&
+ strcmp(args[4], "n") != 0) {
+ printf("***Error*** \n");
+ printf("PCB suspended flag must be y(es) or n(o). \n");
+ printf("You said: %s \n", args[4]);
+ return;
+ }
+
+ priority = atoi(args[5]);
+
+ exists = search_pcb(pcb_list, args[1]);
+
+ if(exists != NULL){
+ printf("***Error*** \n");
+ printf("A pcb with that name already esists. \n");
+ return;
+ }
+
+ new = get_pcb(pcb_list);
+
+ type = FREE;
+ if (strcmp(args[2], "a") == 0) {
+ type = APP_PROCESS;
+ } else if (strcmp(args[2], "s") == 0) {
+ type = SYS_PROCESS;
+ }
+
+ state = READY;
+ if (strcmp(args[3], "o") == 0) {
+ state = RUNNING;
+ } else if (strcmp(args[3], "b") == 0) {
+ state = BLOCKED;
+ }
+
+ suspend = NOT_SUSPENDED;
+ if (strcmp(args[4], "y") == 0) {
+ suspend = SUSPENDED;
+ }
+
+ if (type == APP_PROCESS && (priority < -126 || priority > 126)) {
+ printf("***Error*** \n");
+ printf("The priority for an application process must be \n");
+ printf("between -126 and 126, inclusive. \n");
+ return;
+ }
+
+ if (type == SYS_PROCESS && (priority < -128 || priority > 127)) {
+ printf("***Error*** \n");
+ printf("The priority for a system process must be \n");
+ printf("between -128 and 127, inclusive. \n");
+ return;
+ }
+
+ result = build_pcb(new, args[1], type, state, suspend, priority);
+
+ switch (result) {
+ case 1: break;
+
+ case -1: printf("***Error*** \n");
+ printf("There was no space for another pcb. \n");
+ break;
+
+ case -2: printf("***Error*** \n");
+ printf("Invalid type \n");
+ break;
+
+ case -3: printf("***Error*** \n");
+ printf("Invalid state \n");
+ break;
+
+ case -4: printf("***Error*** \n");
+ printf("Invalid suspend \n");
+ break;
+ }
+
+ //put the pcb in a queue
+ if (state == READY) {
+ insert_pcb(&ready_queue, new, 0); //insert in priority order
+ } else if (state == BLOCKED) {
+ insert_pcb(&io_init_queue, new, 1); //insert at end of queue
+ }
+
+ return;
+}
+
+void cmd_free(char *args[]) {
+ pcb * to_free = search_pcb(pcb_list, args[1]);
+ int result;
+
+ if (to_free->state == READY) {
+ remove_pcb(&ready_queue, to_free);
+ } else if(to_free->state == BLOCKED) {
+ remove_pcb(&io_init_queue, to_free);
+ }
+
+ result = free_pcb(pcb_list, to_free);
+ switch (result) {
+ case 1: printf("PCB freed\n"); break;
+ case -1: printf("Couldn't find PCB\n"); break;
+ case -2: printf("PCB already free\n"); break;
+ }
+} \ No newline at end of file