/[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.6 by joko, Thu Jun 15 22:34:55 2006 UTC revision 1.11 by joko, Fri Jun 16 00:31:50 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 <windows.h>  #include <string.h>
7    
8  #include "min_shell.h"  #include "min_shell.h"
9    
 #define BOOL int  
 #define TRUE 1  
 #define FALSE 0  
   
   
 #define MAX_COMMAND_LENGTH 1024  
   
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        fprintf(stderr, "Interactive mode not implemented yet.\n");
15      //printf("No arguments given.");      //printf("No arguments given.");
16      //exit(EXIT_FAILURE);      exit(EXIT_FAILURE);
     char filename[255] = "abc\0";  
     BOOL background = 0;  
     start_process(filename, background);  
17    }    }
18        
19      // scripting mode
20    if (argc == 2) {    if (argc == 2) {
21      FILE * script = fopen(argv[1], "r");      FILE * script = fopen(argv[1], "r");
22      read_commands(script);      run_commands(script);
23      fclose(script);      fclose(script);
24    }    }
25  }  }
26    
27  void read_commands(FILE * fp) {  void run_commands(FILE * fp) {
28        
29    char command[MAX_COMMAND_LENGTH];    char command[MAX_COMMAND_LENGTH];
30        
31    fgets(command, MAX_COMMAND_LENGTH, fp);    while (fgets(command, MAX_COMMAND_LENGTH, fp)) {
32    chomp(command);      int command_length;
33          
34    process_command(command);      // strip newlines
35  }      chomp(command);
36        
37  /* if last char is newline, "strip" it */      // ... and action
38  void chomp(char * string) {      dispatch_command(command);
   int string_length = strlen(string);  
   if (string[string_length-1] == '\n') {  
     string[string_length-1] = '\0';  
39    }    }
40      
41  }  }
42    
 void process_command(char * command) {  
   printf("process_command: %s\n", command);  
   start_process(command, 0);  
 }  
   
 BOOL start_process(char * filename, BOOL background) {  
43    
44    STARTUPINFO si;  void dispatch_command(char * command) {
   PROCESS_INFORMATION pi;  
45    
46    //printf("start_process: '%s'\n", filename);    BOOL background = FALSE;
47      int command_length;
48      char first_char;
49      char * shell_command;
50    
51      // is it a shell command?
52      first_char = command[0];
53      if (strcmp(&first_char, ":") == 0) {
54        
55        // "calculate" shell command ...
56        shell_command = command + 1;
57        //printf("shell command: %s\n", shell_command);
58        
59        // ... and dispatch it
60        
61        // wait
62        if (strcmp(shell_command, "wait") == 0) {
63          // TODO
64          os_wait_for_processes();
65        
66        // exit
67        } else if (strcmp(shell_command, "exit") == 0) {
68          exit(EXIT_SUCCESS);
69        
70        // unknown command
71        } else {
72          fprintf(stderr, "ERROR: Unknown shell command '%s'\n", shell_command);
73        }
74        
75    ZeroMemory(&si,sizeof(si));    // run program: background or foreground?
76    si.cb = sizeof(STARTUPINFO);    } else {
77          //printf("running: %s\n", command);
78    ZeroMemory(&pi,sizeof(pi));      command_length = strlen(command);
79          if (command[command_length-1] == '&') {
80    CreateProcess(        command[command_length-1] = '\0';
81      NULL, filename,        background = TRUE;
     NULL, NULL, FALSE, 0,  
     NULL, NULL,  
     &si,  
     &pi  
   );  
   check_alert_error("CreateProcess");  
     
   if (!background) {  
     long status;  
     status = WaitForSingleObject(pi.hProcess, INFINITE);  
     if (status == WAIT_FAILED) {  
       check_alert_error("WaitForSingleObject");  
       return FALSE;  
82      }      }
83        
84        os_start_process(command, background);
85    }    }
     
   return TRUE;  
   
86  }  }
87    
 void check_alert_error(const char * error_source) {  
   DWORD dwError = GetLastError();  
   
   HLOCAL message = NULL;  
   BOOL fOk;  
     
   if (dwError == 0)  
     return;  
   
   fOk = FormatMessage(  
     FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER,  
     NULL,  
     dwError,  
     MAKELANGID(LANG_NEUTRAL, SUBLANG_SYS_DEFAULT),  
     (PTSTR)&message,  
     0,  
     NULL  
   );  
   
   if (message != NULL) {  
     fprintf(stderr, "Error with '%s': %s (Code %i)\n", error_source, message, dwError);  
     LocalFree(message);  
   }  
     
 }  

Legend:
Removed from v.1.6  
changed lines
  Added in v.1.11

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