2013-01-21 04:02:53 +04:00
/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
/***
This file is part of systemd .
Copyright 2013 Lennart Poettering
systemd 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 .
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
Lesser General Public License for more details .
You should have received a copy of the GNU Lesser General Public License
along with systemd ; If not , see < http : //www.gnu.org/licenses/>.
* * */
# include <unistd.h>
# include <stdlib.h>
# include "efivars.h"
# include "path-util.h"
# include "util.h"
2013-01-21 04:12:51 +04:00
# include "mkdir.h"
2013-10-05 19:32:21 +04:00
# include "unit-name.h"
2014-03-06 01:26:10 +04:00
# include "virt.h"
# include "generator.h"
# include "special.h"
2013-01-21 04:02:53 +04:00
2013-01-21 04:12:51 +04:00
static const char * arg_dest = " /tmp " ;
2013-01-21 04:02:53 +04:00
int main ( int argc , char * argv [ ] ) {
2014-03-06 01:26:10 +04:00
_cleanup_free_ char * what = NULL ;
_cleanup_fclose_ FILE * f = NULL ;
2013-01-21 04:02:53 +04:00
int r = EXIT_SUCCESS ;
sd_id128_t id ;
2013-10-31 07:03:28 +04:00
char * name ;
2013-01-21 04:02:53 +04:00
if ( argc > 1 & & argc ! = 4 ) {
log_error ( " This program takes three or no arguments. " ) ;
return EXIT_FAILURE ;
}
if ( argc > 1 )
arg_dest = argv [ 3 ] ;
log_set_target ( LOG_TARGET_SAFE ) ;
log_parse_environment ( ) ;
log_open ( ) ;
umask ( 0022 ) ;
2014-03-06 01:26:10 +04:00
if ( in_initrd ( ) ) {
log_debug ( " In initrd, exiting. " ) ;
2013-01-21 04:02:53 +04:00
return EXIT_SUCCESS ;
2014-03-06 01:26:10 +04:00
}
2014-03-06 21:26:35 +04:00
2014-03-06 01:26:10 +04:00
if ( detect_container ( NULL ) > 0 ) {
log_debug ( " In a container, exiting. " ) ;
return EXIT_SUCCESS ;
}
2013-01-21 04:02:53 +04:00
2014-03-06 01:26:10 +04:00
if ( ! is_efi_boot ( ) ) {
log_debug ( " Not an EFI boot, exiting. " ) ;
2013-01-21 04:02:53 +04:00
return EXIT_SUCCESS ;
2014-03-06 01:26:10 +04:00
}
2014-03-06 21:26:35 +04:00
if ( path_is_mount_point ( " /boot " , true ) < = 0 & &
dir_is_empty ( " /boot " ) < = 0 ) {
2014-03-06 01:26:10 +04:00
log_debug ( " /boot already populated, exiting. " ) ;
return EXIT_SUCCESS ;
}
2013-01-21 04:02:53 +04:00
2013-09-24 02:23:35 +04:00
r = efi_loader_get_device_part_uuid ( & id ) ;
2014-03-06 01:26:10 +04:00
if ( r = = - ENOENT ) {
2014-03-07 05:39:01 +04:00
log_debug ( " EFI loader partition unknown, exiting. " ) ;
2013-01-21 04:02:53 +04:00
return EXIT_SUCCESS ;
2014-03-06 01:26:10 +04:00
} else if ( r < 0 ) {
2014-11-28 15:19:16 +03:00
log_error_errno ( r , " Failed to read ESP partition UUID: %m " ) ;
2013-01-21 04:02:53 +04:00
return EXIT_FAILURE ;
}
2013-10-31 07:03:28 +04:00
name = strappenda ( arg_dest , " /boot.mount " ) ;
2013-01-21 04:02:53 +04:00
f = fopen ( name , " wxe " ) ;
if ( ! f ) {
log_error ( " Failed to create mount unit file %s: %m " , name ) ;
return EXIT_FAILURE ;
}
2013-10-05 19:32:21 +04:00
r = asprintf ( & what ,
" /dev/disk/by-partuuid/%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x " ,
SD_ID128_FORMAT_VAL ( id ) ) ;
if ( r < 0 ) {
log_oom ( ) ;
return EXIT_FAILURE ;
}
2013-01-21 04:02:53 +04:00
fprintf ( f ,
" # Automatially generated by systemd-efi-boot-generator \n \n "
2013-01-21 04:27:32 +04:00
" [Unit] \n "
2014-03-06 21:26:06 +04:00
" Description=EFI System Partition \n "
" Documentation=man:systemd-efi-boot-generator(8) \n " ) ;
2014-03-06 01:26:10 +04:00
r = generator_write_fsck_deps ( f , arg_dest , what , " /boot " , " vfat " ) ;
if ( r < 0 )
return EXIT_FAILURE ;
fprintf ( f ,
2013-10-05 19:32:21 +04:00
" \n "
2013-01-21 04:02:53 +04:00
" [Mount] \n "
2013-10-05 19:32:21 +04:00
" What=%s \n "
2014-03-06 01:26:10 +04:00
" Where=/boot \n "
" Type=vfat \n "
2013-11-21 15:35:46 +04:00
" Options=umask=0077,noauto \n " ,
2014-03-06 01:26:10 +04:00
what ) ;
fflush ( f ) ;
if ( ferror ( f ) ) {
log_error ( " Failed to write mount unit file: %m " ) ;
return EXIT_FAILURE ;
}
2013-01-21 04:02:53 +04:00
2013-10-31 07:03:28 +04:00
name = strappenda ( arg_dest , " /boot.automount " ) ;
2014-03-06 01:26:10 +04:00
fclose ( f ) ;
f = fopen ( name , " wxe " ) ;
if ( ! f ) {
2013-01-21 04:02:53 +04:00
log_error ( " Failed to create automount unit file %s: %m " , name ) ;
return EXIT_FAILURE ;
}
2013-01-21 04:27:32 +04:00
fputs ( " # Automatially generated by systemd-efi-boot-generator \n \n "
" [Unit] \n "
" Description=EFI System Partition Automount \n \n "
" [Automount] \n "
2014-03-06 01:26:10 +04:00
" Where=/boot \n " , f ) ;
fflush ( f ) ;
if ( ferror ( f ) ) {
log_error ( " Failed to write automount unit file: %m " ) ;
return EXIT_FAILURE ;
}
2013-01-21 04:02:53 +04:00
2014-03-06 01:26:10 +04:00
name = strappenda ( arg_dest , " / " SPECIAL_LOCAL_FS_TARGET " .wants/boot.automount " ) ;
2013-01-21 04:12:51 +04:00
mkdir_parents ( name , 0755 ) ;
2013-01-21 04:02:53 +04:00
if ( symlink ( " ../boot.automount " , name ) < 0 ) {
2013-04-23 04:51:29 +04:00
log_error ( " Failed to create symlink %s: %m " , name ) ;
2013-01-21 04:02:53 +04:00
return EXIT_FAILURE ;
}
2013-10-31 07:03:28 +04:00
return EXIT_SUCCESS ;
2013-01-21 04:02:53 +04:00
}