/[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.6 - (hide annotations)
Thu Jun 15 22:34:55 2006 UTC (18 years, 3 months ago) by joko
Branch: MAIN
Changes since 1.5: +10 -8 lines
File MIME type: text/plain
minor refactoring

1 joko 1.6 /* $Id: min_shell.c,v 1.5 2006/06/15 22:15:10 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.2 #include <windows.h>
7    
8 joko 1.4 #include "min_shell.h"
9    
10 joko 1.2 #define BOOL int
11     #define TRUE 1
12     #define FALSE 0
13 joko 1.1
14 joko 1.4
15     #define MAX_COMMAND_LENGTH 1024
16    
17 joko 1.1 int main(int argc, char * argv[]) {
18     if (argc == 1) {
19 joko 1.2 //printf("No arguments given.");
20     //exit(EXIT_FAILURE);
21     char filename[255] = "abc\0";
22     BOOL background = 0;
23     start_process(filename, background);
24 joko 1.1 }
25 joko 1.4
26     if (argc == 2) {
27     FILE * script = fopen(argv[1], "r");
28     read_commands(script);
29     fclose(script);
30     }
31 joko 1.1 }
32 joko 1.2
33 joko 1.4 void read_commands(FILE * fp) {
34    
35     char command[MAX_COMMAND_LENGTH];
36    
37     fgets(command, MAX_COMMAND_LENGTH, fp);
38 joko 1.6 chomp(command);
39 joko 1.4
40 joko 1.6 process_command(command);
41     }
42    
43     /* if last char is newline, "strip" it */
44     void chomp(char * string) {
45     int string_length = strlen(string);
46     if (string[string_length-1] == '\n') {
47     string[string_length-1] = '\0';
48 joko 1.4 }
49     }
50    
51     void process_command(char * command) {
52     printf("process_command: %s\n", command);
53     start_process(command, 0);
54     }
55    
56     BOOL start_process(char * filename, BOOL background) {
57    
58 joko 1.2 STARTUPINFO si;
59     PROCESS_INFORMATION pi;
60 joko 1.4
61 joko 1.5 //printf("start_process: '%s'\n", filename);
62 joko 1.2
63     ZeroMemory(&si,sizeof(si));
64 joko 1.4 si.cb = sizeof(STARTUPINFO);
65 joko 1.2
66     ZeroMemory(&pi,sizeof(pi));
67    
68     CreateProcess(
69 joko 1.4 NULL, filename,
70 joko 1.2 NULL, NULL, FALSE, 0,
71     NULL, NULL,
72     &si,
73     &pi
74     );
75 joko 1.4 check_alert_error("CreateProcess");
76 joko 1.3
77     if (!background) {
78     long status;
79     status = WaitForSingleObject(pi.hProcess, INFINITE);
80     if (status == WAIT_FAILED) {
81     check_alert_error("WaitForSingleObject");
82 joko 1.4 return FALSE;
83 joko 1.3 }
84     }
85 joko 1.4
86     return TRUE;
87 joko 1.3
88     }
89    
90 joko 1.4 void check_alert_error(const char * error_source) {
91 joko 1.3 DWORD dwError = GetLastError();
92 joko 1.2
93 joko 1.4 HLOCAL message = NULL;
94     BOOL fOk;
95    
96     if (dwError == 0)
97     return;
98 joko 1.3
99 joko 1.4 fOk = FormatMessage(
100 joko 1.3 FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER,
101     NULL,
102     dwError,
103     MAKELANGID(LANG_NEUTRAL, SUBLANG_SYS_DEFAULT),
104 joko 1.4 (PTSTR)&message,
105 joko 1.3 0,
106     NULL
107     );
108    
109 joko 1.4 if (message != NULL) {
110     fprintf(stderr, "Error with '%s': %s (Code %i)\n", error_source, message, dwError);
111     LocalFree(message);
112 joko 1.3 }
113    
114 joko 1.2 }

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