2005-06-05 06:41:09 +04:00
/*
2008-09-10 04:40:42 +04:00
* Copyright ( C ) 2005 - 2008 Kay Sievers < kay . sievers @ vrfy . org >
2005-06-05 06:41:09 +04:00
*
2008-09-10 04:40:42 +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 , either version 2 of the License , or
* ( at your option ) any later version .
2005-06-05 06:41:09 +04:00
*
2008-09-10 04:40:42 +04:00
* 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 .
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"
2008-09-08 19:59:00 +04:00
static void print_help ( void )
{
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 "
" --help print this help text \n \n " ) ;
}
2005-06-05 06:41:09 +04:00
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
{
2008-09-08 19:59:00 +04:00
struct udev_ctrl * uctrl = NULL ;
2008-09-03 23:56:47 +04:00
int rc = 1 ;
/* compat values with '_' will be removed in a future release */
static const struct option options [ ] = {
2008-10-02 18:49:05 +04:00
{ " log-priority " , required_argument , NULL , ' l ' } ,
{ " log_priority " , required_argument , NULL , ' l ' + 256 } ,
{ " stop-exec-queue " , no_argument , NULL , ' s ' } ,
{ " stop_exec_queue " , no_argument , NULL , ' s ' + 256 } ,
{ " start-exec-queue " , no_argument , NULL , ' S ' } ,
{ " start_exec_queue " , no_argument , NULL , ' S ' + 256 } ,
{ " reload-rules " , no_argument , NULL , ' R ' } ,
{ " reload_rules " , no_argument , NULL , ' R ' + 256 } ,
{ " env " , required_argument , NULL , ' e ' } ,
{ " max-childs " , required_argument , NULL , ' m ' } ,
{ " max_childs " , required_argument , NULL , ' m ' + 256 } ,
{ " help " , no_argument , NULL , ' h ' } ,
2008-09-03 23:56:47 +04:00
{ }
} ;
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-08 19:59:00 +04:00
uctrl = udev_ctrl_new_from_socket ( udev , UDEV_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 ) {
fprintf ( stderr , " udevadm control expects commands without underscore, "
" this will stop working in a future release \n " ) ;
2008-09-09 16:48:42 +04:00
err ( udev , " 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 :
2008-09-10 20:39:23 +04:00
i = util_log_priority ( optarg ) ;
2008-09-03 23:56:47 +04:00
if ( i < 0 ) {
fprintf ( stderr , " invalid number '%s' \n " , optarg ) ;
goto exit ;
}
2008-09-10 20:39:23 +04:00
udev_ctrl_send_set_log_level ( uctrl , util_log_priority ( optarg ) ) ;
2008-09-08 19:59:00 +04:00
rc = 0 ;
2008-09-03 23:56:47 +04:00
break ;
case ' s ' :
case ' s ' + 256 :
2008-09-08 19:59:00 +04:00
udev_ctrl_send_stop_exec_queue ( uctrl ) ;
rc = 0 ;
2008-09-03 23:56:47 +04:00
break ;
case ' S ' :
case ' S ' + 256 :
2008-09-08 19:59:00 +04:00
udev_ctrl_send_start_exec_queue ( uctrl ) ;
rc = 0 ;
2008-09-03 23:56:47 +04:00
break ;
case ' R ' :
case ' R ' + 256 :
2008-09-08 19:59:00 +04:00
udev_ctrl_send_reload_rules ( uctrl ) ;
rc = 0 ;
2008-09-03 23:56:47 +04:00
break ;
case ' e ' :
if ( strchr ( optarg , ' = ' ) = = NULL ) {
fprintf ( stderr , " expect <KEY>=<valaue> instead of '%s' \n " , optarg ) ;
goto exit ;
}
2008-09-08 19:59:00 +04:00
udev_ctrl_send_set_env ( uctrl , optarg ) ;
rc = 0 ;
2008-09-03 23:56:47 +04:00
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 ;
}
2008-09-08 19:59:00 +04:00
udev_ctrl_send_set_max_childs ( uctrl , i ) ;
rc = 0 ;
2008-09-03 23:56:47 +04:00
break ;
case ' h ' :
2008-09-08 19:59:00 +04:00
print_help ( ) ;
rc = 0 ;
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= " ) ) ) {
2008-09-10 20:39:23 +04:00
udev_ctrl_send_set_log_level ( uctrl , util_log_priority ( & arg [ strlen ( " log_priority= " ) ] ) ) ;
2008-09-08 19:59:00 +04:00
rc = 0 ;
goto exit ;
2008-09-03 23:56:47 +04:00
} else if ( ! strcmp ( arg , " stop_exec_queue " ) ) {
2008-09-08 19:59:00 +04:00
udev_ctrl_send_stop_exec_queue ( uctrl ) ;
rc = 0 ;
goto exit ;
2008-09-03 23:56:47 +04:00
} else if ( ! strcmp ( arg , " start_exec_queue " ) ) {
2008-09-08 19:59:00 +04:00
udev_ctrl_send_start_exec_queue ( uctrl ) ;
rc = 0 ;
goto exit ;
2008-09-03 23:56:47 +04:00
} else if ( ! strcmp ( arg , " reload_rules " ) ) {
2008-09-08 19:59:00 +04:00
udev_ctrl_send_reload_rules ( uctrl ) ;
rc = 0 ;
goto exit ;
2008-09-03 23:56:47 +04:00
} else if ( ! strncmp ( arg , " max_childs= " , strlen ( " max_childs= " ) ) ) {
2008-09-08 19:59:00 +04:00
udev_ctrl_send_set_max_childs ( uctrl , strtoul ( & arg [ strlen ( " max_childs= " ) ] , NULL , 0 ) ) ;
rc = 0 ;
goto exit ;
2008-09-03 23:56:47 +04:00
} else if ( ! strncmp ( arg , " env " , strlen ( " env " ) ) ) {
2008-09-08 19:59:00 +04:00
udev_ctrl_send_set_env ( uctrl , & arg [ strlen ( " env= " ) ] ) ;
rc = 0 ;
goto exit ;
2008-09-03 23:56:47 +04:00
}
2005-06-14 00:38:42 +04:00
}
2008-09-08 19:59:00 +04:00
if ( rc ! = 0 ) {
fprintf ( stderr , " unrecognized command \n " ) ;
err ( udev , " unrecognized command \n " ) ;
}
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
}