2011-02-21 23:48:59 +03:00
/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
/***
This file is part of systemd .
Copyright 2010 Lennart Poettering
systemd is free software ; you can redistribute it and / or modify it
2012-04-12 02:20:58 +04:00
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
2011-02-21 23:48:59 +03:00
( at your option ) any later version .
systemd 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
2012-04-12 02:20:58 +04:00
Lesser General Public License for more details .
2011-02-21 23:48:59 +03:00
2012-04-12 02:20:58 +04:00
You should have received a copy of the GNU Lesser General Public License
2011-02-21 23:48:59 +03:00
along with systemd ; If not , see < http : //www.gnu.org/licenses/>.
* * */
# include <stdlib.h>
# include <stdbool.h>
# include <errno.h>
# include <string.h>
2012-04-12 16:45:50 +04:00
# include <getopt.h>
2011-02-21 23:48:59 +03:00
# include "util.h"
2011-09-23 19:00:33 +04:00
# include "virt.h"
2012-04-12 16:45:50 +04:00
# include "build.h"
static bool arg_quiet = false ;
static enum {
ANY_VIRTUALIZATION ,
ONLY_VM ,
ONLY_CONTAINER
} arg_mode = ANY_VIRTUALIZATION ;
2014-08-02 19:12:21 +04:00
static void help ( void ) {
2012-04-12 16:45:50 +04:00
printf ( " %s [OPTIONS...] \n \n "
" Detect execution in a virtualized environment. \n \n "
" -h --help Show this help \n "
" --version Show package version \n "
" -c --container Only detect whether we are run in a container \n "
" -v --vm Only detect whether we are run in a VM \n "
2014-08-02 19:12:21 +04:00
" -q --quiet Don't output anything, just set return value \n "
, program_invocation_short_name ) ;
2012-04-12 16:45:50 +04:00
}
static int parse_argv ( int argc , char * argv [ ] ) {
enum {
ARG_VERSION = 0x100
} ;
static const struct option options [ ] = {
{ " help " , no_argument , NULL , ' h ' } ,
{ " version " , no_argument , NULL , ARG_VERSION } ,
{ " container " , no_argument , NULL , ' c ' } ,
{ " vm " , optional_argument , NULL , ' v ' } ,
2012-06-04 14:39:22 +04:00
{ " quiet " , no_argument , NULL , ' q ' } ,
2013-11-06 21:28:39 +04:00
{ }
2012-04-12 16:45:50 +04:00
} ;
int c ;
assert ( argc > = 0 ) ;
assert ( argv ) ;
2014-08-02 19:12:21 +04:00
while ( ( c = getopt_long ( argc , argv , " hqcv " , options , NULL ) ) > = 0 )
2012-04-12 16:45:50 +04:00
switch ( c ) {
case ' h ' :
2014-08-02 19:12:21 +04:00
help ( ) ;
return 0 ;
2012-04-12 16:45:50 +04:00
case ARG_VERSION :
puts ( PACKAGE_STRING ) ;
puts ( SYSTEMD_FEATURES ) ;
return 0 ;
case ' q ' :
arg_quiet = true ;
break ;
case ' c ' :
arg_mode = ONLY_CONTAINER ;
break ;
case ' v ' :
arg_mode = ONLY_VM ;
break ;
case ' ? ' :
return - EINVAL ;
default :
2013-11-06 21:28:39 +04:00
assert_not_reached ( " Unhandled option " ) ;
2012-04-12 16:45:50 +04:00
}
if ( optind < argc ) {
2014-08-02 19:12:21 +04:00
log_error ( " %s takes no arguments. " ,
program_invocation_short_name ) ;
2012-04-12 16:45:50 +04:00
return - EINVAL ;
}
return 1 ;
}
2011-02-21 23:48:59 +03:00
int main ( int argc , char * argv [ ] ) {
2012-04-12 16:45:50 +04:00
const char * id = NULL ;
2012-04-17 20:42:09 +04:00
int retval = EXIT_SUCCESS ;
2013-10-31 19:23:06 +04:00
int r ;
2011-02-21 23:48:59 +03:00
/* This is mostly intended to be used for scripts which want
* to detect whether we are being run in a virtualized
* environment or not */
2012-04-12 16:45:50 +04:00
log_parse_environment ( ) ;
log_open ( ) ;
r = parse_argv ( argc , argv ) ;
if ( r < = 0 )
return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS ;
switch ( arg_mode ) {
case ANY_VIRTUALIZATION : {
2014-02-24 01:05:18 +04:00
int v ;
2012-04-12 16:45:50 +04:00
v = detect_virtualization ( & id ) ;
if ( v < 0 ) {
2014-11-28 13:58:34 +03:00
log_error_errno ( - v , " Failed to check for virtualization: %m " ) ;
2012-04-12 16:45:50 +04:00
return EXIT_FAILURE ;
}
retval = v ! = VIRTUALIZATION_NONE ? EXIT_SUCCESS : EXIT_FAILURE ;
break ;
}
case ONLY_CONTAINER :
r = detect_container ( & id ) ;
if ( r < 0 ) {
2014-11-28 13:58:34 +03:00
log_error_errno ( - r , " Failed to check for container: %m " ) ;
2012-04-12 16:45:50 +04:00
return EXIT_FAILURE ;
}
retval = r > 0 ? EXIT_SUCCESS : EXIT_FAILURE ;
break ;
case ONLY_VM :
r = detect_vm ( & id ) ;
if ( r < 0 ) {
2014-11-28 13:58:34 +03:00
log_error_errno ( - r , " Failed to check for vm: %m " ) ;
2012-04-12 16:45:50 +04:00
return EXIT_FAILURE ;
}
retval = r > 0 ? EXIT_SUCCESS : EXIT_FAILURE ;
break ;
2011-02-21 23:48:59 +03:00
}
2012-04-12 17:10:28 +04:00
if ( ! arg_quiet )
puts ( id ? id : " none " ) ;
2011-02-21 23:48:59 +03:00
2012-04-12 16:45:50 +04:00
return retval ;
2011-02-21 23:48:59 +03:00
}