2016-02-15 16:02:05 +03:00
/*
* Copyright ( C ) 2016 Red Hat , Inc .
*
* 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
* License along with this library . If not , see
* < http : //www.gnu.org/licenses/>.
*
* Author : Michal Privoznik < mprivozn @ redhat . com >
*/
# include <config.h>
2016-03-27 21:07:10 +03:00
# ifdef NSS
2016-05-13 13:46:35 +03:00
# include "virmock.h"
2016-02-15 16:02:05 +03:00
# include <sys / types.h>
# include <dirent.h>
# include <sys / stat.h>
# include <fcntl.h>
2016-11-29 15:48:53 +03:00
# include <unistd.h>
2016-02-15 16:02:05 +03:00
# include "configmake.h"
# include "virstring.h"
# include "viralloc.h"
2016-05-13 13:46:35 +03:00
static int ( * real_open ) ( const char * path , int flags , . . . ) ;
static DIR * ( * real_opendir ) ( const char * name ) ;
2016-11-29 15:48:53 +03:00
static int ( * real_access ) ( const char * path , int mode ) ;
2016-02-15 16:02:05 +03:00
# define LEASEDIR LOCALSTATEDIR " / lib / libvirt / dnsmasq / "
/*
* Functions to load the symbols and init the environment
*/
static void
init_syms ( void )
{
2016-05-13 13:46:35 +03:00
if ( real_open )
2016-02-15 16:02:05 +03:00
return ;
2016-05-13 13:46:35 +03:00
VIR_MOCK_REAL_INIT ( open ) ;
VIR_MOCK_REAL_INIT ( opendir ) ;
2016-11-29 15:48:53 +03:00
VIR_MOCK_REAL_INIT ( access ) ;
2016-02-15 16:02:05 +03:00
}
static int
getrealpath ( char * * newpath ,
const char * path )
{
if ( STRPREFIX ( path , LEASEDIR ) ) {
if ( virAsprintfQuiet ( newpath , " %s/nssdata/%s " ,
abs_srcdir ,
path + strlen ( LEASEDIR ) ) < 0 ) {
errno = ENOMEM ;
return - 1 ;
}
} else {
if ( VIR_STRDUP_QUIET ( * newpath , path ) < 0 )
return - 1 ;
}
return 0 ;
}
int
open ( const char * path , int flags , . . . )
{
int ret ;
char * newpath = NULL ;
init_syms ( ) ;
if ( STRPREFIX ( path , LEASEDIR ) & &
getrealpath ( & newpath , path ) < 0 )
return - 1 ;
if ( flags & O_CREAT ) {
va_list ap ;
mode_t mode ;
va_start ( ap , flags ) ;
2016-03-27 21:07:10 +03:00
mode = va_arg ( ap , int ) ;
2016-02-15 16:02:05 +03:00
va_end ( ap ) ;
2016-05-13 13:46:35 +03:00
ret = real_open ( newpath ? newpath : path , flags , mode ) ;
2016-02-15 16:02:05 +03:00
} else {
2016-05-13 13:46:35 +03:00
ret = real_open ( newpath ? newpath : path , flags ) ;
2016-02-15 16:02:05 +03:00
}
2016-11-29 16:59:25 +03:00
free ( newpath ) ;
2016-02-15 16:02:05 +03:00
return ret ;
}
DIR *
opendir ( const char * path )
{
DIR * ret ;
char * newpath = NULL ;
init_syms ( ) ;
if ( STRPREFIX ( path , LEASEDIR ) & &
getrealpath ( & newpath , path ) < 0 )
return NULL ;
2016-05-13 13:46:35 +03:00
ret = real_opendir ( newpath ? newpath : path ) ;
2016-02-15 16:02:05 +03:00
2016-11-29 16:59:25 +03:00
free ( newpath ) ;
2016-02-15 16:02:05 +03:00
return ret ;
}
2016-11-29 15:48:53 +03:00
int
access ( const char * path , int mode )
{
int ret ;
char * newpath = NULL ;
init_syms ( ) ;
if ( STRPREFIX ( path , LEASEDIR ) & &
getrealpath ( & newpath , path ) < 0 )
return - 1 ;
ret = real_access ( newpath ? newpath : path , mode ) ;
free ( newpath ) ;
return ret ;
}
2016-02-15 16:02:05 +03:00
# else
2016-03-27 21:07:10 +03:00
/* Nothing to override if NSS plugin is not enabled */
2016-02-15 16:02:05 +03:00
# endif