@ -13,8 +13,16 @@
# include <string.h>
# include <stdlib.h>
int cgit_open_filter ( struct cgit_filter * filter )
int cgit_open_filter ( struct cgit_filter * filter , . . . )
{
int i ;
va_list ap ;
va_start ( ap , filter ) ;
for ( i = 0 ; i < filter - > extra_args ; i + + )
filter - > argv [ i + 1 ] = va_arg ( ap , char * ) ;
va_end ( ap ) ;
filter - > old_stdout = chk_positive ( dup ( STDOUT_FILENO ) ,
" Unable to duplicate STDOUT " ) ;
chk_zero ( pipe ( filter - > pipe_fh ) , " Unable to create pipe to subprocess " ) ;
@ -36,45 +44,50 @@ int cgit_open_filter(struct cgit_filter *filter)
int cgit_close_filter ( struct cgit_filter * filter )
{
int exit_status ;
int i , exit_status ;
chk_non_negative ( dup2 ( filter - > old_stdout , STDOUT_FILENO ) ,
" Unable to restore STDOUT " ) ;
close ( filter - > old_stdout ) ;
if ( filter - > pid < 0 )
return 0 ;
goto done ;
waitpid ( filter - > pid , & exit_status , 0 ) ;
if ( WIFEXITED ( exit_status ) & & ! WEXITSTATUS ( exit_status ) )
return 0 ;
goto done ;
die ( " Subprocess %s exited abnormally " , filter - > cmd ) ;
done :
for ( i = 0 ; i < filter - > extra_args ; i + + )
filter - > argv [ i + 1 ] = NULL ;
return 0 ;
}
struct cgit_filter * cgit_new_filter ( const char * cmd , filter_type filtertype )
{
struct cgit_filter * f ;
int args_size = 0 ;
int extra_args ;
if ( ! cmd | | ! cmd [ 0 ] )
return NULL ;
f = xmalloc ( sizeof ( struct cgit_filter ) ) ;
memset ( f , 0 , sizeof ( struct cgit_filter ) ) ;
switch ( filtertype ) {
case SOURCE :
case ABOUT :
extra_args = 1 ;
f - > extra_args = 1 ;
break ;
case COMMIT :
default :
extra_args = 0 ;
f - > extra_args = 0 ;
break ;
}
f = xmalloc ( sizeof ( struct cgit_filter ) ) ;
memset ( f , 0 , sizeof ( struct cgit_filter ) ) ;
f - > cmd = xstrdup ( cmd ) ;
args_size = ( 2 + extra_args ) * sizeof ( char * ) ;
args_size = ( 2 + f - > extra_args ) * sizeof ( char * ) ;
f - > argv = xmalloc ( args_size ) ;
memset ( f - > argv , 0 , args_size ) ;
f - > argv [ 0 ] = f - > cmd ;