[comp.lang.c] Using filters within C code - example

cweir@richsun.reuter.com (Charles Weir) (06/15/90)

I attach a piece of code which I have found extremely useful.   It is a
function which executes an operating system command and returns the text
output from it.

This posting was prompted by the message from halam2@umn-d-ub.D.UMN.EDU
(Haseen I. Alam) asking talking about a call like
       system ("wc -c filename") ;

This does what he wanted (although, as people have pointed out, there are more
efficient ways to do it).

I find it invaluable for testing applications, since it allows me to use
standard tools from within C code.

Now for my question...

Can you advise me how portable this code is?

------------  Function  follows -------------------

#include <stdio.h>
#include <errno.h>
#define MAX_RESULT 1000

/*

*******************************************************************************
* NAME:           CallSystem
* 
* DESCRIPTION:    Routine to pipe a string through a System filter to
*                 generate another string.
* 
* USAGE:          Input strings containing "'" chars will cause an error
* 
* PARAMETERS:     Command:     String representing the System command (may
*                              include shell metachars) 
*                 InputString: The standard input to the command.
*                              May not contain the backquote charactor.
* 
* GLOBALS:        None
* 		  
* RETURNS:        Pointer to static buffer containing result of System command.
* 		  NULL if the call fails
*                 The output is truncated to fit (size MAX_RESULT).
*                 The contents are valid until the next call to
*                 CallSystem.
* 		  
* ERRORS:         Returns NULL, with errno set, if the input strings are too
* 		  big, or if the input string contains a backquote charactor.
*                 Also if the System command exits with a non-zero exit code.
* 
******************************************************************************/


char * CallSystem( Command, InputString )
char * Command;
char *  InputString;
{
     int i;
     static char ResultBuffer[ MAX_RESULT ];
     static char CommandString[ MAX_RESULT ];
     FILE * PipeFromChildToUs;
     int iErr;				/* Exit status of the command */
     
     if (InputString == (char*)NULL)
	  InputString = "";
     
     if (strlen( Command ) + strlen( InputString ) >
	 sizeof( CommandString ) - 20 ||
	 strchr( InputString, '\'' ) != (char * )NULL )

     {
	  errno = EINVAL;
	  return (char*)NULL;
     }
     
     sprintf( CommandString, "echo '%s' | %s", InputString, Command );
     
     PipeFromChildToUs = popen( CommandString, "r" );
     
     if (PipeFromChildToUs == (FILE*)NULL)
	  Error_Program( "Cannot open pipe" );
     
     i = fread( ResultBuffer, 1, MAX_RESULT - 1, PipeFromChildToUs );
     ResultBuffer[i] = '\0';
     
     iErr = pclose( PipeFromChildToUs ) ;
     if (iErr != 0)
     {
	  errno = iErr;
	  return (char*)NULL;
     }
     
     return (ResultBuffer);
}

---------------------- End function ------------------------

--
Charles Weir, Rich Inc, 1400 Kensington, Oak Brook, IL 60521
Email: cweir@richsun.uucp  uunet!richsun!cweir 
Phone: +1 708 574 7424 X2766