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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.16 - (hide annotations)
Fri Jun 16 20:32:37 2006 UTC (18 years, 3 months ago) by joko
Branch: MAIN
CVS Tags: HEAD
Changes since 1.15: +23 -5 lines
File MIME type: text/plain
minor fixes and cleanup

1 joko 1.16 /* $Id: min_shell.c,v 1.15 2006/06/16 19:48:14 joko Exp $ */
2 joko 1.1
3     #include <stdlib.h>
4 joko 1.3 #include <stdio.h>
5 joko 1.1 #include <errno.h>
6 joko 1.10 #include <string.h>
7 joko 1.2
8 joko 1.4 #include "min_shell.h"
9    
10 joko 1.1 int main(int argc, char * argv[]) {
11 joko 1.8
12     // interactive mode with prompt
13 joko 1.1 if (argc == 1) {
14 joko 1.13 fprintf(stderr, "Welcome to mini shell. Have fun!\n");
15 joko 1.12 run_commands(stdin, "> ");
16 joko 1.4
17 joko 1.8 // scripting mode
18 joko 1.16 } else if (argc == 2) {
19     FILE * script;
20     script = fopen(argv[1], "r");
21     if (script == NULL) {
22     perror(NULL);
23     exit(EXIT_FAILURE);
24     }
25 joko 1.12 run_commands(script, "");
26 joko 1.4 fclose(script);
27 joko 1.16
28     } else {
29     fprintf(stderr, "Sorry, mini shell just accepts one parameter: a path to a script!\n");
30 joko 1.4 }
31 joko 1.1 }
32 joko 1.2
33 joko 1.12 void run_commands(FILE * fp, char * prompt) {
34 joko 1.4
35     char command[MAX_COMMAND_LENGTH];
36 joko 1.16 char *command_ptr;
37 joko 1.4
38 joko 1.12 // echo first prompt
39     fprintf(stdout, "%s", prompt);
40 joko 1.8 while (fgets(command, MAX_COMMAND_LENGTH, fp)) {
41 joko 1.16
42     int error_number = ferror(fp);
43    
44     if (error_number) {
45     char * message = strerror(error_number);
46     fprintf(stderr, "Error while reading from input stream: %s", message);
47     clearerr(fp);
48     break;
49     }
50    
51     command_ptr = command;
52 joko 1.9
53     // strip newlines
54 joko 1.14 chomp(command_ptr);
55    
56     // trim whitespace
57     trim(&command_ptr);
58 joko 1.9
59     // ... and action
60 joko 1.15 if (strlen(command_ptr))
61     dispatch_command(command_ptr);
62 joko 1.12
63     // echo prompt after executing shell command
64     fprintf(stdout, "%s", prompt);
65 joko 1.8 }
66 joko 1.4
67 joko 1.6 }
68    
69 joko 1.4
70 joko 1.10 void dispatch_command(char * command) {
71 joko 1.9
72     BOOL background = FALSE;
73     int command_length;
74 joko 1.10 char first_char;
75     char * shell_command;
76 joko 1.9
77 joko 1.10 // is it a shell command?
78     first_char = command[0];
79     if (strcmp(&first_char, ":") == 0) {
80    
81     // "calculate" shell command ...
82     shell_command = command + 1;
83 joko 1.11 //printf("shell command: %s\n", shell_command);
84 joko 1.10
85     // ... and dispatch it
86    
87     // wait
88     if (strcmp(shell_command, "wait") == 0) {
89     // TODO
90 joko 1.11 os_wait_for_processes();
91 joko 1.10
92     // exit
93     } else if (strcmp(shell_command, "exit") == 0) {
94     exit(EXIT_SUCCESS);
95    
96     // unknown command
97     } else {
98     fprintf(stderr, "ERROR: Unknown shell command '%s'\n", shell_command);
99     }
100    
101     // run program: background or foreground?
102     } else {
103 joko 1.11 //printf("running: %s\n", command);
104 joko 1.10 command_length = strlen(command);
105 joko 1.15 if (command[command_length-1] == '&' && command[command_length-2] == ' ') {
106 joko 1.10 command[command_length-1] = '\0';
107 joko 1.15 command[command_length-2] = '\0';
108 joko 1.10 background = TRUE;
109     }
110    
111     os_start_process(command, background);
112 joko 1.9 }
113 joko 1.3 }
114    

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