2013-10-17 05:18:36 +04:00
/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
/***
This file is part of systemd .
Copyright 2013 Tom Gundersen < teg @ jklm . no >
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/>.
* * */
2014-06-01 11:12:00 +04:00
# include "capability.h"
2013-10-17 05:18:36 +04:00
# include "sd-event.h"
2013-11-23 05:47:12 +04:00
# include "sd-daemon.h"
2013-10-17 05:18:36 +04:00
# include "networkd.h"
int main ( int argc , char * argv [ ] ) {
2013-11-27 19:28:54 +04:00
_cleanup_manager_free_ Manager * m = NULL ;
2014-06-01 11:12:00 +04:00
const char * user = " systemd-network " ;
uid_t uid ;
gid_t gid ;
2013-10-17 05:18:36 +04:00
int r ;
log_set_target ( LOG_TARGET_AUTO ) ;
log_parse_environment ( ) ;
log_open ( ) ;
umask ( 0022 ) ;
if ( argc ! = 1 ) {
log_error ( " This program takes no arguments. " ) ;
2013-11-23 05:07:08 +04:00
r = - EINVAL ;
goto out ;
2013-10-17 05:18:36 +04:00
}
2014-06-01 11:12:00 +04:00
r = get_user_creds ( & user , & uid , & gid , NULL , NULL ) ;
if ( r < 0 ) {
2014-11-28 15:19:16 +03:00
log_error_errno ( r , " Cannot resolve user name %s: %m " , user ) ;
2014-06-01 11:12:00 +04:00
goto out ;
}
2014-02-27 04:24:05 +04:00
/* Always create the directories people can create inotify
* watches in . */
2014-06-03 20:57:47 +04:00
r = mkdir_safe_label ( " /run/systemd/netif " , 0755 , uid , gid ) ;
2014-03-13 22:02:28 +04:00
if ( r < 0 )
2014-11-28 19:09:20 +03:00
log_error_errno ( r , " Could not create runtime directory: %m " ) ;
2014-03-13 22:02:28 +04:00
2014-06-03 20:57:47 +04:00
r = mkdir_safe_label ( " /run/systemd/netif/links " , 0755 , uid , gid ) ;
2014-03-13 22:02:28 +04:00
if ( r < 0 )
2014-11-28 19:09:20 +03:00
log_error_errno ( r , " Could not create runtime directory 'links': %m " ) ;
2014-03-13 22:02:28 +04:00
2014-06-03 20:57:47 +04:00
r = mkdir_safe_label ( " /run/systemd/netif/leases " , 0755 , uid , gid ) ;
2014-03-13 22:02:28 +04:00
if ( r < 0 )
2014-11-28 19:09:20 +03:00
log_error_errno ( r , " Could not create runtime directory 'leases': %m " ) ;
2014-02-27 04:24:05 +04:00
2014-06-01 11:12:00 +04:00
r = drop_privileges ( uid , gid ,
( 1ULL < < CAP_NET_ADMIN ) |
( 1ULL < < CAP_NET_BIND_SERVICE ) |
( 1ULL < < CAP_NET_BROADCAST ) |
2014-06-02 23:50:50 +04:00
( 1ULL < < CAP_NET_RAW ) ) ;
2014-06-01 11:12:00 +04:00
if ( r < 0 )
goto out ;
2014-07-08 01:11:03 +04:00
assert_se ( sigprocmask_many ( SIG_BLOCK , SIGTERM , SIGINT , - 1 ) = = 0 ) ;
2013-10-17 05:18:36 +04:00
r = manager_new ( & m ) ;
2014-01-16 17:59:26 +04:00
if ( r < 0 ) {
2014-11-28 15:19:16 +03:00
log_error_errno ( r , " Could not create manager: %m " ) ;
2013-11-23 05:07:08 +04:00
goto out ;
2014-01-16 17:59:26 +04:00
}
2013-10-17 05:18:36 +04:00
2014-03-11 02:40:34 +04:00
r = manager_udev_listen ( m ) ;
2014-01-16 17:59:26 +04:00
if ( r < 0 ) {
2014-11-28 15:19:16 +03:00
log_error_errno ( r , " Could not connect to udev: %m " ) ;
2014-01-16 17:59:26 +04:00
goto out ;
}
2013-11-25 02:37:56 +04:00
2014-03-11 02:40:34 +04:00
r = manager_rtnl_listen ( m ) ;
2014-01-16 17:59:26 +04:00
if ( r < 0 ) {
2014-11-28 15:19:16 +03:00
log_error_errno ( r , " Could not connect to rtnl: %m " ) ;
2013-11-23 05:07:08 +04:00
goto out ;
2014-01-16 17:59:26 +04:00
}
2013-10-17 05:18:36 +04:00
2014-03-11 02:40:34 +04:00
r = manager_bus_listen ( m ) ;
2014-01-16 17:59:26 +04:00
if ( r < 0 ) {
2014-11-28 15:19:16 +03:00
log_error_errno ( r , " Could not connect to system bus: %m " ) ;
2013-11-23 05:07:08 +04:00
goto out ;
2014-01-16 17:59:26 +04:00
}
2013-10-17 05:18:36 +04:00
2014-03-11 02:40:34 +04:00
r = manager_load_config ( m ) ;
2014-01-16 17:59:26 +04:00
if ( r < 0 ) {
2014-11-28 15:19:16 +03:00
log_error_errno ( r , " Could not load configuration files: %m " ) ;
2013-11-23 05:07:08 +04:00
goto out ;
2014-01-16 17:59:26 +04:00
}
2014-01-06 02:01:10 +04:00
2014-04-15 16:21:44 +04:00
r = manager_rtnl_enumerate_links ( m ) ;
2014-01-14 02:48:28 +04:00
if ( r < 0 ) {
2014-11-28 15:19:16 +03:00
log_error_errno ( r , " Could not enumerate links: %m " ) ;
2014-01-14 02:48:28 +04:00
goto out ;
}
2013-11-23 05:07:08 +04:00
sd_notify ( false ,
" READY=1 \n "
" STATUS=Processing requests... " ) ;
2013-11-14 19:22:51 +04:00
2013-10-17 05:18:36 +04:00
r = sd_event_loop ( m - > event ) ;
2014-01-16 17:59:26 +04:00
if ( r < 0 ) {
2014-11-28 15:19:16 +03:00
log_error_errno ( r , " Event loop failed: %m " ) ;
2013-11-23 05:07:08 +04:00
goto out ;
2014-01-16 17:59:26 +04:00
}
2013-11-23 05:07:08 +04:00
out :
sd_notify ( false ,
2014-08-21 19:19:28 +04:00
" STOPPING=1 \n "
2013-11-23 05:07:08 +04:00
" STATUS=Shutting down... " ) ;
2013-10-17 05:18:36 +04:00
2013-11-23 05:07:08 +04:00
return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS ;
2013-10-17 05:18:36 +04:00
}