2010-04-18 05:08:16 +04:00
/***
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
2010-04-18 05:08:16 +04: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 .
2010-04-18 05:08:16 +04:00
2012-04-12 02:20:58 +04:00
You should have received a copy of the GNU Lesser General Public License
2010-04-18 05:08:16 +04:00
along with systemd ; If not , see < http : //www.gnu.org/licenses/>.
* * */
2015-10-24 23:58:24 +03:00
# include "bus-util.h"
# include "dbus-cgroup.h"
2010-04-18 05:08:16 +04:00
# include "dbus-execute.h"
2013-06-27 06:14:27 +04:00
# include "dbus-kill.h"
2015-11-17 00:09:36 +03:00
# include "dbus-mount.h"
2015-10-24 23:58:24 +03:00
# include "mount.h"
# include "string-util.h"
# include "unit.h"
2013-11-20 00:12:59 +04:00
static int property_get_what (
sd_bus * bus ,
const char * path ,
const char * interface ,
const char * property ,
sd_bus_message * reply ,
2013-11-21 22:34:37 +04:00
void * userdata ,
sd_bus_error * error ) {
2013-11-20 00:12:59 +04:00
Mount * m = userdata ;
2010-05-14 04:29:45 +04:00
const char * d ;
2013-11-20 00:12:59 +04:00
assert ( bus ) ;
assert ( reply ) ;
2010-05-14 04:29:45 +04:00
assert ( m ) ;
if ( m - > from_proc_self_mountinfo & & m - > parameters_proc_self_mountinfo . what )
d = m - > parameters_proc_self_mountinfo . what ;
else if ( m - > from_fragment & & m - > parameters_fragment . what )
d = m - > parameters_fragment . what ;
else
d = " " ;
2013-11-20 00:12:59 +04:00
return sd_bus_message_append ( reply , " s " , d ) ;
2010-05-14 04:29:45 +04:00
}
2013-11-20 00:12:59 +04:00
static int property_get_options (
sd_bus * bus ,
const char * path ,
const char * interface ,
const char * property ,
sd_bus_message * reply ,
2013-11-21 22:34:37 +04:00
void * userdata ,
sd_bus_error * error ) {
2013-11-20 00:12:59 +04:00
Mount * m = userdata ;
2010-05-14 04:29:45 +04:00
const char * d ;
2013-11-20 00:12:59 +04:00
assert ( bus ) ;
assert ( reply ) ;
2010-05-14 04:29:45 +04:00
assert ( m ) ;
if ( m - > from_proc_self_mountinfo & & m - > parameters_proc_self_mountinfo . options )
d = m - > parameters_proc_self_mountinfo . options ;
else if ( m - > from_fragment & & m - > parameters_fragment . options )
d = m - > parameters_fragment . options ;
else
d = " " ;
2013-11-20 00:12:59 +04:00
return sd_bus_message_append ( reply , " s " , d ) ;
2010-05-14 04:29:45 +04:00
}
2013-11-20 00:12:59 +04:00
static int property_get_type (
sd_bus * bus ,
const char * path ,
const char * interface ,
const char * property ,
sd_bus_message * reply ,
2013-11-21 22:34:37 +04:00
void * userdata ,
sd_bus_error * error ) {
2013-11-20 00:12:59 +04:00
Mount * m = userdata ;
2010-05-14 04:29:45 +04:00
const char * d ;
2013-11-20 00:12:59 +04:00
assert ( bus ) ;
assert ( reply ) ;
2010-05-14 04:29:45 +04:00
assert ( m ) ;
if ( m - > from_proc_self_mountinfo & & m - > parameters_proc_self_mountinfo . fstype )
d = m - > parameters_proc_self_mountinfo . fstype ;
else if ( m - > from_fragment & & m - > parameters_fragment . fstype )
d = m - > parameters_fragment . fstype ;
else
d = " " ;
2013-11-20 00:12:59 +04:00
return sd_bus_message_append ( reply , " s " , d ) ;
2010-05-14 04:29:45 +04:00
}
2013-11-20 00:12:59 +04:00
static BUS_DEFINE_PROPERTY_GET_ENUM ( property_get_result , mount_result , MountResult ) ;
const sd_bus_vtable bus_mount_vtable [ ] = {
SD_BUS_VTABLE_START ( 0 ) ,
2013-12-22 05:24:05 +04:00
SD_BUS_PROPERTY ( " Where " , " s " , NULL , offsetof ( Mount , where ) , SD_BUS_VTABLE_PROPERTY_CONST ) ,
2013-11-20 00:12:59 +04:00
SD_BUS_PROPERTY ( " What " , " s " , property_get_what , 0 , SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE ) ,
SD_BUS_PROPERTY ( " Options " , " s " , property_get_options , 0 , SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE ) ,
SD_BUS_PROPERTY ( " Type " , " s " , property_get_type , 0 , SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE ) ,
2013-12-22 05:24:05 +04:00
SD_BUS_PROPERTY ( " TimeoutUSec " , " t " , bus_property_get_usec , offsetof ( Mount , timeout_usec ) , SD_BUS_VTABLE_PROPERTY_CONST ) ,
2013-11-20 00:12:59 +04:00
SD_BUS_PROPERTY ( " ControlPID " , " u " , bus_property_get_pid , offsetof ( Mount , control_pid ) , SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE ) ,
2013-12-22 05:24:05 +04:00
SD_BUS_PROPERTY ( " DirectoryMode " , " u " , bus_property_get_mode , offsetof ( Mount , directory_mode ) , SD_BUS_VTABLE_PROPERTY_CONST ) ,
2014-06-16 03:02:27 +04:00
SD_BUS_PROPERTY ( " SloppyOptions " , " b " , bus_property_get_bool , offsetof ( Mount , sloppy_options ) , SD_BUS_VTABLE_PROPERTY_CONST ) ,
2013-11-20 00:12:59 +04:00
SD_BUS_PROPERTY ( " Result " , " s " , property_get_result , offsetof ( Mount , result ) , SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE ) ,
2013-12-22 05:24:05 +04:00
BUS_EXEC_COMMAND_VTABLE ( " ExecMount " , offsetof ( Mount , exec_command [ MOUNT_EXEC_MOUNT ] ) , SD_BUS_VTABLE_PROPERTY_EMITS_INVALIDATION ) ,
BUS_EXEC_COMMAND_VTABLE ( " ExecUnmount " , offsetof ( Mount , exec_command [ MOUNT_EXEC_UNMOUNT ] ) , SD_BUS_VTABLE_PROPERTY_EMITS_INVALIDATION ) ,
BUS_EXEC_COMMAND_VTABLE ( " ExecRemount " , offsetof ( Mount , exec_command [ MOUNT_EXEC_REMOUNT ] ) , SD_BUS_VTABLE_PROPERTY_EMITS_INVALIDATION ) ,
2013-11-20 00:12:59 +04:00
SD_BUS_VTABLE_END
2012-01-16 03:23:59 +04:00
} ;
2014-06-06 17:10:20 +04:00
static int bus_mount_set_transient_property (
Mount * m ,
const char * name ,
sd_bus_message * message ,
UnitSetPropertiesMode mode ,
sd_bus_error * error ) {
const char * new_property ;
char * * property ;
char * p ;
int r ;
assert ( m ) ;
assert ( name ) ;
assert ( message ) ;
if ( streq ( name , " What " ) )
property = & m - > parameters_fragment . what ;
else if ( streq ( name , " Options " ) )
property = & m - > parameters_fragment . options ;
else if ( streq ( name , " Type " ) )
property = & m - > parameters_fragment . fstype ;
else
return 0 ;
r = sd_bus_message_read ( message , " s " , & new_property ) ;
if ( r < 0 )
return r ;
if ( mode ! = UNIT_CHECK ) {
p = strdup ( new_property ) ;
if ( ! p )
return - ENOMEM ;
free ( * property ) ;
* property = p ;
}
return 1 ;
}
2013-06-28 01:21:21 +04:00
int bus_mount_set_property (
Unit * u ,
const char * name ,
2013-11-20 00:12:59 +04:00
sd_bus_message * message ,
2013-06-28 01:21:21 +04:00
UnitSetPropertiesMode mode ,
2013-11-20 00:12:59 +04:00
sd_bus_error * error ) {
2013-06-28 01:21:21 +04:00
Mount * m = MOUNT ( u ) ;
2014-06-06 17:10:20 +04:00
int r ;
2013-06-28 01:21:21 +04:00
2013-11-20 00:12:59 +04:00
assert ( m ) ;
2013-06-28 01:21:21 +04:00
assert ( name ) ;
2013-11-20 00:12:59 +04:00
assert ( message ) ;
2013-06-28 01:21:21 +04:00
2014-06-06 17:10:20 +04:00
r = bus_cgroup_set_property ( u , & m - > cgroup_context , name , message , mode , error ) ;
if ( r ! = 0 )
return r ;
if ( u - > transient & & u - > load_state = = UNIT_STUB ) {
/* This is a transient unit, let's load a little more */
r = bus_mount_set_transient_property ( m , name , message , mode , error ) ;
if ( r ! = 0 )
return r ;
r = bus_exec_context_set_transient_property ( u , & m - > exec_context , name , message , mode , error ) ;
if ( r ! = 0 )
return r ;
r = bus_kill_context_set_transient_property ( u , & m - > kill_context , name , message , mode , error ) ;
if ( r ! = 0 )
return r ;
}
return 0 ;
2013-06-28 01:21:21 +04:00
}
int bus_mount_commit_properties ( Unit * u ) {
assert ( u ) ;
2014-02-14 22:11:07 +04:00
unit_update_cgroup_members_masks ( u ) ;
2013-06-28 01:21:21 +04:00
unit_realize_cgroup ( u ) ;
2014-02-14 22:11:07 +04:00
2013-06-28 01:21:21 +04:00
return 0 ;
}