2005-04-26 20:59:47 -07:00
/*
* udev . c
*
* Userspace devfs
*
* Copyright ( C ) 2003 Greg Kroah - Hartman < greg @ kroah . com >
*
*
* 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 <stdlib.h>
# include <string.h>
2003-04-10 10:53:46 -07:00
# include <stdio.h>
# include <fcntl.h>
# include <unistd.h>
# include <errno.h>
2003-12-03 01:08:46 -08:00
# include <ctype.h>
2003-04-10 10:53:46 -07:00
2005-04-26 20:59:47 -07:00
# include "udev.h"
# include "udev_version.h"
2003-07-17 01:24:51 -07:00
# include "namedev.h"
2003-10-14 23:20:53 -07:00
# include "udevdb.h"
2003-07-19 05:06:55 -07:00
# include "libsysfs/libsysfs.h"
2005-04-26 20:59:47 -07:00
2003-10-21 20:19:09 -07:00
/* global variables */
char * * main_argv ;
char * * main_envp ;
static inline char * get_action ( void )
2005-04-26 20:59:47 -07:00
{
char * action ;
action = getenv ( " ACTION " ) ;
return action ;
}
2003-10-21 20:19:09 -07:00
static inline char * get_devpath ( void )
{
char * devpath ;
devpath = getenv ( " DEVPATH " ) ;
return devpath ;
}
2005-04-26 20:59:47 -07:00
2003-10-21 20:19:09 -07:00
static inline char * get_seqnum ( void )
2005-04-26 20:59:47 -07:00
{
2003-10-21 20:19:09 -07:00
char * seqnum ;
2005-04-26 20:59:47 -07:00
2003-10-21 20:19:09 -07:00
seqnum = getenv ( " SEQNUM " ) ;
return seqnum ;
2005-04-26 20:59:47 -07:00
}
2003-10-14 23:32:17 -07:00
int main ( int argc , char * * argv , char * * envp )
2005-04-26 20:59:47 -07:00
{
char * action ;
2003-10-21 20:19:09 -07:00
char * devpath ;
2003-07-20 20:48:48 -07:00
char * subsystem ;
2003-04-10 10:53:46 -07:00
int retval = - EINVAL ;
2005-04-26 20:59:47 -07:00
2003-10-14 23:32:17 -07:00
main_argv = argv ;
main_envp = envp ;
2003-10-15 23:51:27 -07:00
dbg ( " version %s " , UDEV_VERSION ) ;
2005-04-26 20:59:47 -07:00
if ( argc ! = 2 ) {
dbg ( " unknown number of arguments " ) ;
2003-04-10 10:53:46 -07:00
goto exit ;
2005-04-26 20:59:47 -07:00
}
2003-07-20 20:48:48 -07:00
subsystem = argv [ 1 ] ;
2003-10-21 20:19:09 -07:00
devpath = get_devpath ( ) ;
if ( ! devpath ) {
dbg ( " no devpath? " ) ;
2003-07-19 05:06:55 -07:00
goto exit ;
}
2003-11-24 22:27:17 -08:00
dbg ( " looking at '%s' " , devpath ) ;
2003-07-17 01:24:51 -07:00
2003-07-19 05:06:55 -07:00
/* we only care about class devices and block stuff */
2003-10-21 20:19:09 -07:00
if ( ! strstr ( devpath , " class " ) & &
! strstr ( devpath , " block " ) ) {
2003-11-24 22:27:17 -08:00
dbg ( " not a block or class device " ) ;
2003-07-19 05:06:55 -07:00
goto exit ;
}
2003-07-16 20:18:06 -07:00
2003-07-20 20:48:48 -07:00
/* but we don't care about net class devices */
if ( strcmp ( subsystem , " net " ) = = 0 ) {
dbg ( " don't care about net devices " ) ;
goto exit ;
}
2005-04-26 20:59:47 -07:00
action = get_action ( ) ;
if ( ! action ) {
dbg ( " no action? " ) ;
2003-04-10 10:53:46 -07:00
goto exit ;
2005-04-26 20:59:47 -07:00
}
2003-12-03 01:08:46 -08:00
/* initialize our configuration */
udev_init_config ( ) ;
2003-10-14 23:20:53 -07:00
/* initialize udev database */
retval = udevdb_init ( UDEVDB_DEFAULT ) ;
if ( retval ! = 0 ) {
2003-11-24 22:27:17 -08:00
dbg ( " unable to initialize database " ) ;
2003-10-14 23:20:53 -07:00
goto exit ;
}
2003-07-20 20:48:48 -07:00
/* initialize the naming deamon */
namedev_init ( ) ;
2003-04-10 11:02:32 -07:00
if ( strcmp ( action , " add " ) = = 0 )
2003-10-21 20:19:09 -07:00
retval = udev_add_device ( devpath , subsystem ) ;
2003-04-10 10:53:46 -07:00
2003-10-14 23:20:53 -07:00
else if ( strcmp ( action , " remove " ) = = 0 )
2003-10-21 20:19:09 -07:00
retval = udev_remove_device ( devpath , subsystem ) ;
2003-04-10 10:53:46 -07:00
2003-10-14 23:20:53 -07:00
else {
2003-11-24 22:27:17 -08:00
dbg ( " unknown action '%s' " , action ) ;
2003-10-14 23:20:53 -07:00
retval = - EINVAL ;
}
udevdb_exit ( ) ;
2003-04-10 10:53:46 -07:00
exit :
return retval ;
2005-04-26 20:59:47 -07:00
}