2010-05-25 15:14:06 +04:00
/*
* commandhelper . c : Auxiliary program for commandtest
*
2013-02-23 02:42:39 +04:00
* Copyright ( C ) 2010 - 2013 Red Hat , Inc .
2010-05-25 15:14:06 +04:00
*
* This library is free software ; you can redistribute it and / or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation ; either
* version 2.1 of the License , or ( at your option ) any later version .
*
* This library is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the GNU
* Lesser General Public License for more details .
*
* You should have received a copy of the GNU Lesser General Public
2012-09-21 02:30:55 +04:00
* License along with this library . If not , see
2012-07-21 14:06:23 +04:00
* < http : //www.gnu.org/licenses/>.
2010-05-25 15:14:06 +04:00
*/
# include <config.h>
# include <stdio.h>
# include <unistd.h>
# include <stdlib.h>
# include <fcntl.h>
# include <string.h>
# include "internal.h"
2012-12-13 21:44:57 +04:00
# include "virutil.h"
2012-12-12 22:06:53 +04:00
# include "viralloc.h"
2011-07-19 22:32:58 +04:00
# include "virfile.h"
2012-03-29 13:50:00 +04:00
# include "testutils.h"
# ifndef WIN32
2010-05-25 15:14:06 +04:00
static int envsort ( const void * a , const void * b ) {
const char * const * astrptr = a ;
const char * const * bstrptr = b ;
const char * astr = * astrptr ;
const char * bstr = * bstrptr ;
char * aeq = strchr ( astr , ' = ' ) ;
char * beq = strchr ( bstr , ' = ' ) ;
char * akey = strndup ( astr , aeq - astr ) ;
char * bkey = strndup ( bstr , beq - bstr ) ;
int ret = strcmp ( akey , bkey ) ;
2012-02-03 03:16:43 +04:00
VIR_FREE ( akey ) ;
VIR_FREE ( bkey ) ;
2010-05-25 15:14:06 +04:00
return ret ;
}
int main ( int argc , char * * argv ) {
int i , n ;
char * * origenv ;
char * * newenv ;
2011-04-29 21:14:23 +04:00
char * cwd ;
2010-05-25 15:14:06 +04:00
FILE * log = fopen ( abs_builddir " /commandhelper.log " , " w " ) ;
if ( ! log )
goto error ;
for ( i = 1 ; i < argc ; i + + ) {
fprintf ( log , " ARG:%s \n " , argv [ i ] ) ;
}
origenv = environ ;
n = 0 ;
while ( * origenv ! = NULL ) {
n + + ;
origenv + + ;
}
2013-02-23 02:42:39 +04:00
if ( VIR_ALLOC_N ( newenv , n ) < 0 )
return EXIT_FAILURE ;
2010-05-25 15:14:06 +04:00
origenv = environ ;
n = i = 0 ;
while ( * origenv ! = NULL ) {
newenv [ i + + ] = * origenv ;
n + + ;
origenv + + ;
}
qsort ( newenv , n , sizeof ( newenv [ 0 ] ) , envsort ) ;
for ( i = 0 ; i < n ; i + + ) {
2011-01-06 23:23:36 +03:00
/* Ignore the variables used to instruct the loader into
* behaving differently , as they could throw the tests off . */
if ( ! STRPREFIX ( newenv [ i ] , " LD_ " ) )
fprintf ( log , " ENV:%s \n " , newenv [ i ] ) ;
2010-05-25 15:14:06 +04:00
}
for ( i = 0 ; i < sysconf ( _SC_OPEN_MAX ) ; i + + ) {
int f ;
int closed ;
if ( i = = fileno ( log ) )
continue ;
closed = fcntl ( i , F_GETFD , & f ) = = - 1 & &
errno = = EBADF ;
if ( ! closed )
fprintf ( log , " FD:%d \n " , i ) ;
}
2010-12-15 20:23:32 +03:00
fprintf ( log , " DAEMON:%s \n " , getpgrp ( ) = = getsid ( 0 ) ? " yes " : " no " ) ;
2011-04-29 21:14:23 +04:00
if ( ! ( cwd = getcwd ( NULL , 0 ) ) )
2010-12-03 19:10:31 +03:00
return EXIT_FAILURE ;
2011-04-29 21:14:23 +04:00
if ( strlen ( cwd ) > strlen ( " .../commanddata " ) & &
2010-05-25 15:14:06 +04:00
STREQ ( cwd + strlen ( cwd ) - strlen ( " /commanddata " ) , " /commanddata " ) )
strcpy ( cwd , " .../commanddata " ) ;
fprintf ( log , " CWD:%s \n " , cwd ) ;
2011-04-29 21:14:23 +04:00
VIR_FREE ( cwd ) ;
2010-05-25 15:14:06 +04:00
VIR_FORCE_FCLOSE ( log ) ;
2012-06-01 01:50:07 +04:00
if ( argc > 1 & & STREQ ( argv [ 1 ] , " --close-stdin " ) ) {
if ( freopen ( " /dev/null " , " r " , stdin ) ! = stdin )
goto error ;
usleep ( 100 * 1000 ) ;
}
2010-05-25 15:14:06 +04:00
char buf [ 1024 ] ;
ssize_t got ;
fprintf ( stdout , " BEGIN STDOUT \n " ) ;
fflush ( stdout ) ;
fprintf ( stderr , " BEGIN STDERR \n " ) ;
fflush ( stderr ) ;
for ( ; ; ) {
got = read ( STDIN_FILENO , buf , sizeof ( buf ) ) ;
if ( got < 0 )
goto error ;
if ( got = = 0 )
break ;
if ( safewrite ( STDOUT_FILENO , buf , got ) ! = got )
goto error ;
if ( safewrite ( STDERR_FILENO , buf , got ) ! = got )
goto error ;
}
fprintf ( stdout , " END STDOUT \n " ) ;
fflush ( stdout ) ;
fprintf ( stderr , " END STDERR \n " ) ;
fflush ( stderr ) ;
return EXIT_SUCCESS ;
error :
return EXIT_FAILURE ;
}
2012-03-29 13:50:00 +04:00
# else
int
main ( void )
{
return EXIT_AM_SKIP ;
}
# endif