2005-06-05 06:41:09 +04:00
/*
* udevcontrol . c
*
* Copyright ( C ) 2005 Kay Sievers < kay . sievers @ vrfy . org >
*
* 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 . ,
* 675 Mass Ave , Cambridge , MA 0213 9 , USA .
*
*/
# include <sys/types.h>
# include <sys/socket.h>
# include <sys/wait.h>
# include <sys/un.h>
# include <time.h>
# include <errno.h>
# include <stdio.h>
# include <stdlib.h>
# include <stddef.h>
# include <string.h>
# include <unistd.h>
# include <linux/stddef.h>
# include "udev.h"
# include "udev_version.h"
# include "udevd.h"
2005-06-16 03:58:47 +04:00
# include "udev_utils.h"
2005-06-05 06:41:09 +04:00
# include "logging.h"
/* global variables */
static int sock = - 1 ;
2005-10-27 22:32:07 +04:00
static int udev_log = 0 ;
2005-06-05 06:41:09 +04:00
# ifdef USE_LOG
2005-06-16 03:58:47 +04:00
void log_message ( int priority , const char * format , . . . )
2005-06-05 06:41:09 +04:00
{
va_list args ;
2005-10-27 22:32:07 +04:00
if ( priority > udev_log )
2005-06-16 03:58:47 +04:00
return ;
2005-06-05 06:41:09 +04:00
va_start ( args , format ) ;
2005-06-16 03:58:47 +04:00
vsyslog ( priority , format , args ) ;
2005-06-05 06:41:09 +04:00
va_end ( args ) ;
}
# endif
int main ( int argc , char * argv [ ] , char * envp [ ] )
{
static struct udevd_msg usend_msg ;
struct sockaddr_un saddr ;
socklen_t addrlen ;
2005-06-16 03:58:47 +04:00
const char * env ;
2005-06-16 05:22:27 +04:00
const char * val ;
int * intval ;
2005-08-11 22:34:24 +04:00
int i ;
2005-06-05 06:41:09 +04:00
int retval = 1 ;
2005-06-16 03:58:47 +04:00
env = getenv ( " UDEV_LOG " ) ;
if ( env )
2005-10-27 22:32:07 +04:00
udev_log = log_priority ( env ) ;
2005-06-16 03:58:47 +04:00
2005-06-05 06:41:09 +04:00
logging_init ( " udevcontrol " ) ;
dbg ( " version %s " , UDEV_VERSION ) ;
2005-08-11 22:34:24 +04:00
if ( argc < 2 ) {
fprintf ( stderr , " missing command \n \n " ) ;
2005-06-05 06:41:09 +04:00
goto exit ;
}
memset ( & usend_msg , 0x00 , sizeof ( struct udevd_msg ) ) ;
strcpy ( usend_msg . magic , UDEV_MAGIC ) ;
2005-08-11 22:34:24 +04:00
for ( i = 1 ; i < argc ; i + + ) {
char * arg = argv [ i ] ;
if ( ! strcmp ( arg , " stop_exec_queue " ) )
usend_msg . type = UDEVD_STOP_EXEC_QUEUE ;
else if ( ! strcmp ( arg , " start_exec_queue " ) )
usend_msg . type = UDEVD_START_EXEC_QUEUE ;
else if ( ! strncmp ( arg , " log_priority= " , strlen ( " log_priority= " ) ) ) {
intval = ( int * ) usend_msg . envbuf ;
val = & arg [ strlen ( " log_priority= " ) ] ;
usend_msg . type = UDEVD_SET_LOG_LEVEL ;
* intval = log_priority ( val ) ;
info ( " send log_priority=%i " , * intval ) ;
} else if ( ! strncmp ( arg , " max_childs= " , strlen ( " max_childs= " ) ) ) {
intval = ( int * ) usend_msg . envbuf ;
val = & arg [ strlen ( " max_childs= " ) ] ;
usend_msg . type = UDEVD_SET_MAX_CHILDS ;
* intval = atoi ( val ) ;
info ( " send max_childs=%i " , * intval ) ;
} else if ( strcmp ( arg , " help " ) = = 0 | | strcmp ( arg , " --help " ) = = 0 | | strcmp ( arg , " -h " ) = = 0 ) {
printf ( " Usage: udevcontrol 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 "
" max_childs=<N> maximum number of childs running at the same time \n "
" --help print this help text \n \n " ) ;
exit ( 0 ) ;
} else {
fprintf ( stderr , " unknown option \n \n " ) ;
exit ( 1 ) ;
}
}
if ( getuid ( ) ! = 0 ) {
fprintf ( stderr , " need to be root, exit \n \n " ) ;
exit ( 1 ) ;
2005-06-05 06:41:09 +04:00
}
sock = socket ( AF_LOCAL , SOCK_DGRAM , 0 ) ;
if ( sock = = - 1 ) {
2005-06-16 05:22:27 +04:00
err ( " error getting socket " ) ;
2005-06-05 06:41:09 +04:00
goto exit ;
}
memset ( & saddr , 0x00 , sizeof ( struct sockaddr_un ) ) ;
saddr . sun_family = AF_LOCAL ;
/* use abstract namespace for socket path */
strcpy ( & saddr . sun_path [ 1 ] , UDEVD_SOCK_PATH ) ;
addrlen = offsetof ( struct sockaddr_un , sun_path ) + strlen ( saddr . sun_path + 1 ) + 1 ;
retval = sendto ( sock , & usend_msg , sizeof ( usend_msg ) , 0 , ( struct sockaddr * ) & saddr , addrlen ) ;
2005-06-14 00:38:42 +04:00
if ( retval = = - 1 ) {
2005-06-05 06:41:09 +04:00
info ( " error sending message (%s) " , strerror ( errno ) ) ;
2005-06-14 00:38:42 +04:00
retval = 1 ;
} else {
2005-06-16 05:22:27 +04:00
dbg ( " sent message type=0x%02x, %u bytes sent " , usend_msg . type , retval ) ;
2005-06-14 00:38:42 +04:00
retval = 0 ;
}
2005-06-05 06:41:09 +04:00
close ( sock ) ;
exit :
logging_close ( ) ;
return retval ;
}