2011-05-24 06:20:35 +04:00
/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
/***
This file is part of systemd .
Copyright 2011 Lennart Poettering
systemd is free software ; you can redistribute it and / or modify it
under the terms of the GNU General Public License as published by
the Free Software Foundation ; either version 2 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
General Public License for more details .
You should have received a copy of the GNU General Public License
along with systemd ; If not , see < http : //www.gnu.org/licenses/>.
* * */
# include <errno.h>
# include <string.h>
# include "logind-acl.h"
# include "util.h"
# include "log.h"
2011-07-15 00:51:19 +04:00
# include "sd-daemon.h"
2011-07-23 02:48:11 +04:00
# include "sd-login.h"
2011-05-24 06:20:35 +04:00
int main ( int argc , char * argv [ ] ) {
int r ;
2011-07-14 01:17:05 +04:00
const char * path = NULL , * seat ;
2011-06-29 20:06:58 +04:00
bool changed_acl = false ;
2011-07-23 02:48:11 +04:00
uid_t uid ;
2011-05-24 06:20:35 +04:00
log_set_target ( LOG_TARGET_AUTO ) ;
log_parse_environment ( ) ;
log_open ( ) ;
2011-06-29 06:14:43 +04:00
if ( argc < 2 | | argc > 3 ) {
log_error ( " This program expects one or two arguments. " ) ;
2011-05-24 06:20:35 +04:00
r = - EINVAL ;
goto finish ;
}
2011-07-15 00:51:19 +04:00
/* Make sure we don't muck around with ACLs the system is not
* running systemd . */
if ( ! sd_booted ( ) )
return 0 ;
2011-05-24 06:20:35 +04:00
path = argv [ 1 ] ;
2011-06-29 21:41:07 +04:00
seat = argc < 3 | | isempty ( argv [ 2 ] ) ? " seat0 " : argv [ 2 ] ;
2011-05-24 06:20:35 +04:00
2011-07-23 02:48:11 +04:00
r = sd_seat_get_active ( seat , NULL , & uid ) ;
if ( r = = - ENOENT ) {
/* No active session on this seat */
r = 0 ;
goto finish ;
} else if ( r < 0 ) {
log_error ( " Failed to determine active user on seat %s. " , seat ) ;
2011-05-24 06:20:35 +04:00
goto finish ;
}
2011-07-23 02:48:11 +04:00
r = devnode_acl ( path , true , false , 0 , true , uid ) ;
2011-05-24 06:20:35 +04:00
if ( r < 0 ) {
2011-07-23 02:48:11 +04:00
log_error ( " Failed to apply ACL on %s: %s " , path , strerror ( - r ) ) ;
2011-05-24 06:20:35 +04:00
goto finish ;
}
2011-07-23 02:48:11 +04:00
changed_acl = true ;
2011-05-24 06:20:35 +04:00
r = 0 ;
finish :
2011-06-29 20:06:58 +04:00
if ( path & & ! changed_acl ) {
int k ;
/* Better be safe that sorry and reset ACL */
k = devnode_acl ( path , true , false , 0 , false , 0 ) ;
if ( k < 0 ) {
log_error ( " Failed to apply ACL on %s: %s " , path , strerror ( - k ) ) ;
if ( r > = 0 )
r = k ;
}
}
2011-05-24 06:20:35 +04:00
return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS ;
}