implemented batch redirection by saving batch info in tagBATCHCONTEXT by Brandon Turner Modified: trunk/reactos/subsys/system/cmd/batch.c Modified: trunk/reactos/subsys/system/cmd/batch.h Modified: trunk/reactos/subsys/system/cmd/call.c Modified: trunk/reactos/subsys/system/cmd/cmd.c Modified: trunk/reactos/subsys/system/cmd/for.c _____
Modified: trunk/reactos/subsys/system/cmd/batch.c --- trunk/reactos/subsys/system/cmd/batch.c 2005-08-17 07:23:05 UTC (rev 17422) +++ trunk/reactos/subsys/system/cmd/batch.c 2005-08-17 18:01:47 UTC (rev 17423) @@ -218,10 +218,10 @@
BOOL Batch (LPTSTR fullname, LPTSTR firstword, LPTSTR param) { HANDLE hFile; - + SetLastError(0); hFile = CreateFile (fullname, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | - FILE_FLAG_SEQUENTIAL_SCAN, NULL); + FILE_FLAG_SEQUENTIAL_SCAN, NULL);
#ifdef _DEBUG DebugPrintf (_T("Batch: ('%s', '%s', '%s') hFile = %x\n"), @@ -251,6 +251,9 @@
n->prev = bc; bc = n; + bc->In[0] = _T('\0'); + bc->Out[0] = _T('\0'); + bc->Err[0] = _T('\0'); } else if (bc->hBatchFile != INVALID_HANDLE_VALUE) { @@ -261,6 +264,7 @@ }
bc->hBatchFile = hFile; + SetFilePointer (bc->hBatchFile, 0, NULL, FILE_BEGIN); bc->bEcho = bEcho; /* Preserve echo across batch calls */ bc->shiftlevel = 0;
@@ -276,7 +280,19 @@ return TRUE; }
+VOID AddBatchRedirection(TCHAR * ifn, TCHAR * ofn, TCHAR * efn) +{ + if(!bc) + return; + if(_tcslen(ifn)) + _tcscpy(bc->In,ifn); + if(_tcslen(ofn)) + _tcscpy(bc->Out,ofn); + if(_tcslen(efn)) + _tcscpy(bc->Err,efn);
+} + /* * Read and return the next executable line form the current batch file * @@ -405,7 +421,6 @@
continue; } - #ifdef _DEBUG DebugPrintf (_T("ReadBatchLine(): textline: '%s'\n"), textline); #endif _____
Modified: trunk/reactos/subsys/system/cmd/batch.h --- trunk/reactos/subsys/system/cmd/batch.h 2005-08-17 07:23:05 UTC (rev 17422) +++ trunk/reactos/subsys/system/cmd/batch.h 2005-08-17 18:01:47 UTC (rev 17423) @@ -18,6 +18,9 @@
INT shiftlevel; BOOL bEcho; /* Preserve echo flag across batch calls */ HANDLE hFind; /* Preserve find handle when doing a for */ + TCHAR In[MAX_PATH]; + TCHAR Out[MAX_PATH]; + TCHAR Err[MAX_PATH]; TCHAR forvar; } BATCH_CONTEXT, *LPBATCH_CONTEXT;
@@ -39,5 +42,6 @@ VOID ExitBatch (LPTSTR); BOOL Batch (LPTSTR, LPTSTR, LPTSTR); LPTSTR ReadBatchLine (LPBOOL); +VOID AddBatchRedirection(TCHAR *, TCHAR *, TCHAR *);
#endif /* _BATCH_H_INCLUDED_ */ _____
Modified: trunk/reactos/subsys/system/cmd/call.c --- trunk/reactos/subsys/system/cmd/call.c 2005-08-17 07:23:05 UTC (rev 17422) +++ trunk/reactos/subsys/system/cmd/call.c 2005-08-17 18:01:47 UTC (rev 17423) @@ -72,8 +72,20 @@
bc->shiftlevel = 0; bc->forvar = 0; /* HBP004 */ bc->forproto = NULL; /* HBP004 */ - ParseCommandLine (param); + if (bc->prev) + { + _tcscpy(bc->In, bc->prev->In); + _tcscpy(bc->Out, bc->prev->Out); + _tcscpy(bc->Err, bc->prev->Err); + } + else + { + bc->In[0] = _T('\0'); + bc->Out[0] = _T('\0'); + bc->Err[0] = _T('\0'); + } +
/* Wasn't a batch file so remove conext */ if (bc->hBatchFile == INVALID_HANDLE_VALUE) _____
Modified: trunk/reactos/subsys/system/cmd/cmd.c --- trunk/reactos/subsys/system/cmd/cmd.c 2005-08-17 07:23:05 UTC (rev 17422) +++ trunk/reactos/subsys/system/cmd/cmd.c 2005-08-17 18:01:47 UTC (rev 17423) @@ -603,7 +603,7 @@
INT nRedirFlags = 0; INT Length; UINT Attributes; - + BOOL bNewBatch = TRUE; HANDLE hOldConIn; HANDLE hOldConOut; HANDLE hOldConErr; @@ -656,6 +656,20 @@ ; _tcscpy (err, t);
+ if(bc && !_tcslen (in) && _tcslen (bc->In)) + _tcscpy(in, bc->In); + if(bc && !out[0] && _tcslen(bc->Out)) + { + nRedirFlags |= OUTPUT_APPEND; + _tcscpy(out, bc->Out); + } + if(bc && !_tcslen (err) && _tcslen (bc->Err)) + { + nRedirFlags |= ERROR_APPEND; + _tcscpy(err, bc->Err); + } + + /* Set up the initial conditions ... */ /* preserve STDIN, STDOUT and STDERR handles */ hOldConIn = GetStdHandle (STD_INPUT_HANDLE); @@ -675,7 +689,7 @@ hFile = CreateFile (in, GENERIC_READ, FILE_SHARE_READ, &sa, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (hFile == INVALID_HANDLE_VALUE) - { + { LoadString(CMD_ModuleHandle, STRING_CMD_ERROR1, szMsg, RC_STRING_MAX_SIZE); ConErrPrintf(szMsg, in); return; @@ -766,7 +780,7 @@ /* we need make sure the LastError msg is zero before calling CreateFile */ SetLastError(0);
- hFile = CreateFile (out, GENERIC_WRITE, FILE_SHARE_READ, &sa, + hFile = CreateFile (out, GENERIC_WRITE, FILE_SHARE_WRITE, &sa, (nRedirFlags & OUTPUT_APPEND) ? OPEN_ALWAYS : CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); @@ -782,7 +796,7 @@ }
out[size]=_T('\0'); - hFile = CreateFile (out, GENERIC_WRITE, FILE_SHARE_READ, &sa, + hFile = CreateFile (out, GENERIC_WRITE, FILE_SHARE_WRITE, &sa, (nRedirFlags & OUTPUT_APPEND) ? OPEN_ALWAYS : CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
@@ -884,12 +898,17 @@ CloseHandle (hErr); hOldConErr = INVALID_HANDLE_VALUE; } + + if(bc) + bNewBatch = FALSE; #endif
/* process final command */ DoCommand (s);
#ifdef FEATURE_REDIRECTION + if(bNewBatch && bc) + AddBatchRedirection(in, out, err); /* close old stdin file */ #if 0 /* buggy implementation */ SetStdHandle (STD_INPUT_HANDLE, hOldConIn); _____
Modified: trunk/reactos/subsys/system/cmd/for.c --- trunk/reactos/subsys/system/cmd/for.c 2005-08-17 07:23:05 UTC (rev 17422) +++ trunk/reactos/subsys/system/cmd/for.c 2005-08-17 18:01:47 UTC (rev 17423) @@ -141,7 +141,11 @@
bc->bEcho = bc->prev->bEcho; else bc->bEcho = bEcho; + bc->In[0] = _T('\0'); + bc->Out[0] = _T('\0'); + bc->Err[0] = _T('\0');
+ return 0; }