2010-08-14 21:59:25 +04:00
/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
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/>.
* * */
2013-11-20 00:12:59 +04:00
# include "unit.h"
# include "socket.h"
2010-04-18 05:08:16 +04:00
# include "dbus-unit.h"
# include "dbus-execute.h"
2012-07-20 01:47:10 +04:00
# include "dbus-kill.h"
2013-06-27 06:14:27 +04:00
# include "dbus-cgroup.h"
# include "dbus-socket.h"
2013-11-20 00:12:59 +04:00
# include "bus-util.h"
static BUS_DEFINE_PROPERTY_GET_ENUM ( property_get_result , socket_result , SocketResult ) ;
static BUS_DEFINE_PROPERTY_GET_ENUM ( property_get_bind_ipv6_only , socket_address_bind_ipv6_only , SocketAddressBindIPv6Only ) ;
static int property_get_listen (
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 ) {
2010-04-18 05:08:16 +04:00
2013-11-20 00:12:59 +04:00
Socket * s = SOCKET ( userdata ) ;
2013-04-02 00:09:45 +04:00
SocketPort * p ;
2013-11-20 00:12:59 +04:00
int r ;
2013-04-02 00:09:45 +04:00
2013-11-20 00:12:59 +04:00
assert ( bus ) ;
assert ( reply ) ;
2013-04-02 00:09:45 +04:00
assert ( s ) ;
2013-11-20 00:12:59 +04:00
r = sd_bus_message_open_container ( reply , ' a ' , " (ss) " ) ;
if ( r < 0 )
return r ;
2013-04-02 00:09:45 +04:00
LIST_FOREACH ( port , p , s - > ports ) {
2013-04-18 11:11:22 +04:00
_cleanup_free_ char * address = NULL ;
2013-04-02 00:09:45 +04:00
const char * a ;
switch ( p - > type ) {
case SOCKET_SOCKET : {
r = socket_address_print ( & p - > address , & address ) ;
2013-11-20 00:12:59 +04:00
if ( r )
2013-04-02 00:09:45 +04:00
return r ;
2013-11-20 00:12:59 +04:00
2013-04-02 00:09:45 +04:00
a = address ;
break ;
}
case SOCKET_SPECIAL :
case SOCKET_MQUEUE :
case SOCKET_FIFO :
a = p - > path ;
break ;
default :
2013-11-20 00:12:59 +04:00
assert_not_reached ( " Unknown socket type " ) ;
2013-04-02 00:09:45 +04:00
}
2013-11-20 00:12:59 +04:00
r = sd_bus_message_append ( reply , " (ss) " , socket_port_type_to_string ( p ) , a ) ;
if ( r < 0 )
return r ;
2013-04-02 00:09:45 +04:00
}
2013-11-20 00:12:59 +04:00
return sd_bus_message_close_container ( reply ) ;
2013-04-02 00:09:45 +04:00
}
2013-11-20 00:12:59 +04:00
const sd_bus_vtable bus_socket_vtable [ ] = {
SD_BUS_VTABLE_START ( 0 ) ,
2013-12-22 05:24:05 +04:00
SD_BUS_PROPERTY ( " BindIPv6Only " , " s " , property_get_bind_ipv6_only , offsetof ( Socket , bind_ipv6_only ) , SD_BUS_VTABLE_PROPERTY_CONST ) ,
SD_BUS_PROPERTY ( " Backlog " , " u " , bus_property_get_unsigned , offsetof ( Socket , backlog ) , SD_BUS_VTABLE_PROPERTY_CONST ) ,
SD_BUS_PROPERTY ( " TimeoutUSec " , " t " , bus_property_get_usec , offsetof ( Socket , 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 ( Socket , control_pid ) , SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE ) ,
2013-12-22 05:24:05 +04:00
SD_BUS_PROPERTY ( " BindToDevice " , " s " , NULL , offsetof ( Socket , bind_to_device ) , SD_BUS_VTABLE_PROPERTY_CONST ) ,
SD_BUS_PROPERTY ( " DirectoryMode " , " u " , bus_property_get_mode , offsetof ( Socket , directory_mode ) , SD_BUS_VTABLE_PROPERTY_CONST ) ,
SD_BUS_PROPERTY ( " SocketMode " , " u " , bus_property_get_mode , offsetof ( Socket , socket_mode ) , SD_BUS_VTABLE_PROPERTY_CONST ) ,
SD_BUS_PROPERTY ( " Accept " , " b " , bus_property_get_bool , offsetof ( Socket , accept ) , SD_BUS_VTABLE_PROPERTY_CONST ) ,
SD_BUS_PROPERTY ( " KeepAlive " , " b " , bus_property_get_bool , offsetof ( Socket , keep_alive ) , SD_BUS_VTABLE_PROPERTY_CONST ) ,
SD_BUS_PROPERTY ( " Priority " , " i " , bus_property_get_int , offsetof ( Socket , priority ) , SD_BUS_VTABLE_PROPERTY_CONST ) ,
SD_BUS_PROPERTY ( " ReceiveBuffer " , " t " , bus_property_get_size , offsetof ( Socket , receive_buffer ) , SD_BUS_VTABLE_PROPERTY_CONST ) ,
SD_BUS_PROPERTY ( " SendBuffer " , " t " , bus_property_get_size , offsetof ( Socket , send_buffer ) , SD_BUS_VTABLE_PROPERTY_CONST ) ,
SD_BUS_PROPERTY ( " IPTOS " , " i " , bus_property_get_int , offsetof ( Socket , ip_tos ) , SD_BUS_VTABLE_PROPERTY_CONST ) ,
SD_BUS_PROPERTY ( " IPTTL " , " i " , bus_property_get_int , offsetof ( Socket , ip_ttl ) , SD_BUS_VTABLE_PROPERTY_CONST ) ,
SD_BUS_PROPERTY ( " PipeSize " , " t " , bus_property_get_size , offsetof ( Socket , pipe_size ) , SD_BUS_VTABLE_PROPERTY_CONST ) ,
SD_BUS_PROPERTY ( " FreeBind " , " b " , bus_property_get_bool , offsetof ( Socket , free_bind ) , SD_BUS_VTABLE_PROPERTY_CONST ) ,
SD_BUS_PROPERTY ( " Transparent " , " b " , bus_property_get_bool , offsetof ( Socket , transparent ) , SD_BUS_VTABLE_PROPERTY_CONST ) ,
SD_BUS_PROPERTY ( " Broadcast " , " b " , bus_property_get_bool , offsetof ( Socket , broadcast ) , SD_BUS_VTABLE_PROPERTY_CONST ) ,
SD_BUS_PROPERTY ( " PassCredentials " , " b " , bus_property_get_bool , offsetof ( Socket , pass_cred ) , SD_BUS_VTABLE_PROPERTY_CONST ) ,
SD_BUS_PROPERTY ( " PassSecurity " , " b " , bus_property_get_bool , offsetof ( Socket , pass_sec ) , SD_BUS_VTABLE_PROPERTY_CONST ) ,
SD_BUS_PROPERTY ( " Listen " , " a(ss) " , property_get_listen , 0 , SD_BUS_VTABLE_PROPERTY_CONST ) ,
SD_BUS_PROPERTY ( " Mark " , " i " , bus_property_get_int , offsetof ( Socket , mark ) , SD_BUS_VTABLE_PROPERTY_CONST ) ,
SD_BUS_PROPERTY ( " MaxConnections " , " u " , bus_property_get_unsigned , offsetof ( Socket , max_connections ) , SD_BUS_VTABLE_PROPERTY_CONST ) ,
SD_BUS_PROPERTY ( " NConnections " , " u " , bus_property_get_unsigned , offsetof ( Socket , n_connections ) , 0 ) ,
SD_BUS_PROPERTY ( " NAccepted " , " u " , bus_property_get_unsigned , offsetof ( Socket , n_accepted ) , 0 ) ,
SD_BUS_PROPERTY ( " MessageQueueMaxMessages " , " x " , bus_property_get_long , offsetof ( Socket , mq_maxmsg ) , SD_BUS_VTABLE_PROPERTY_CONST ) ,
SD_BUS_PROPERTY ( " MessageQueueMessageSize " , " x " , bus_property_get_long , offsetof ( Socket , mq_msgsize ) , SD_BUS_VTABLE_PROPERTY_CONST ) ,
2013-11-20 00:12:59 +04:00
SD_BUS_PROPERTY ( " Result " , " s " , property_get_result , offsetof ( Socket , result ) , SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE ) ,
2013-12-22 05:24:05 +04:00
SD_BUS_PROPERTY ( " ReusePort " , " b " , bus_property_get_bool , offsetof ( Socket , reuse_port ) , SD_BUS_VTABLE_PROPERTY_CONST ) ,
SD_BUS_PROPERTY ( " SmackLabel " , " s " , NULL , offsetof ( Socket , smack ) , SD_BUS_VTABLE_PROPERTY_CONST ) ,
SD_BUS_PROPERTY ( " SmackLabelIPIn " , " s " , NULL , offsetof ( Socket , smack_ip_in ) , SD_BUS_VTABLE_PROPERTY_CONST ) ,
SD_BUS_PROPERTY ( " SmackLabelIPOut " , " s " , NULL , offsetof ( Socket , smack_ip_out ) , SD_BUS_VTABLE_PROPERTY_CONST ) ,
BUS_EXEC_COMMAND_LIST_VTABLE ( " ExecStartPre " , offsetof ( Socket , exec_command [ SOCKET_EXEC_START_PRE ] ) , SD_BUS_VTABLE_PROPERTY_EMITS_INVALIDATION ) ,
BUS_EXEC_COMMAND_LIST_VTABLE ( " ExecStartPost " , offsetof ( Socket , exec_command [ SOCKET_EXEC_START_POST ] ) , SD_BUS_VTABLE_PROPERTY_EMITS_INVALIDATION ) ,
BUS_EXEC_COMMAND_LIST_VTABLE ( " ExecStopPre " , offsetof ( Socket , exec_command [ SOCKET_EXEC_STOP_PRE ] ) , SD_BUS_VTABLE_PROPERTY_EMITS_INVALIDATION ) ,
BUS_EXEC_COMMAND_LIST_VTABLE ( " ExecStopPost " , offsetof ( Socket , exec_command [ SOCKET_EXEC_STOP_POST ] ) , 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
} ;
2013-11-20 00:12:59 +04:00
const char * const bus_socket_changing_properties [ ] = {
" ControlPID " ,
" NAccepted " ,
" NConnections " ,
" Result " ,
NULL
} ;
2013-06-28 01:21:21 +04:00
int bus_socket_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
Socket * s = SOCKET ( u ) ;
2013-11-20 00:12:59 +04:00
assert ( s ) ;
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
2013-11-20 00:12:59 +04:00
return bus_cgroup_set_property ( u , & s - > cgroup_context , name , message , mode , error ) ;
2013-06-28 01:21:21 +04:00
}
int bus_socket_commit_properties ( Unit * u ) {
assert ( u ) ;
unit_realize_cgroup ( u ) ;
return 0 ;
}