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

Legend:
Removed from v.1.2  
changed lines
  Added in v.1.15

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