Want to protect your cyber security and still get fast solutions? Ask a secure question today.Go Premium

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 543
  • Last Modified:

DOS redirect stdout and back again

I want to spawn a program (XCOPY) having directed stdout to a file for log purposes. I can do the re-direction but I lose stdout once I close the file handle. How can I recover the original stdout?

---- code sample ----
PUBLIC CdaRETVAL      ClCopyFileStructure(PCdaCHAR inDir, PCdaCHAR outDir)
{
      CdaRETVAL      retval;                                          // Return value from function
      FILE            *newStdout;                                    // Handle for re-directed stdout
      
      newStdout = freopen("c:\\temp.tmp", "w", stdout);
      if (newStdout == NULL)
      {
            printf("Cannot redirect stdout\n");
            return(cdaInternalError);
      }
      retval = _spawnlp(_P_WAIT, "xcopy", "xcopy", inDir, outDir, "/E", "/I", "/H", "/Y", NULL);
      if (retval)
      {
            printf("xcopy error %i\n", retval);
            retval = cdaInternalError;
      }
      else
            retval = cdaSuccess;

      fclose(newStdout);
      return(retval);
}

--- end of code sample ---

This code works but the stdout is lost when the function returns.
0
icd
Asked:
icd
  • 3
  • 2
1 Solution
 
LucHoltkampCommented:
You could simply use the function
system(char* cmdLine)
which executes the string in cmdLine.

char buffer[256];
sprintf(buffer, "xcopy /e/i/h/y %s %s > c:\\temp.tmp", inDir, outDir);
system(buffer);

Good Luck
.luc.
0
 
icdAuthor Commented:
That would be acceptable if I only had a little more output to generate but I have lots, including spawning further programs so I really want to get stdout back again.

0
 
mlevCommented:
Do not close the file handle.

freopen() does not create a new FILE structure, it just "alters" the existing one. The only useful thing you can do with the return value of freopen(), is check whether the function succeeded (otherwise it's NULL). If it did, newStdout will be equal to stdout, so your program actually performs fclose(stdout).
0
Industry Leaders: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

 
icdAuthor Commented:
OK, it only 'alters' the existing file structure. So if I don't close the newStdout how do I pursuade stdout to go back to the console. Do I do a freopen("con:" or somesuch?
0
 
mlevCommented:
I guess that's the simplest way, if you do not care about your program being run with redirected output, or even compiled on something other than DOS.

I think the portable way to do it should be something like:

old_stdout_fd = dup(1);
freopen("c:\\temp.tmp", "w", stdout);
...
...
fflush(stdout);
dup2(old_stdout_fd, 1);
close(old_stdout_fd);
0
 
icdAuthor Commented:
Sorry for the delay I got pushed off one project onto another before I could evaluate your answer.

I just got in before the 15 day deadline so you get full 200 points rather than 150 :-)

0

Featured Post

Independent Software Vendors: We Want Your Opinion

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

  • 3
  • 2
Tackle projects and never again get stuck behind a technical roadblock.
Join Now