2005-06-05 06:41:09 +04:00
/*
2006-08-21 04:38:20 +04:00
* Copyright ( C ) 2005 - 2006 Kay Sievers < kay . sievers @ vrfy . org >
2005-06-05 06:41:09 +04:00
*
* This program 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 version 2 of the License .
*
* This program 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 this program ; if not , write to the Free Software Foundation , Inc . ,
2006-08-28 02:29:11 +04:00
* 51 Franklin Street , Fifth Floor , Boston , MA 02110 - 1301 , USA .
2005-06-05 06:41:09 +04:00
*
*/
2008-07-30 03:45:23 +04:00
# include "config.h"
2005-06-05 06:41:09 +04:00
# include <time.h>
# include <errno.h>
# include <stdio.h>
# include <stdlib.h>
# include <stddef.h>
# include <string.h>
# include <unistd.h>
2008-09-03 23:56:47 +04:00
# include <getopt.h>
2006-05-01 22:36:21 +04:00
# include <sys/types.h>
# include <sys/socket.h>
# include <sys/wait.h>
# include <sys/un.h>
2005-06-05 06:41:09 +04:00
# include "udev.h"
# include "udevd.h"
2008-09-06 17:45:31 +04:00
int udevadm_control ( struct udev * udev , int argc , char * argv [ ] )
2008-09-03 23:56:47 +04:00
{
struct udev_ctrl * uctrl ;
int rc = 1 ;
/* compat values with '_' will be removed in a future release */
static const struct option options [ ] = {
{ " log-priority " , 1 , NULL , ' l ' } ,
{ " log_priority " , 1 , NULL , ' l ' + 256 } ,
{ " stop-exec-queue " , 0 , NULL , ' s ' } ,
{ " stop_exec_queue " , 0 , NULL , ' s ' + 256 } ,
{ " start-exec-queue " , 0 , NULL , ' S ' } ,
{ " start_exec_queue " , 0 , NULL , ' S ' + 256 } ,
{ " reload-rules " , 0 , NULL , ' R ' } ,
{ " reload_rules " , 0 , NULL , ' R ' + 256 } ,
{ " env " , 1 , NULL , ' e ' } ,
{ " max-childs " , 1 , NULL , ' m ' } ,
{ " max_childs " , 1 , NULL , ' m ' + 256 } ,
{ " max-childs-running " , 1 , NULL , ' M ' } ,
{ " max_childs_running " , 1 , NULL , ' M ' + 256 } ,
{ " help " , 0 , NULL , ' h ' } ,
{ }
} ;
2005-06-05 06:41:09 +04:00
2008-09-03 23:56:47 +04:00
if ( getuid ( ) ! = 0 ) {
fprintf ( stderr , " root privileges required \n " ) ;
2005-06-05 06:41:09 +04:00
goto exit ;
}
2008-09-03 23:56:47 +04:00
2008-09-06 17:45:31 +04:00
uctrl = udev_ctrl_new_from_socket ( udev , UDEVD_CTRL_SOCK_PATH ) ;
2008-09-03 23:56:47 +04:00
if ( uctrl = = NULL )
goto exit ;
while ( 1 ) {
int option ;
int i ;
2007-04-27 00:52:20 +04:00
char * endp ;
2008-09-03 23:56:47 +04:00
option = getopt_long ( argc , argv , " l:sSRe:m:M:h " , options , NULL ) ;
if ( option = = - 1 )
break ;
if ( option > 255 ) {
2008-09-06 17:45:31 +04:00
info ( udev , " udevadm control expects commands without underscore, "
2008-09-03 23:56:47 +04:00
" this will stop working in a future release \n " ) ;
fprintf ( stderr , " udevadm control expects commands without underscore, "
" this will stop working in a future release \n " ) ;
2007-04-27 00:52:20 +04:00
}
2008-09-03 23:56:47 +04:00
switch ( option ) {
case ' l ' :
case ' l ' + 256 :
i = log_priority ( optarg ) ;
if ( i < 0 ) {
fprintf ( stderr , " invalid number '%s' \n " , optarg ) ;
goto exit ;
}
udev_ctrl_set_log_level ( uctrl , log_priority ( optarg ) ) ;
break ;
case ' s ' :
case ' s ' + 256 :
udev_ctrl_stop_exec_queue ( uctrl ) ;
break ;
case ' S ' :
case ' S ' + 256 :
udev_ctrl_start_exec_queue ( uctrl ) ;
break ;
case ' R ' :
case ' R ' + 256 :
udev_ctrl_reload_rules ( uctrl ) ;
break ;
case ' e ' :
if ( strchr ( optarg , ' = ' ) = = NULL ) {
fprintf ( stderr , " expect <KEY>=<valaue> instead of '%s' \n " , optarg ) ;
goto exit ;
}
udev_ctrl_set_env ( uctrl , optarg ) ;
break ;
case ' m ' :
case ' m ' + 256 :
i = strtoul ( optarg , & endp , 0 ) ;
if ( endp [ 0 ] ! = ' \0 ' | | i < 1 ) {
fprintf ( stderr , " invalid number '%s' \n " , optarg ) ;
goto exit ;
}
udev_ctrl_set_max_childs ( uctrl , i ) ;
break ;
case ' M ' :
case ' M ' + 256 :
i = strtoul ( optarg , & endp , 0 ) ;
if ( endp [ 0 ] ! = ' \0 ' | | i < 1 ) {
fprintf ( stderr , " invalid number '%s' \n " , optarg ) ;
goto exit ;
}
udev_ctrl_set_max_childs_running ( uctrl , i ) ;
break ;
case ' h ' :
printf ( " Usage: udevadm control COMMAND \n "
" --log-priority=<level> set the udev log level for the daemon \n "
" --stop-exec-queue keep udevd from executing events, queue only \n "
" --start-exec-queue execute events, flush queue \n "
" --reload-rules reloads the rules files \n "
" --env=<KEY>=<value> set a global environment variable \n "
" --max-childs=<N> maximum number of childs \n "
" --max-childs-running=<N> maximum number of childs running at the same time \n "
" --help print this help text \n \n " ) ;
2006-07-03 03:03:53 +04:00
goto exit ;
2008-09-03 23:56:47 +04:00
default :
2006-07-03 03:03:53 +04:00
goto exit ;
2005-08-11 22:34:24 +04:00
}
2005-06-05 06:41:09 +04:00
}
2008-09-03 23:56:47 +04:00
/* compat stuff which will be removed in a future release */
if ( argv [ optind ] ! = NULL ) {
const char * arg = argv [ optind ] ;
2005-06-05 06:41:09 +04:00
2008-09-03 23:56:47 +04:00
fprintf ( stderr , " udevadm control commands requires the --<command> format, "
" this will stop working in a future release \n " ) ;
2008-09-06 17:45:31 +04:00
err ( udev , " udevadm control commands requires the --<command> format, "
2008-09-03 23:56:47 +04:00
" this will stop working in a future release \n " ) ;
2005-06-05 06:41:09 +04:00
2008-09-03 23:56:47 +04:00
if ( ! strncmp ( arg , " log_priority= " , strlen ( " log_priority= " ) ) ) {
udev_ctrl_set_log_level ( uctrl , log_priority ( & arg [ strlen ( " log_priority= " ) ] ) ) ;
} else if ( ! strcmp ( arg , " stop_exec_queue " ) ) {
udev_ctrl_stop_exec_queue ( uctrl ) ;
} else if ( ! strcmp ( arg , " start_exec_queue " ) ) {
udev_ctrl_start_exec_queue ( uctrl ) ;
} else if ( ! strcmp ( arg , " reload_rules " ) ) {
udev_ctrl_reload_rules ( uctrl ) ;
} else if ( ! strncmp ( arg , " max_childs= " , strlen ( " max_childs= " ) ) ) {
udev_ctrl_set_max_childs ( uctrl , strtoul ( & arg [ strlen ( " max_childs= " ) ] , NULL , 0 ) ) ;
} else if ( ! strncmp ( arg , " max_childs_running= " , strlen ( " max_childs_running= " ) ) ) {
udev_ctrl_set_max_childs_running ( uctrl , strtoul ( & arg [ strlen ( " max_childs_running= " ) ] , NULL , 0 ) ) ;
} else if ( ! strncmp ( arg , " env " , strlen ( " env " ) ) ) {
udev_ctrl_set_env ( uctrl , & arg [ strlen ( " env= " ) ] ) ;
} else {
fprintf ( stderr , " unrecognized command '%s' \n " , arg ) ;
2008-09-06 17:45:31 +04:00
err ( udev , " unrecognized command '%s' \n " , arg ) ;
2008-09-03 23:56:47 +04:00
}
2005-06-14 00:38:42 +04:00
}
2005-06-05 06:41:09 +04:00
exit :
2008-09-03 23:56:47 +04:00
udev_ctrl_unref ( uctrl ) ;
return rc ;
2005-06-05 06:41:09 +04:00
}