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-06-16 03:58:47 +04:00
static int 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-06-16 03:58:47 +04:00
if ( priority > log )
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-06-05 06:41:09 +04:00
int retval = 1 ;
2005-06-16 03:58:47 +04:00
env = getenv ( " UDEV_LOG " ) ;
if ( env )
log = log_priority ( env ) ;
2005-06-05 06:41:09 +04:00
logging_init ( " udevcontrol " ) ;
dbg ( " version %s " , UDEV_VERSION ) ;
if ( argc ! = 2 ) {
2005-06-16 05:22:27 +04:00
err ( " error finding comand " ) ;
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-06-16 03:58:47 +04:00
if ( ! strcmp ( argv [ 1 ] , " stop_exec_queue " ) )
2005-06-05 06:41:09 +04:00
usend_msg . type = UDEVD_STOP_EXEC_QUEUE ;
2005-06-16 03:58:47 +04:00
else if ( ! strcmp ( argv [ 1 ] , " start_exec_queue " ) )
2005-06-05 06:41:09 +04:00
usend_msg . type = UDEVD_START_EXEC_QUEUE ;
2005-06-16 03:58:47 +04:00
else if ( ! strncmp ( argv [ 1 ] , " log_priority= " , strlen ( " log_priority= " ) ) ) {
2005-06-16 05:22:27 +04:00
intval = ( int * ) usend_msg . envbuf ;
val = & argv [ 1 ] [ strlen ( " log_priority= " ) ] ;
2005-06-16 03:58:47 +04:00
usend_msg . type = UDEVD_SET_LOG_LEVEL ;
2005-06-16 05:22:27 +04:00
* intval = log_priority ( val ) ;
info ( " send log_priority=%i " , * intval ) ;
} else if ( ! strncmp ( argv [ 1 ] , " max_childs= " , strlen ( " max_childs= " ) ) ) {
intval = ( int * ) usend_msg . envbuf ;
val = & argv [ 1 ] [ strlen ( " max_childs= " ) ] ;
usend_msg . type = UDEVD_SET_MAX_CHILDS ;
* intval = atoi ( val ) ;
info ( " send max_childs=%i " , * intval ) ;
2005-06-16 03:58:47 +04:00
} else {
2005-06-16 05:22:27 +04:00
err ( " error parsing command \n " ) ;
2005-06-05 06:41:09 +04:00
goto exit ;
}
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 ;
}