1 | //
|
---|
2 | // MINSTALL/CLI (c) Copyright 2002-2005 Martin Kiewitz
|
---|
3 | //
|
---|
4 | // This file is part of MINSTALL/CLI for OS/2 / eComStation
|
---|
5 | //
|
---|
6 | // MINSTALL/CLI is free software: you can redistribute it and/or modify
|
---|
7 | // it under the terms of the GNU General Public License as published by
|
---|
8 | // the Free Software Foundation, either version 3 of the License, or
|
---|
9 | // (at your option) any later version.
|
---|
10 | //
|
---|
11 | // MINSTALL/CLI is distributed in the hope that it will be useful,
|
---|
12 | // but WITHOUT ANY WARRANTY; without even the implied warranty of
|
---|
13 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
---|
14 | // GNU General Public License for more details.
|
---|
15 | //
|
---|
16 | // You should have received a copy of the GNU General Public License
|
---|
17 | // along with MINSTALL/CLI. If not, see <http://www.gnu.org/licenses/>.
|
---|
18 | //
|
---|
19 |
|
---|
20 | #define INCL_BASE
|
---|
21 | #define INCL_DOSMODULEMGR
|
---|
22 | #define INCL_WINMESSAGEMGR
|
---|
23 | #define INCL_WINWINDOWMGR
|
---|
24 | #include <os2.h>
|
---|
25 | #include <malloc.h>
|
---|
26 |
|
---|
27 | #define INCLUDE_STD_MAIN
|
---|
28 | #include <global.h>
|
---|
29 | #include <cid.h>
|
---|
30 | #include <crcs.h>
|
---|
31 | #include <file.h>
|
---|
32 | #include <globstr.h>
|
---|
33 | #include <msg.h>
|
---|
34 | #include <mmi_public.h>
|
---|
35 | #include <mmi_msg.h>
|
---|
36 |
|
---|
37 | CHAR Inkey (void) {
|
---|
38 | KBDKEYINFO UserKey;
|
---|
39 |
|
---|
40 | KbdCharIn(&UserKey,0,0);
|
---|
41 | return UserKey.chChar;
|
---|
42 | }
|
---|
43 |
|
---|
44 | // CID-Mode is set, when we are executed in CID-Mode (/R switch)
|
---|
45 | // (CIDCompatibility is set in that case, if response file is old format)
|
---|
46 | BOOL MINSTCLI_CIDMode = FALSE;
|
---|
47 | ULONG MINSTCLI_ErrorMsgID = 0;
|
---|
48 | // CID-Create is set, when being in create-response-file-mode (/C switch)
|
---|
49 | // Compatibility is set for original way of creating response files
|
---|
50 | BOOL MINSTCLI_CIDCreate = FALSE;
|
---|
51 | BOOL MINSTCLI_CIDCompatibility = FALSE;
|
---|
52 | // Logfile is set, when log-file is specified /L switch)
|
---|
53 | CHAR MINSTCLI_LogFileName[MINSTMAX_PATHLENGTH] = {0};
|
---|
54 | // Response file for either CIDmode or CIDrecord
|
---|
55 | CHAR MINSTCLI_ResponseFileName[MINSTMAX_PATHLENGTH] = {0};
|
---|
56 | ULONG MINSTCLI_ResponseGroups = 0;
|
---|
57 | // Source-Path containing CONTROL.scr (only path!)
|
---|
58 | CHAR MINSTCLI_SourcePath[MINSTMAX_PATHLENGTH] = {0};
|
---|
59 | CHAR MINSTCLI_TargetPath[MINSTMAX_PATHLENGTH] = {0};
|
---|
60 | ULONG MINSTCLI_TargetBootDrive = 0;
|
---|
61 |
|
---|
62 | FILECONTROL RESPONSEFILE;
|
---|
63 | PCHAR MINSTCLI_ResponseFilePos;
|
---|
64 | ULONG MINSTCLI_ResponseFileLine;
|
---|
65 |
|
---|
66 | PMINSTPUBGROUP MINSTCLI_PubGroupPtr = 0;
|
---|
67 | ULONG MINSTCLI_PubGroupCount = 0;
|
---|
68 |
|
---|
69 | // /M -> run from MMTEMP??
|
---|
70 | // /L:file -> logfile
|
---|
71 | // /R:file -> response file mode (CID)
|
---|
72 | // /F:file -> points to control.scr file (CLI mode)
|
---|
73 | // /C:file -> create response file (for CID)
|
---|
74 |
|
---|
75 | CHAR MINSTCLI_GetSelectionChar (ULONG SelectionNo) {
|
---|
76 | if (SelectionNo>35) return 0;
|
---|
77 |
|
---|
78 | if (SelectionNo<9) {
|
---|
79 | SelectionNo += '1';
|
---|
80 | } else if (SelectionNo==9) {
|
---|
81 | SelectionNo = '0';
|
---|
82 | } else {
|
---|
83 | SelectionNo += 55;
|
---|
84 | }
|
---|
85 | return SelectionNo;
|
---|
86 | }
|
---|
87 |
|
---|
88 | LONG MINSTCLI_GetSelectionFromUser (ULONG MaxChoice) {
|
---|
89 | CHAR CurChar;
|
---|
90 | LONG CurSelection;
|
---|
91 |
|
---|
92 | while (1) {
|
---|
93 | CurChar = toupper(Inkey());
|
---|
94 | if (CurChar==0x1B) { // User pressed ESC
|
---|
95 | return -1;
|
---|
96 | } else if (CurChar==0x0D) { // User pressed ENTER
|
---|
97 | return -2;
|
---|
98 | } else {
|
---|
99 | CurSelection = -1;
|
---|
100 | if ((CurChar>='1') && (CurChar<='9')) {
|
---|
101 | CurSelection = CurChar-'1';
|
---|
102 | } else if (CurChar=='0') {
|
---|
103 | CurSelection = 9;
|
---|
104 | } else if ((CurChar>='A') && (CurChar<='Z')) {
|
---|
105 | CurSelection = CurChar-55;
|
---|
106 | }
|
---|
107 | if (CurSelection!=-1) {
|
---|
108 | if (CurSelection<MaxChoice) return CurSelection;
|
---|
109 | }
|
---|
110 | }
|
---|
111 | }
|
---|
112 | }
|
---|
113 |
|
---|
114 | BOOL MINSTCLI_UserGroupSelection (void) {
|
---|
115 | PSZ PackageName = 0;
|
---|
116 | PMINSTPUBGROUP CurGroupPtr = 0;
|
---|
117 | ULONG CurGroupNo = 0;
|
---|
118 | ULONG CurPromptNo = 0;
|
---|
119 | PSZ CurOptionPtr = 0;
|
---|
120 | ULONG CurOptionNo = 0;
|
---|
121 | LONG CurChoice = 0;
|
---|
122 | LONG MaxChoice = 0;
|
---|
123 | ULONG CurCardNo = 0;
|
---|
124 | ULONG CardCount = 0;
|
---|
125 | CHAR TempValueStr[2] = {0};
|
---|
126 |
|
---|
127 | PackageName = MINSTALL_GetPackageTitlePtr();
|
---|
128 |
|
---|
129 | if (MINSTCLI_PubGroupCount) {
|
---|
130 | // First let user choose selection of public groups...
|
---|
131 | while (1) {
|
---|
132 | printf ("\x1B[2J");
|
---|
133 | MSG_Print (MINSTMSG_CLITrailer);
|
---|
134 | printf ("\n");
|
---|
135 | MSG_SetInsertViaPSZ (1, PackageName);
|
---|
136 | MSG_Print (MINSTMSG_CLIActivePackageIs);
|
---|
137 | printf ("\n");
|
---|
138 |
|
---|
139 | // Print out all groups...
|
---|
140 | CurGroupNo = 0; CurGroupPtr = MINSTCLI_PubGroupPtr;
|
---|
141 | while (CurGroupNo<MINSTCLI_PubGroupCount) {
|
---|
142 | CurChoice = MINSTCLI_GetSelectionChar(CurGroupNo);
|
---|
143 | printf ("%c - '%s'", CurChoice, CurGroupPtr->Name);
|
---|
144 | if (CurGroupPtr->Selected) {
|
---|
145 | MSG_Print (MINSTMSG_CLIIsSelected);
|
---|
146 | }
|
---|
147 | printf ("\n");
|
---|
148 | CurGroupNo++; CurGroupPtr++;
|
---|
149 | }
|
---|
150 | printf ("\n");
|
---|
151 | MSG_Print (MINSTMSG_CLIChooseGroup);
|
---|
152 |
|
---|
153 | CurChoice = MINSTCLI_GetSelectionFromUser(MINSTCLI_PubGroupCount);
|
---|
154 | if (CurChoice==-1) { // User pressed ESC
|
---|
155 | return FALSE;
|
---|
156 | } else if (CurChoice==-2) { // User pressed ENTER
|
---|
157 | break;
|
---|
158 | } else { // Group-Selection
|
---|
159 | // So display group and ask, if user wants to select or deselect it
|
---|
160 | CurGroupNo = 0; CurGroupPtr = MINSTCLI_PubGroupPtr;
|
---|
161 | while (CurGroupNo<CurChoice) {
|
---|
162 | CurGroupNo++; CurGroupPtr++;
|
---|
163 | }
|
---|
164 | if (!CurGroupPtr->SelectionForced) {
|
---|
165 | if (CurGroupPtr->Selected) {
|
---|
166 | MINSTALL_DeSelectGroup (CurGroupPtr->ID);
|
---|
167 | } else {
|
---|
168 | MINSTALL_SelectGroup (CurGroupPtr->ID);
|
---|
169 | }
|
---|
170 | } else {
|
---|
171 | printf ("\n");
|
---|
172 | MSG_Print (MINSTMSG_CLISelectionForced);
|
---|
173 | Inkey();
|
---|
174 | }
|
---|
175 | }
|
---|
176 | }
|
---|
177 |
|
---|
178 | // Now let him choose user options per selected group...
|
---|
179 | CurGroupNo = 0; CurGroupPtr = MINSTCLI_PubGroupPtr;
|
---|
180 | while (CurGroupNo<MINSTCLI_PubGroupCount) {
|
---|
181 | if (CurGroupPtr->Selected) {
|
---|
182 | if (CurGroupPtr->MaxCardCount>0) {
|
---|
183 | printf ("\x1B[2J");
|
---|
184 | MSG_Print (MINSTMSG_CLITrailer);
|
---|
185 | printf ("\n");
|
---|
186 | MSG_SetInsertViaPSZ (1, PackageName);
|
---|
187 | MSG_Print (MINSTMSG_CLIActivePackageIs);
|
---|
188 | MSG_SetInsertViaPSZ (1, CurGroupPtr->Name);
|
---|
189 | MSG_Print (MINSTMSG_CLIActiveGroupIs);
|
---|
190 | printf ("\n");
|
---|
191 |
|
---|
192 | ultoa (CurGroupPtr->MaxCardCount, TempValueStr, 10);
|
---|
193 | MSG_SetInsertViaPSZ (1, TempValueStr);
|
---|
194 | MSG_Print (MINSTMSG_CLICardSelect);
|
---|
195 | while (1) {
|
---|
196 | CurChoice = Inkey();
|
---|
197 | if (CurChoice==0x1B) {
|
---|
198 | return FALSE;
|
---|
199 | } else if (CurChoice=='0') {
|
---|
200 | CardCount = 0; break;
|
---|
201 | } else if ((CurChoice>='1') && (CurChoice<='9')) {
|
---|
202 | CardCount = CurChoice-'0';
|
---|
203 | if (CardCount<=CurGroupPtr->MaxCardCount)
|
---|
204 | break;
|
---|
205 | }
|
---|
206 | }
|
---|
207 | // User chose CardCount, so set it for MINSTALL.DLL
|
---|
208 | MINSTALL_SetCARDINFOCardCountForGroup (CurGroupPtr->ID, CardCount);
|
---|
209 |
|
---|
210 | CurCardNo = 1;
|
---|
211 | while (CurCardNo<=CardCount) {
|
---|
212 | // Give user selection over user prompts per Card
|
---|
213 | if (CurGroupPtr->PromptsCount) {
|
---|
214 | // Set Insert 2 (contains Card-Number)
|
---|
215 | while (1) {
|
---|
216 | // Display Prompt-Selection...
|
---|
217 | printf ("\x1B[2J");
|
---|
218 | MSG_Print (MINSTMSG_CLITrailer);
|
---|
219 | printf ("\n");
|
---|
220 | MSG_SetInsertViaPSZ (1, PackageName);
|
---|
221 | MSG_Print (MINSTMSG_CLIActivePackageIs);
|
---|
222 | MSG_SetInsertViaPSZ (1, CurGroupPtr->Name);
|
---|
223 | MSG_Print (MINSTMSG_CLIActiveGroupIs);
|
---|
224 | ultoa (CurCardNo, TempValueStr, 10);
|
---|
225 | MSG_SetInsertViaPSZ (1, TempValueStr);
|
---|
226 | MSG_Print (MINSTMSG_CLIActiveCardNoIs);
|
---|
227 | printf ("\n");
|
---|
228 |
|
---|
229 | // List all prompt-titles including current selection
|
---|
230 | CurPromptNo = 0;
|
---|
231 | while (CurPromptNo<CurGroupPtr->PromptsCount) {
|
---|
232 | CurChoice = MINSTCLI_GetSelectionChar(CurPromptNo);
|
---|
233 | CurOptionNo = MINSTALL_GetCARDINFOChoiceForGroup (CurGroupPtr->ID, CurCardNo, CurPromptNo+1);
|
---|
234 | CurOptionPtr = CurGroupPtr->PromptChoiceStrings[CurPromptNo];
|
---|
235 | while (CurOptionNo>1) {
|
---|
236 | CurOptionPtr = STRING_SkipASCIIZ(CurOptionPtr, NULL);
|
---|
237 | CurOptionNo--;
|
---|
238 | }
|
---|
239 | printf ("%c - %s\x1B[80D\x1B[54C%s\n", CurChoice, CurGroupPtr->PromptTitlePtr[CurPromptNo], CurOptionPtr);
|
---|
240 | CurPromptNo++;
|
---|
241 | }
|
---|
242 | printf ("\n");
|
---|
243 | MSG_Print (MINSTMSG_CLIChoosePrompt);
|
---|
244 |
|
---|
245 | CurChoice = MINSTCLI_GetSelectionFromUser(CurGroupPtr->PromptsCount);
|
---|
246 | if (CurChoice==-1) { // User pressed ESC
|
---|
247 | return FALSE;
|
---|
248 | } else if (CurChoice==-2) { // User pressed ENTER
|
---|
249 | break;
|
---|
250 | } else { // Prompt-Selection
|
---|
251 | CurPromptNo = CurChoice;
|
---|
252 |
|
---|
253 | while (1) {
|
---|
254 | // So show prompt and let user choose
|
---|
255 | printf ("\x1B[2J");
|
---|
256 | MSG_Print (MINSTMSG_CLITrailer);
|
---|
257 | printf ("\n");
|
---|
258 | MSG_SetInsertViaPSZ (1, PackageName);
|
---|
259 | MSG_Print (MINSTMSG_CLIActivePackageIs);
|
---|
260 | MSG_SetInsertViaPSZ (1, CurGroupPtr->Name);
|
---|
261 | MSG_Print (MINSTMSG_CLIActiveGroupIs);
|
---|
262 | ultoa (CurCardNo, TempValueStr, 10);
|
---|
263 | MSG_SetInsertViaPSZ (1, TempValueStr);
|
---|
264 | MSG_Print (MINSTMSG_CLIActiveCardNoIs);
|
---|
265 | MSG_SetInsertViaPSZ (1, CurGroupPtr->PromptTitlePtr[CurPromptNo]);
|
---|
266 | MSG_Print (MINSTMSG_CLIActivePromptIs);
|
---|
267 | printf ("\n");
|
---|
268 |
|
---|
269 | // List all prompt-selections...
|
---|
270 | CurOptionNo = 0; CurOptionPtr = CurGroupPtr->PromptChoiceStrings[CurPromptNo];
|
---|
271 | while (CurOptionNo<CurGroupPtr->PromptChoiceCount[CurPromptNo]) {
|
---|
272 | CurChoice = MINSTCLI_GetSelectionChar(CurOptionNo);
|
---|
273 | printf ("%c - '%s'\n", CurChoice, CurOptionPtr);
|
---|
274 | CurOptionPtr = STRING_SkipASCIIZ(CurOptionPtr, NULL);
|
---|
275 | CurOptionNo++;
|
---|
276 | }
|
---|
277 |
|
---|
278 | printf ("\n");
|
---|
279 | MSG_Print (MINSTMSG_CLIChooseOption);
|
---|
280 |
|
---|
281 | CurChoice = MINSTCLI_GetSelectionFromUser(CurGroupPtr->PromptChoiceCount[CurPromptNo]);
|
---|
282 | if (CurChoice==-1) { // User pressed ESC
|
---|
283 | break;
|
---|
284 | } else { // Prompt-Selection
|
---|
285 | MINSTALL_SetCARDINFOChoiceForGroup (CurGroupPtr->ID, CurCardNo, CurPromptNo+1, CurChoice+1);
|
---|
286 | break;
|
---|
287 | }
|
---|
288 | }
|
---|
289 | }
|
---|
290 | }
|
---|
291 | }
|
---|
292 | CurCardNo++;
|
---|
293 | }
|
---|
294 | }
|
---|
295 | }
|
---|
296 | CurGroupNo++; CurGroupPtr++;
|
---|
297 | }
|
---|
298 | }
|
---|
299 |
|
---|
300 | printf ("\n");
|
---|
301 | // Dont ask user for confirmation, if we create a response file only
|
---|
302 | if ((MINSTCLI_CIDCreate) && (!MINSTCLI_CIDCompatibility))
|
---|
303 | return TRUE;
|
---|
304 | // Otherwise ask just for security...
|
---|
305 | MSG_Print (MINSTMSG_CLISureToInstallPackage);
|
---|
306 | if (Inkey()==0x0D)
|
---|
307 | return TRUE;
|
---|
308 | return FALSE;
|
---|
309 | }
|
---|
310 |
|
---|
311 | VOID MINSTCID_CreateResponseFile (void) {
|
---|
312 | FILE *ResponseFile = 0;
|
---|
313 | PMINSTPUBGROUP CurGroupPtr = MINSTCLI_PubGroupPtr;
|
---|
314 | ULONG CurGroupNo = 0;
|
---|
315 | ULONG TotalSelectedGroups = 0;
|
---|
316 | PSZ SourcePathPtr = 0;
|
---|
317 | CHAR SourcePath[MINSTMAX_PATHLENGTH] = {0};
|
---|
318 | PSZ TargetPathPtr = 0;
|
---|
319 | CHAR TargetPath[MINSTMAX_PATHLENGTH] = {0};
|
---|
320 | PSZ CustomDataPtr = 0;
|
---|
321 | CHAR CustomData[MINSTMAX_CUSTOMDATALENGTH];
|
---|
322 | ULONG MaxLength = 0;
|
---|
323 |
|
---|
324 | ResponseFile = fopen(MINSTCLI_ResponseFileName, "w+");
|
---|
325 | if (ResponseFile) {
|
---|
326 | fprintf (ResponseFile, "/* Response file generated by Multimedia Installer CLI/CID */\n\n");
|
---|
327 | fprintf (ResponseFile, "MMINSTALL = (\n");
|
---|
328 |
|
---|
329 | // Get current Source and Target-Path from MINSTALL...
|
---|
330 | SourcePathPtr = MINSTALL_GetSourcePathPtr();
|
---|
331 | TargetPathPtr = MINSTALL_GetTargetPathPtr();
|
---|
332 |
|
---|
333 | MaxLength = MINSTMAX_PATHLENGTH;
|
---|
334 | if (STRING_BuildEscaped(SourcePath, &MaxLength, SourcePathPtr))
|
---|
335 | fprintf (ResponseFile, " SOURCE = \"%s\"\n", SourcePath);
|
---|
336 | MaxLength = MINSTMAX_PATHLENGTH;
|
---|
337 | if (STRING_BuildEscaped(TargetPath, &MaxLength, TargetPathPtr))
|
---|
338 | fprintf (ResponseFile, " TARGET = \"%s\"\n", TargetPath);
|
---|
339 | fprintf (ResponseFile, " TARGETBOOT = \"\"\n\n");
|
---|
340 |
|
---|
341 | while (CurGroupNo<MINSTCLI_PubGroupCount) {
|
---|
342 | if (CurGroupPtr->Selected)
|
---|
343 | TotalSelectedGroups++;
|
---|
344 | CurGroupNo++; CurGroupPtr++;
|
---|
345 | }
|
---|
346 | fprintf (ResponseFile, " GROUPS[%d] = (\n", TotalSelectedGroups);
|
---|
347 |
|
---|
348 | CurGroupNo = 0; CurGroupPtr = MINSTCLI_PubGroupPtr;
|
---|
349 | while (CurGroupNo<MINSTCLI_PubGroupCount) {
|
---|
350 | if (CurGroupPtr->Selected) {
|
---|
351 | fprintf (ResponseFile, " ( GROUPID = %d\n", CurGroupPtr->ID);
|
---|
352 |
|
---|
353 | MaxLength = MINSTMAX_PATHLENGTH;
|
---|
354 | CustomDataPtr = MINSTALL_GetPublicGroupCustomDataPtr(CurGroupPtr->ID);
|
---|
355 | STRING_BuildEscaped(CustomData, &MaxLength, CustomDataPtr);
|
---|
356 | fprintf (ResponseFile, " CUSTOMDATA = \"%s\"\n", CustomData);
|
---|
357 | fprintf (ResponseFile, " )\n");
|
---|
358 | }
|
---|
359 | CurGroupNo++; CurGroupPtr++;
|
---|
360 | }
|
---|
361 |
|
---|
362 | fprintf (ResponseFile, " )\n");
|
---|
363 | fprintf (ResponseFile, " )\n");
|
---|
364 | fclose (ResponseFile);
|
---|
365 | ResponseFile = 0;
|
---|
366 |
|
---|
367 | MSG_Print (MINSTMSG_CLIResponseFileCreated);
|
---|
368 | }
|
---|
369 | }
|
---|
370 |
|
---|
371 | ULONG MINSTCLI_GetNextRespParmID (PCHAR *CurPosPtr, PCHAR EndPos, PULONG CurLineNoPtr, PLONG ArrayCountPtr) {
|
---|
372 | PCHAR StartPos = *CurPosPtr;
|
---|
373 | PCHAR CurPos = StartPos;
|
---|
374 | CHAR CurChar = *CurPos;
|
---|
375 | ULONG ParamID;
|
---|
376 |
|
---|
377 | // Isolate till space or '='...
|
---|
378 | StartPos = CurPos;
|
---|
379 | while (CurPos<EndPos) {
|
---|
380 | *CurPos = toupper(CurChar);
|
---|
381 | if ((CurChar==0x0D) || (CurChar==' ') || (CurChar=='[') || (CurChar=='=')) {
|
---|
382 | ParamID = CRC32_GetFromString(StartPos, CurPos-StartPos);
|
---|
383 | *CurPosPtr = CurPos;
|
---|
384 | if (!(CurChar = STRING_GetValidChar(CurPosPtr, EndPos, CurLineNoPtr))) {
|
---|
385 | MINSTCLI_ErrorMsgID = MINSTMSG_CLIResponseFileIsInvalid; return 0; }
|
---|
386 | if (CurChar=='[') {
|
---|
387 | // We got an array here...
|
---|
388 | *CurPosPtr += 1;
|
---|
389 | if (!(*CurPosPtr = STRING_GetNumericValue ((PULONG)ArrayCountPtr, *CurPosPtr, EndPos))) {
|
---|
390 | MINSTCLI_ErrorMsgID = MINSTMSG_CLIResponseFileIsInvalid; return 0; }
|
---|
391 | if (**CurPosPtr!=']') {
|
---|
392 | MSG_Print (MINSTMSG_CLIResponseFileIsInvalid); return 0; }
|
---|
393 | *CurPosPtr += 1;
|
---|
394 | if (STRING_GetValidChar(CurPosPtr, EndPos, CurLineNoPtr)!='=') {
|
---|
395 | MINSTCLI_ErrorMsgID = MINSTMSG_CLIResponseFileIsInvalid; return 0; }
|
---|
396 | } else if (CurChar!='=') {
|
---|
397 | MINSTCLI_ErrorMsgID = MINSTMSG_CLIResponseFileIsInvalid; return 0;
|
---|
398 | } else {
|
---|
399 | *ArrayCountPtr = -1;
|
---|
400 | }
|
---|
401 | *CurPosPtr += 1;
|
---|
402 | // Now seek to next valid char...
|
---|
403 | if (!STRING_GetValidChar(CurPosPtr, EndPos, CurLineNoPtr)) {
|
---|
404 | MINSTCLI_ErrorMsgID = MINSTMSG_UnexpectedEndOfFile; return 0; }
|
---|
405 | return ParamID;
|
---|
406 | }
|
---|
407 | CurPos++; CurChar = *CurPos;
|
---|
408 | }
|
---|
409 | // Experienced End-Of-Buffer...
|
---|
410 | *CurPosPtr = CurPos; MINSTCLI_ErrorMsgID = MINSTMSG_UnexpectedEndOfFile;
|
---|
411 | return 0;
|
---|
412 | }
|
---|
413 |
|
---|
414 | BOOL MINSTCLI_ReadResponseHeader (void) {
|
---|
415 | PCHAR StartPos;
|
---|
416 | PCHAR EndPos = RESPONSEFILE.BufferEndPtr;
|
---|
417 | PCHAR CurPos = MINSTCLI_ResponseFilePos;
|
---|
418 | ULONG CurLineNo = MINSTCLI_ResponseFileLine;
|
---|
419 | LONG ArrayCount = -1;
|
---|
420 | CHAR CurChar;
|
---|
421 | ULONG CRC32;
|
---|
422 | ULONG GotParms = 0;
|
---|
423 | BOOL HeaderDone = FALSE;
|
---|
424 | CHAR TargetBootPath[MINSTMAX_PATHLENGTH] = {0};
|
---|
425 | ULONG TargetBootPathLen = 0;
|
---|
426 |
|
---|
427 | if (!STRING_GetValidChar (&CurPos, EndPos, &CurLineNo))
|
---|
428 | return FALSE; // No more valid chars, so done...
|
---|
429 |
|
---|
430 | // Get first Parameter-ID...
|
---|
431 | CRC32 = MINSTCLI_GetNextRespParmID (&CurPos, EndPos, &CurLineNo, &ArrayCount);
|
---|
432 |
|
---|
433 | if (CRC32==0xF6AFBBDF) { // Is 'MMINSTALL'?
|
---|
434 | // So, we found new response file format...
|
---|
435 | MINSTCLI_CIDCompatibility = FALSE;
|
---|
436 |
|
---|
437 | if (*CurPos!='(') {
|
---|
438 | MINSTCLI_ErrorMsgID = MINSTMSG_CLIResponseFileIsInvalid;
|
---|
439 | } else {
|
---|
440 | CurPos++;
|
---|
441 |
|
---|
442 | while ((CurChar = STRING_GetValidChar(&CurPos, EndPos, &CurLineNo))!=0) {
|
---|
443 | if (CurChar==')') {
|
---|
444 | MINSTCLI_ErrorMsgID = MINSTMSG_CLIResponseFileIsInvalid; break; }
|
---|
445 | CRC32 = MINSTCLI_GetNextRespParmID (&CurPos, EndPos, &CurLineNo, &ArrayCount);
|
---|
446 | switch (CRC32) {
|
---|
447 | case 0xAF72B8F5: // SOURCE - defines source path
|
---|
448 | if (ArrayCount!=-1) {
|
---|
449 | MINSTCLI_ErrorMsgID = MINSTMSG_CLIResponseFileIsInvalid; break; }
|
---|
450 | if (!(GotParms & 0x01)) {
|
---|
451 | CurPos = STRING_GetString(MINSTCLI_SourcePath, MINSTMAX_PATHLENGTH, CurPos, EndPos);
|
---|
452 | if (!CurPos) {
|
---|
453 | MINSTCLI_ErrorMsgID = MINSTMSG_UnexpectedEndOfFile; }
|
---|
454 | GotParms |= 0x01;
|
---|
455 | } else {
|
---|
456 | MINSTCLI_ErrorMsgID = MINSTMSG_CLIResponseFileIsInvalid; }
|
---|
457 | break;
|
---|
458 | case 0xB697E87A: // TARGET - defines target path
|
---|
459 | if (ArrayCount!=-1) {
|
---|
460 | MINSTCLI_ErrorMsgID = MINSTMSG_CLIResponseFileIsInvalid; break; }
|
---|
461 | if (!(GotParms & 0x02)) {
|
---|
462 | CurPos = STRING_GetString(MINSTCLI_TargetPath, MINSTMAX_PATHLENGTH, CurPos, EndPos);
|
---|
463 | if (!CurPos) {
|
---|
464 | MINSTCLI_ErrorMsgID = MINSTMSG_UnexpectedEndOfFile; }
|
---|
465 | GotParms |= 0x02;
|
---|
466 | } else {
|
---|
467 | MINSTCLI_ErrorMsgID = MINSTMSG_CLIResponseFileIsInvalid; }
|
---|
468 | break;
|
---|
469 | case 0xCF0988F4: // TARGETBOOT - defines target boot-drive
|
---|
470 | if (ArrayCount!=-1) {
|
---|
471 | MINSTCLI_ErrorMsgID = MINSTMSG_CLIResponseFileIsInvalid; break; }
|
---|
472 | if (!(GotParms & 0x04)) {
|
---|
473 | CurPos = STRING_GetString(TargetBootPath, MINSTMAX_PATHLENGTH, CurPos, EndPos);
|
---|
474 | if (!CurPos) {
|
---|
475 | MINSTCLI_ErrorMsgID = MINSTMSG_UnexpectedEndOfFile; }
|
---|
476 | TargetBootPathLen = strlen(TargetBootPath);
|
---|
477 | if (TargetBootPathLen==2) {
|
---|
478 | // If 2 chars specified, 2nd one has to be ':' and 1st one
|
---|
479 | // is supposed to be the drive letter
|
---|
480 | if (TargetBootPath[1]!=':') {
|
---|
481 | MINSTCLI_ErrorMsgID = MINSTMSG_CLIResponseFileIsInvalid; break; }
|
---|
482 | // We only set TargetBootDrive once. If multiple packages
|
---|
483 | // are installed, they *will* use the same TargetBootDrive
|
---|
484 | // anyway.
|
---|
485 | if (!MINSTCLI_TargetBootDrive) {
|
---|
486 | MINSTCLI_TargetBootDrive = TargetBootPath[0]-0x40;
|
---|
487 | if ((MINSTCLI_TargetBootDrive<1) || (MINSTCLI_TargetBootDrive>26)) {
|
---|
488 | MINSTCLI_ErrorMsgID = MINSTMSG_CLIResponseFileIsInvalid; break; }
|
---|
489 | }
|
---|
490 | } else if (TargetBootPathLen) {
|
---|
491 | // If not 2 chars or no chars -> error!
|
---|
492 | MINSTCLI_ErrorMsgID = MINSTMSG_CLIResponseFileIsInvalid; break; }
|
---|
493 | GotParms |= 0x04;
|
---|
494 | } else {
|
---|
495 | MINSTCLI_ErrorMsgID = MINSTMSG_CLIResponseFileIsInvalid; }
|
---|
496 | break;
|
---|
497 | case 0x0095FEF6: // GROUPS...
|
---|
498 | if (ArrayCount==-1) {
|
---|
499 | MINSTCLI_ErrorMsgID = MINSTMSG_CLIResponseFileIsInvalid; break; }
|
---|
500 | GotParms |= 0x08;
|
---|
501 | if (*CurPos!='(') {
|
---|
502 | MINSTCLI_ErrorMsgID = MINSTMSG_CLIResponseFileIsInvalid; break; }
|
---|
503 | CurPos++;
|
---|
504 | // We got the info we needed...
|
---|
505 | MINSTCLI_ResponseGroups = ArrayCount; HeaderDone = TRUE;
|
---|
506 | break;
|
---|
507 | default:
|
---|
508 | MINSTCLI_ErrorMsgID = MINSTMSG_BadCommand;
|
---|
509 | }
|
---|
510 |
|
---|
511 | if ((MINSTCLI_ErrorMsgID) || (HeaderDone)) break;
|
---|
512 | }
|
---|
513 |
|
---|
514 | // Check, if we got SOURCE, TARGET, TARGETBOOT and GROUPS...
|
---|
515 | if (GotParms!=0x0F) {
|
---|
516 | MINSTCLI_ErrorMsgID = MINSTMSG_CLIResponseFileIsInvalid; }
|
---|
517 | }
|
---|
518 |
|
---|
519 | } else {
|
---|
520 | // Oh, Oh, we possibly have to old ugly IBM format...
|
---|
521 | MINSTCLI_CIDCompatibility = TRUE;
|
---|
522 | while (CRC32) {
|
---|
523 | if (ArrayCount!=-1) { // Someone has defined array? NoWay
|
---|
524 | MINSTCLI_ErrorMsgID = MINSTMSG_CLIResponseFileIsInvalid; break; }
|
---|
525 | switch (CRC32) {
|
---|
526 | case 0xAEB9F0B1: // MMINSTSOURCE - defines source path
|
---|
527 | if (!(GotParms & 0x01)) {
|
---|
528 | CurPos = STRING_GetString(MINSTCLI_SourcePath, MINSTMAX_PATHLENGTH, CurPos, EndPos);
|
---|
529 | if (!CurPos) {
|
---|
530 | MINSTCLI_ErrorMsgID = MINSTMSG_UnexpectedEndOfFile; }
|
---|
531 | GotParms |= 0x01;
|
---|
532 | } else {
|
---|
533 | MINSTCLI_ErrorMsgID = MINSTMSG_CLIResponseFileIsInvalid; }
|
---|
534 | break;
|
---|
535 | case 0xB75CA03E: // MMINSTTARGET - defines target *drive*
|
---|
536 | if (!(GotParms & 0x02)) {
|
---|
537 | CurPos = STRING_GetString(MINSTCLI_TargetPath, MINSTMAX_PATHLENGTH, CurPos, EndPos);
|
---|
538 | if (!CurPos) {
|
---|
539 | MINSTCLI_ErrorMsgID = MINSTMSG_UnexpectedEndOfFile; }
|
---|
540 | // Add ':\MMOS2' to the Target-Path
|
---|
541 | strcpy (MINSTCLI_TargetPath+1, ":\\MMOS2");
|
---|
542 | GotParms |= 0x02;
|
---|
543 | } else {
|
---|
544 | MINSTCLI_ErrorMsgID = MINSTMSG_CLIResponseFileIsInvalid; }
|
---|
545 | break;
|
---|
546 | case 0x975037BD: // CHANGECONFIG - compatibility accept only...
|
---|
547 | CurPos = STRING_SkipString (CurPos, EndPos);
|
---|
548 | if (!CurPos) {
|
---|
549 | MINSTCLI_ErrorMsgID = MINSTMSG_UnexpectedEndOfFile; }
|
---|
550 | break;
|
---|
551 | case 0x015EB6B2: // MMINSTGROUPS - Lists groups & custom data
|
---|
552 | // Check, if Source and Target are defined, then exit
|
---|
553 | GotParms |= 0x04;
|
---|
554 | CurChar = STRING_GetValidChar(&CurPos, EndPos, &CurLineNo);
|
---|
555 | if (CurChar!='(') {
|
---|
556 | MINSTCLI_ErrorMsgID = MINSTMSG_CLIResponseFileIsInvalid; break; }
|
---|
557 | CurPos++; HeaderDone = TRUE; // We got the info we needed...
|
---|
558 | break;
|
---|
559 | default:
|
---|
560 | MINSTCLI_ErrorMsgID = MINSTMSG_BadCommand;
|
---|
561 | }
|
---|
562 | if ((MINSTCLI_ErrorMsgID) || (HeaderDone)) break;
|
---|
563 |
|
---|
564 | // No more chars? -> so break!
|
---|
565 | if (!STRING_GetValidChar (&CurPos, EndPos, &CurLineNo)) {
|
---|
566 | MINSTCLI_ErrorMsgID = MINSTMSG_UnexpectedEndOfFile; break; }
|
---|
567 |
|
---|
568 | // Get next Parameter-ID...
|
---|
569 | CRC32 = MINSTCLI_GetNextRespParmID (&CurPos, EndPos, &CurLineNo, &ArrayCount);
|
---|
570 | }
|
---|
571 |
|
---|
572 | // Check, if we got SOURCE, TARGET and GROUPS...
|
---|
573 | if (GotParms!=0x07) {
|
---|
574 | MINSTCLI_ErrorMsgID = MINSTMSG_CLIResponseFileIsInvalid; }
|
---|
575 | }
|
---|
576 |
|
---|
577 | if (MINSTCLI_ErrorMsgID) {
|
---|
578 | MSG_SetInsertFileLocation (1, RESPONSEFILE.Name, CurLineNo);
|
---|
579 | MSG_Print (MINSTCLI_ErrorMsgID);
|
---|
580 | return FALSE;
|
---|
581 | }
|
---|
582 |
|
---|
583 | // Remember those variables for later...
|
---|
584 | MINSTCLI_ResponseFilePos = CurPos;
|
---|
585 | MINSTCLI_ResponseFileLine = CurLineNo;
|
---|
586 | return TRUE;
|
---|
587 | }
|
---|
588 |
|
---|
589 | BOOL MINSTCLI_ReadResponseData (void) {
|
---|
590 | PCHAR StartPos;
|
---|
591 | PCHAR EndPos = RESPONSEFILE.BufferEndPtr;
|
---|
592 | PCHAR CurPos = MINSTCLI_ResponseFilePos;
|
---|
593 | ULONG CurLineNo = MINSTCLI_ResponseFileLine;
|
---|
594 | LONG ArrayCount = -1;
|
---|
595 | CHAR CurChar;
|
---|
596 | ULONG CRC32;
|
---|
597 | ULONG GroupID = 0;
|
---|
598 | ULONG GroupNo = 0;
|
---|
599 | ULONG GotParms = 0;
|
---|
600 | CHAR CustomData[MINSTMAX_CUSTOMDATALENGTH];
|
---|
601 |
|
---|
602 | if (!MINSTCLI_CIDCompatibility) {
|
---|
603 | // ============================================== We use new format...
|
---|
604 | for (GroupNo=0; GroupNo<MINSTCLI_ResponseGroups; GroupNo++) {
|
---|
605 | CurChar = STRING_GetValidChar(&CurPos, EndPos, &CurLineNo);
|
---|
606 | if (CurChar!='(') {
|
---|
607 | MINSTCLI_ErrorMsgID = MINSTMSG_CLIResponseFileIsInvalid; break; }
|
---|
608 | CurPos++;
|
---|
609 |
|
---|
610 | GotParms = 0;
|
---|
611 | while (1) {
|
---|
612 | if (!(CurChar = STRING_GetValidChar(&CurPos, EndPos, &CurLineNo))) {
|
---|
613 | MINSTCLI_ErrorMsgID = MINSTMSG_UnexpectedEndOfFile; break; }
|
---|
614 | if (CurChar==')') {
|
---|
615 | CurPos++; break; } // End-Of-Parm-List
|
---|
616 | CRC32 = MINSTCLI_GetNextRespParmID(&CurPos, EndPos, &CurLineNo, &ArrayCount);
|
---|
617 | switch (CRC32) {
|
---|
618 | case 0x47405208: // GROUPID
|
---|
619 | if (ArrayCount!=-1) {
|
---|
620 | MINSTCLI_ErrorMsgID = MINSTMSG_CLIResponseFileIsInvalid; break; }
|
---|
621 | if (!(GotParms & 0x01)) {
|
---|
622 | if (!(CurPos = STRING_GetNumericValue(&GroupID, CurPos, EndPos))) {
|
---|
623 | MINSTCLI_ErrorMsgID = MINSTMSG_CLIResponseFileIsInvalid; break; }
|
---|
624 | GotParms |= 0x01;
|
---|
625 | }
|
---|
626 | break;
|
---|
627 | case 0x46BE0CE7: // CUSTOMDATA
|
---|
628 | if (ArrayCount!=-1) {
|
---|
629 | MINSTCLI_ErrorMsgID = MINSTMSG_CLIResponseFileIsInvalid; break; }
|
---|
630 | if (!(GotParms & 0x02)) {
|
---|
631 | if (!(CurPos = STRING_GetString(CustomData, MINSTMAX_CUSTOMDATALENGTH, CurPos, EndPos))) {
|
---|
632 | MINSTCLI_ErrorMsgID = MINSTMSG_CLIResponseFileIsInvalid; break; }
|
---|
633 | GotParms |= 0x02;
|
---|
634 | }
|
---|
635 | break;
|
---|
636 | default:
|
---|
637 | MINSTCLI_ErrorMsgID = MINSTMSG_BadCommand;
|
---|
638 | }
|
---|
639 | }
|
---|
640 | if (MINSTCLI_ErrorMsgID) break;
|
---|
641 |
|
---|
642 | if (GotParms!=0x03) {
|
---|
643 | MINSTCLI_ErrorMsgID = MINSTMSG_CLIResponseFileIsInvalid; break; }
|
---|
644 |
|
---|
645 | // Select that group...
|
---|
646 | MINSTALL_SelectGroup (GroupID);
|
---|
647 | // And set CustomData...
|
---|
648 | if (!MINSTALL_SetPublicGroupCustomData(GroupID, CustomData)) {
|
---|
649 | MINSTCLI_ErrorMsgID = MINSTMSG_CLIResponseFileIsInvalid; break; }
|
---|
650 | }
|
---|
651 | if (!MINSTCLI_ErrorMsgID) {
|
---|
652 | CurChar = STRING_GetValidChar(&CurPos, EndPos, &CurLineNo);
|
---|
653 | if (CurChar==')') {
|
---|
654 | CurPos++; CurChar = STRING_GetValidChar(&CurPos, EndPos, &CurLineNo);
|
---|
655 | if (CurChar==')') {
|
---|
656 | CurPos++;
|
---|
657 | } else {
|
---|
658 | MINSTCLI_ErrorMsgID = MINSTMSG_CLIResponseFileIsInvalid; }
|
---|
659 | } else {
|
---|
660 | MINSTCLI_ErrorMsgID = MINSTMSG_CLIResponseFileIsInvalid; }
|
---|
661 | }
|
---|
662 |
|
---|
663 | } else {
|
---|
664 | // ============================================== We use old format...
|
---|
665 | while (1) {
|
---|
666 | if (!(CurChar = STRING_GetValidChar (&CurPos, EndPos, &CurLineNo))) {
|
---|
667 | MINSTCLI_ErrorMsgID = MINSTMSG_UnexpectedEndOfFile; break; }
|
---|
668 | if (CurChar==')') {
|
---|
669 | CurPos++; break; } // End-Of-Parm-List encountered
|
---|
670 |
|
---|
671 | StartPos = CurPos;
|
---|
672 | if (!MINSTCLI_GetNextRespParmID(&CurPos, EndPos, &CurLineNo, &ArrayCount)) {
|
---|
673 | MINSTCLI_ErrorMsgID = MINSTMSG_CLIResponseFileIsInvalid; }
|
---|
674 |
|
---|
675 | if ((CurPos-StartPos<6) || (strncmp(StartPos, "GROUP.", 6)!=0)) {
|
---|
676 | MINSTCLI_ErrorMsgID = MINSTMSG_CLIResponseFileIsInvalid; break; }
|
---|
677 | StartPos += 6;
|
---|
678 | if (!STRING_GetNumericValue(&GroupID, StartPos, CurPos)) {
|
---|
679 | MINSTCLI_ErrorMsgID = MINSTMSG_CLIResponseFileIsInvalid; break; }
|
---|
680 |
|
---|
681 | CurPos = STRING_GetString(CustomData, MINSTMAX_CUSTOMDATALENGTH, CurPos, EndPos);
|
---|
682 | if (!CurPos) {
|
---|
683 | MINSTCLI_ErrorMsgID = MINSTMSG_UnexpectedEndOfFile; }
|
---|
684 |
|
---|
685 | // Select that group...
|
---|
686 | MINSTALL_SelectGroup (GroupID);
|
---|
687 | // And set CustomData...
|
---|
688 | if (!MINSTALL_SetPublicGroupCustomData(GroupID, CustomData)) {
|
---|
689 | MINSTCLI_ErrorMsgID = MINSTMSG_CLIResponseFileIsInvalid; break; }
|
---|
690 | }
|
---|
691 | }
|
---|
692 |
|
---|
693 | if (MINSTCLI_ErrorMsgID) {
|
---|
694 | MSG_SetInsertFileLocation (1, RESPONSEFILE.Name, CurLineNo);
|
---|
695 | MSG_Print (MINSTCLI_ErrorMsgID);
|
---|
696 | return FALSE;
|
---|
697 | }
|
---|
698 |
|
---|
699 | // Remember those variables for later...
|
---|
700 | MINSTCLI_ResponseFilePos = CurPos;
|
---|
701 | MINSTCLI_ResponseFileLine = CurLineNo;
|
---|
702 | return TRUE;
|
---|
703 | }
|
---|
704 |
|
---|
705 | USHORT maincode (int argc, char *argv[]) {
|
---|
706 | HAB OurPMHandle = 0;
|
---|
707 | HMQ OurMSGQHandle = 0;
|
---|
708 | PSZ ErrorMsgPtr = 0;
|
---|
709 |
|
---|
710 | PPIB pib;
|
---|
711 | PTIB tib;
|
---|
712 |
|
---|
713 | STARTDATA StartData;
|
---|
714 | ULONG PIDOfSession = 0;
|
---|
715 | PID PIDOfProcess = 0;
|
---|
716 |
|
---|
717 | ULONG CurArgument = 0;
|
---|
718 | ULONG ArgumentLen = 0;
|
---|
719 | PCHAR StartPos = 0;
|
---|
720 | PCHAR CurPos = 0;
|
---|
721 | CHAR CurChar;
|
---|
722 |
|
---|
723 | BOOL BadParm = FALSE;
|
---|
724 | BOOL BadUsage = FALSE;
|
---|
725 | BOOL BadCombo = FALSE;
|
---|
726 | BOOL DisplaySyntax = FALSE;
|
---|
727 |
|
---|
728 | USHORT ReturnCode;
|
---|
729 | PSZ ReturnCodeDescription;
|
---|
730 |
|
---|
731 | // Make ourself an PM application...
|
---|
732 | DosGetInfoBlocks (&tib, &pib);
|
---|
733 | pib->pib_ultype = 3;
|
---|
734 |
|
---|
735 | // Initialize with message-file...
|
---|
736 | if (!MSG_Init ("minstall.msg"))
|
---|
737 | return FALSE;
|
---|
738 |
|
---|
739 | MSG_Print (MINSTMSG_CLITrailer);
|
---|
740 |
|
---|
741 | CurArgument = 1;
|
---|
742 | while (CurArgument<argc) {
|
---|
743 | StartPos = argv[CurArgument];
|
---|
744 | ArgumentLen = strlen(StartPos);
|
---|
745 |
|
---|
746 | if ((*StartPos=='/') && (ArgumentLen>1)) {
|
---|
747 | StartPos++; ArgumentLen--;
|
---|
748 | CurChar = toupper(*StartPos++); ArgumentLen--;
|
---|
749 |
|
---|
750 | switch (CurChar) {
|
---|
751 | case 'C': // /C: record to response file
|
---|
752 | if ((MINSTCLI_CIDMode) || (MINSTCLI_CIDCreate))
|
---|
753 | BadCombo = TRUE;
|
---|
754 | if ((ArgumentLen>1) && (*StartPos==':')) {
|
---|
755 | MINSTCLI_CIDCreate = TRUE; MINSTCLI_CIDCompatibility = TRUE;
|
---|
756 | if (!STRING_CopyPSZ(MINSTCLI_ResponseFileName, MINSTMAX_PATHLENGTH, StartPos+1))
|
---|
757 | BadUsage = TRUE;
|
---|
758 | } else if ((ArgumentLen>2) && (*StartPos++=='2') && (*StartPos==':')) {
|
---|
759 | ArgumentLen--;
|
---|
760 | MINSTCLI_CIDCreate = TRUE;
|
---|
761 | if (!STRING_CopyPSZ(MINSTCLI_ResponseFileName, MINSTMAX_PATHLENGTH, StartPos+1))
|
---|
762 | BadUsage = TRUE;
|
---|
763 | } else BadUsage = TRUE;
|
---|
764 | break;
|
---|
765 | case 'F': // /F: specifies control.scr
|
---|
766 | if ((ArgumentLen>1) && (*StartPos==':')) {
|
---|
767 | StartPos++; ArgumentLen--;
|
---|
768 | strupr (StartPos);
|
---|
769 | if (ArgumentLen>=12) {
|
---|
770 | CurPos = StartPos+ArgumentLen-12;
|
---|
771 | if (strcmp(CurPos, "\\CONTROL.SCR")==0) {
|
---|
772 | ArgumentLen -= 12;
|
---|
773 | }
|
---|
774 | }
|
---|
775 | if (!STRING_Copy(MINSTCLI_SourcePath, MINSTMAX_PATHLENGTH, StartPos, StartPos+ArgumentLen))
|
---|
776 | BadUsage = TRUE;
|
---|
777 | } else BadUsage = TRUE;
|
---|
778 | break;
|
---|
779 | case 'L': // /L: specifies logfile
|
---|
780 | if ((ArgumentLen>1) && (*StartPos==':')) {
|
---|
781 | if (!STRING_CopyPSZ(MINSTCLI_LogFileName, MINSTMAX_PATHLENGTH, StartPos+1))
|
---|
782 | BadUsage = TRUE;
|
---|
783 | } else BadUsage = TRUE;
|
---|
784 | break;
|
---|
785 | case 'R': // /R: specifies response file (CID)
|
---|
786 | if ((MINSTCLI_CIDMode) || (MINSTCLI_CIDCreate))
|
---|
787 | BadCombo = TRUE;
|
---|
788 | if ((ArgumentLen>1) && (*StartPos==':')) {
|
---|
789 | MINSTCLI_CIDMode = TRUE;
|
---|
790 | if (!STRING_CopyPSZ(MINSTCLI_ResponseFileName, MINSTMAX_PATHLENGTH, StartPos+1))
|
---|
791 | BadUsage = TRUE;
|
---|
792 | } else BadUsage = TRUE;
|
---|
793 | break;
|
---|
794 | case 'M': // MMTEMP?!?!?!
|
---|
795 | // Accepted only for compatibility
|
---|
796 | break;
|
---|
797 | case '?':
|
---|
798 | DisplaySyntax = TRUE;
|
---|
799 | break;
|
---|
800 | case '*': // Makes MINSTALL use CLI interface
|
---|
801 | break;
|
---|
802 | default:
|
---|
803 | BadParm = TRUE;
|
---|
804 | }
|
---|
805 | } else BadParm = TRUE;
|
---|
806 |
|
---|
807 | if (BadParm) {
|
---|
808 | MSG_SetInsertViaPSZ (1, argv[CurArgument]);
|
---|
809 | MSG_Print (MINSTMSG_CLIUnknownParameter);
|
---|
810 | return CIDRET_IncorrectProgramInvocation;
|
---|
811 | }
|
---|
812 | if (BadUsage) {
|
---|
813 | MSG_SetInsertViaString (1, argv[CurArgument], 2);
|
---|
814 | MSG_Print (MINSTMSG_CLIInvalidUsageOfParm);
|
---|
815 | return CIDRET_IncorrectProgramInvocation;
|
---|
816 | }
|
---|
817 | if (BadCombo) {
|
---|
818 | MSG_Print (MINSTMSG_CLICantUseInCombinationParm);
|
---|
819 | return CIDRET_IncorrectProgramInvocation;
|
---|
820 | }
|
---|
821 |
|
---|
822 | CurArgument++;
|
---|
823 | }
|
---|
824 |
|
---|
825 | // ======================================================= Display Syntax...
|
---|
826 | if (DisplaySyntax) {
|
---|
827 | MSG_Print (MINSTMSG_CLISyntaxExplanation); return 0; }
|
---|
828 |
|
---|
829 | if (argc<2) {
|
---|
830 | // User did not specify any command-line options, so try to execute
|
---|
831 | // MINSTPM.EXE, if possible. If this works, exit directly. Otherwise
|
---|
832 | // continue with normal CLI processing.
|
---|
833 |
|
---|
834 | memset(&StartData, 0, sizeof(StartData));
|
---|
835 | StartData.Length = sizeof(StartData);
|
---|
836 | StartData.PgmName = "minstpm.exe";
|
---|
837 | StartData.SessionType = SSF_TYPE_PM;
|
---|
838 | rc = DosStartSession (&StartData, &PIDOfSession, &PIDOfProcess);
|
---|
839 | if (rc==0) {
|
---|
840 | MSG_Print (MINSTMSG_CLIGaveControlToGUI); return 0; }
|
---|
841 | }
|
---|
842 |
|
---|
843 | if (MINSTCLI_SourcePath[0]==0) {
|
---|
844 | // Set default SourcePath, if not already set...
|
---|
845 | if (!FILE_GetCurrentPath(MINSTCLI_SourcePath, MINSTMAX_PATHLENGTH))
|
---|
846 | return CIDRET_UnexpectedCondition;
|
---|
847 | }
|
---|
848 |
|
---|
849 | // We need to initialize with PM and get a Message Queue for MINSTALL.DLL...
|
---|
850 | if (!(OurPMHandle = WinInitialize(0))) {
|
---|
851 | MSG_Print (MINSTMSG_CLICouldNotInitPM);
|
---|
852 | return CIDRET_UnexpectedCondition; }
|
---|
853 | if (!(OurMSGQHandle = WinCreateMsgQueue(OurPMHandle, 0))) {
|
---|
854 | MSG_Print (MINSTMSG_CLICouldNotInitMsgQueue);
|
---|
855 | return CIDRET_UnexpectedCondition; }
|
---|
856 |
|
---|
857 | // Are we in CID-Mode?
|
---|
858 | if (MINSTCLI_CIDMode) { // ======================================== CID-Mode
|
---|
859 | MSG_Print (MINSTMSG_CLIExecutingInCIDMode);
|
---|
860 | // Open response file and process it...
|
---|
861 | strcpy (RESPONSEFILE.Name, MINSTCLI_ResponseFileName);
|
---|
862 | if (!FILE_LoadFileControl(&RESPONSEFILE, 131767)) {
|
---|
863 | MSG_SetInsertViaPSZ (1, MINSTCLI_ResponseFileName);
|
---|
864 | MSG_Print (MINSTMSG_CouldNotLoad);
|
---|
865 | return CIDRET_DataResourceNotFound; }
|
---|
866 | // Remove remarks, TAB-Stops and other crap from file...
|
---|
867 | FILE_PreProcessControlFile(&RESPONSEFILE);
|
---|
868 | MINSTCLI_ResponseFilePos = RESPONSEFILE.BufferPtr;
|
---|
869 |
|
---|
870 | // Now read in header (or exit, if EOF)
|
---|
871 | while (MINSTCLI_ReadResponseHeader()) {
|
---|
872 | // We init per package, because options may change (TargetPath/etc.)
|
---|
873 | if (!MINSTALL_Init (MINSTCLI_TargetBootDrive, OurPMHandle, OurMSGQHandle, MINSTCLI_TargetPath, MINSTCLI_LogFileName))
|
---|
874 | break;
|
---|
875 | if (!MINSTALL_InitPackage(MINSTCLI_SourcePath))
|
---|
876 | break;
|
---|
877 | // Get pointer to Public-Group Array
|
---|
878 | MINSTCLI_PubGroupCount = MINSTALL_GetPublicGroupArrayPtr (&MINSTCLI_PubGroupPtr);
|
---|
879 | // Now read in response file data and configure groups automatically
|
---|
880 | if (!MINSTCLI_ReadResponseData())
|
---|
881 | break;
|
---|
882 | // Finally install this package...
|
---|
883 | if (!MINSTALL_InstallPackage())
|
---|
884 | break;
|
---|
885 | // We need to CleanUp at anytime...
|
---|
886 | MINSTALL_CleanUp();
|
---|
887 | // MINSTALL.DLL will only delete log-file on first Init(). Afterwards
|
---|
888 | // data will just get appended, so this here will work.
|
---|
889 | }
|
---|
890 | FILE_UnLoadFileControl(&RESPONSEFILE);
|
---|
891 |
|
---|
892 | } else { // ====================================================== CLI-Mode
|
---|
893 | // Initialize MINSTALL...
|
---|
894 | if (MINSTALL_Init (0, OurPMHandle, OurMSGQHandle, "", MINSTCLI_LogFileName)) {
|
---|
895 | // Now initialize the package...
|
---|
896 | if (MINSTALL_InitPackage(MINSTCLI_SourcePath)) {
|
---|
897 | // Get pointer to Public-Group Array
|
---|
898 | MINSTCLI_PubGroupCount = MINSTALL_GetPublicGroupArrayPtr (&MINSTCLI_PubGroupPtr);
|
---|
899 |
|
---|
900 | // Let user select...
|
---|
901 | if (MINSTCLI_UserGroupSelection()) {
|
---|
902 | if ((MINSTCLI_CIDCreate) && (!MINSTCLI_CIDCompatibility)) {
|
---|
903 | // Generate a CID file w/o installation (no compatibility)
|
---|
904 | MINSTCID_CreateResponseFile();
|
---|
905 | } else {
|
---|
906 | if (MINSTALL_InstallPackage()) {
|
---|
907 | // So, if CID file requested (using compatibility), we
|
---|
908 | // install the package and create it now...
|
---|
909 | if ((MINSTCLI_CIDCreate) && (MINSTCLI_CIDCompatibility)) {
|
---|
910 | MINSTCID_CreateResponseFile();
|
---|
911 | }
|
---|
912 | }
|
---|
913 | }
|
---|
914 | }
|
---|
915 | }
|
---|
916 | }
|
---|
917 | }
|
---|
918 | // If there was an error, print it out...
|
---|
919 | if ((ErrorMsgPtr = MINSTALL_GetErrorMsgPtr())!=0) {
|
---|
920 | printf (ErrorMsgPtr); }
|
---|
921 |
|
---|
922 | if (MINSTCLI_ErrorMsgID) {
|
---|
923 | ReturnCode = CIDRET_IncorrectProgramInvocation;
|
---|
924 | ReturnCodeDescription = "CID: Incorrect program invocation";
|
---|
925 | } else {
|
---|
926 | // Get CID-Returncode from MINSTALL.DLL
|
---|
927 | ReturnCode = MINSTALL_GetErrorMsgCIDCode();
|
---|
928 | ReturnCodeDescription = MINSTALL_GetErrorMsgCIDCodeDescription();
|
---|
929 | }
|
---|
930 |
|
---|
931 | // We need to CleanUp at anytime... (wouldnt be required on CID)
|
---|
932 | MINSTALL_CleanUp();
|
---|
933 |
|
---|
934 | // Clean Up Message Queue and PM...
|
---|
935 | WinDestroyMsgQueue (OurMSGQHandle);
|
---|
936 | WinTerminate (OurPMHandle);
|
---|
937 | printf ("Return-Code %X (%s)\n", ReturnCode, ReturnCodeDescription);
|
---|
938 | return ReturnCode;
|
---|
939 | }
|
---|