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

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

Parent Directory Parent Directory | Revision Log Revision Log


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

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