/[cvs]/joko/Uni/BSArch/03/win32/min_shell.c
ViewVC logotype

Diff of /joko/Uni/BSArch/03/win32/min_shell.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.8 by joko, Thu Jun 15 23:09:44 2006 UTC revision 1.12 by joko, Fri Jun 16 00:37:22 2006 UTC
# Line 3  Line 3 
3  #include <stdlib.h>  #include <stdlib.h>
4  #include <stdio.h>  #include <stdio.h>
5  #include <errno.h>  #include <errno.h>
6    #include <string.h>
7    
8  #include "min_shell.h"  #include "min_shell.h"
9    
   
 #define MAX_COMMAND_LENGTH 1024  
   
10  int main(int argc, char * argv[]) {  int main(int argc, char * argv[]) {
11        
12    // interactive mode with prompt    // interactive mode with prompt
13    if (argc == 1) {    if (argc == 1) {
14      //printf("No arguments given.");      //fprintf(stderr, "Interactive mode not implemented yet.\n");
15      //exit(EXIT_FAILURE);      //exit(EXIT_FAILURE);
16      char filename[255] = "abc\0";      run_commands(stdin, "> ");
     BOOL background = 0;  
     os_start_process(filename, background);  
17    }    }
18        
19    // scripting mode    // scripting mode
20    if (argc == 2) {    if (argc == 2) {
21      FILE * script = fopen(argv[1], "r");      FILE * script = fopen(argv[1], "r");
22      run_commands(script);      run_commands(script, "");
23      fclose(script);      fclose(script);
24    }    }
25  }  }
26    
27  void run_commands(FILE * fp) {  void run_commands(FILE * fp, char * prompt) {
28        
29    char command[MAX_COMMAND_LENGTH];    char command[MAX_COMMAND_LENGTH];
30        
31      // echo first prompt
32      fprintf(stdout, "%s", prompt);
33    while (fgets(command, MAX_COMMAND_LENGTH, fp)) {    while (fgets(command, MAX_COMMAND_LENGTH, fp)) {
34        int command_length;
35        
36        // strip newlines
37      chomp(command);      chomp(command);
38      execute_command(command);      
39        // ... and action
40        dispatch_command(command);
41        
42        // echo prompt after executing shell command
43        fprintf(stdout, "%s", prompt);
44    }    }
45        
46  }  }
47    
48    
49  void execute_command(char * command) {  void dispatch_command(char * command) {
50    printf("process_command: %s\n", command);  
51    os_start_process(command, 0);    BOOL background = FALSE;
52      int command_length;
53      char first_char;
54      char * shell_command;
55    
56      // is it a shell command?
57      first_char = command[0];
58      if (strcmp(&first_char, ":") == 0) {
59        
60        // "calculate" shell command ...
61        shell_command = command + 1;
62        //printf("shell command: %s\n", shell_command);
63        
64        // ... and dispatch it
65        
66        // wait
67        if (strcmp(shell_command, "wait") == 0) {
68          // TODO
69          os_wait_for_processes();
70        
71        // exit
72        } else if (strcmp(shell_command, "exit") == 0) {
73          exit(EXIT_SUCCESS);
74        
75        // unknown command
76        } else {
77          fprintf(stderr, "ERROR: Unknown shell command '%s'\n", shell_command);
78        }
79      
80      // run program: background or foreground?
81      } else {
82        //printf("running: %s\n", command);
83        command_length = strlen(command);
84        if (command[command_length-1] == '&') {
85          command[command_length-1] = '\0';
86          background = TRUE;
87        }
88        
89        os_start_process(command, background);
90      }
91  }  }
92    

Legend:
Removed from v.1.8  
changed lines
  Added in v.1.12

MailToCvsAdmin">MailToCvsAdmin
ViewVC Help
Powered by ViewVC 1.1.26 RSS 2.0 feed