2005-04-27 07:59:47 +04: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 21:53:46 +04:00
# include <stdio.h>
# include <fcntl.h>
# include <unistd.h>
# include <errno.h>
2003-12-03 12:08:46 +03:00
# include <ctype.h>
2003-04-10 21:53:46 +04:00
2005-04-27 07:59:47 +04:00
# include "udev.h"
# include "udev_version.h"
2003-07-17 12:24:51 +04:00
# include "namedev.h"
2003-10-15 10:20:53 +04:00
# include "udevdb.h"
2003-07-19 16:06:55 +04:00
# include "libsysfs/libsysfs.h"
2005-04-27 07:59:47 +04:00
2003-10-22 07:19:09 +04:00
/* global variables */
char * * main_argv ;
char * * main_envp ;
static inline char * get_action ( void )
2005-04-27 07:59:47 +04:00
{
char * action ;
action = getenv ( " ACTION " ) ;
return action ;
}
2003-10-22 07:19:09 +04:00
static inline char * get_devpath ( void )
{
char * devpath ;
devpath = getenv ( " DEVPATH " ) ;
return devpath ;
}
2005-04-27 07:59:47 +04:00
2003-10-22 07:19:09 +04:00
static inline char * get_seqnum ( void )
2005-04-27 07:59:47 +04:00
{
2003-10-22 07:19:09 +04:00
char * seqnum ;
2005-04-27 07:59:47 +04:00
2003-10-22 07:19:09 +04:00
seqnum = getenv ( " SEQNUM " ) ;
return seqnum ;
2005-04-27 07:59:47 +04:00
}
[PATCH] D-BUS patch for udev-008
Attached is a patch against udev-008 to send out a D-BUS message when a
device node is added or removed.
Using D-BUS lingo, udev acquires the org.kernel.udev service and sends
out a NodeCreated or NodeDeleted signal on the
org.kernel.udev.NodeMonitor interface. Each signal carries two
parameters: the node in question and the corresponding sysfs path.
[Note: the D-BUS concepts of service, interface, object can be a bit
confusing at first glance]
An example program listening for these messages looks like this
#!/usr/bin/python
import dbus
import gtk
def udev_signal_received(dbus_iface, member, service, object_path, message):
[filename, sysfs_path] = message.get_args_list()
if member=='NodeCreated':
print 'Node %s created for %s'%(filename, sysfs_path)
elif member=='NodeDeleted':
print 'Node %s deleted for %s'%(filename, sysfs_path)
def main():
bus = dbus.Bus(dbus.Bus.TYPE_SYSTEM)
bus.add_signal_receiver(udev_signal_received,
'org.kernel.udev.NodeMonitor', # interface
'org.kernel.udev', # service
'/org/kernel/udev/NodeMonitor') # object
gtk.mainloop()
if __name__ == '__main__':
main()
and this is the output when hot-plugging some usb-storage.
[david@laptop udev-008]$ ~/node_monitor.py
Node /udev/sda created for /block/sda
Node /udev/sda1 created for /block/sda/sda1
Node /udev/sda1 deleted for /block/sda/sda1
Node /udev/sda deleted for /block/sda
The patch requires D-BUS 0.20 or later while the python example program
requires D-BUS from CVS as I only recently applied a patch against the
python bindings.
2003-12-08 20:19:19 +03:00
# ifdef USE_DBUS
/** Global variable for the connection the to system message bus or #NULL
* if we cannot connect or acquire the org . kernel . udev service
*/
DBusConnection * sysbus_connection ;
/** Disconnect from the system message bus */
static void sysbus_disconnect ( )
{
if ( sysbus_connection = = NULL )
return ;
dbus_connection_disconnect ( sysbus_connection ) ;
sysbus_connection = NULL ;
}
/** Connect to the system message bus */
static void sysbus_connect ( )
{
DBusError error ;
/* Connect to a well-known bus instance, the system bus */
dbus_error_init ( & error ) ;
sysbus_connection = dbus_bus_get ( DBUS_BUS_SYSTEM , & error ) ;
if ( sysbus_connection = = NULL ) {
dbg ( " cannot connect to system message bus, error %s: %s " ,
error . name , error . message ) ;
dbus_error_free ( & error ) ;
return ;
}
/* Acquire the org.kernel.udev service such that listeners
* know that the message is really from us and not from a
* random attacker . See the file udev_sysbus_policy . conf for
* details .
*
* Note that a service can have multiple owners ( though there
* is a concept of a primary owner for reception of messages )
* so no race is introduced if two copies of udev is running
* at the same time .
*/
dbus_bus_acquire_service ( sysbus_connection , " org.kernel.udev " , 0 ,
& error ) ;
if ( dbus_error_is_set ( & error ) ) {
printf ( " cannot acquire org.kernel.udev service, error %s: %s' " ,
error . name , error . message ) ;
sysbus_disconnect ( ) ;
return ;
}
}
# endif /* USE_DBUS */
2003-10-15 10:32:17 +04:00
int main ( int argc , char * * argv , char * * envp )
2005-04-27 07:59:47 +04:00
{
char * action ;
2003-10-22 07:19:09 +04:00
char * devpath ;
2003-07-21 07:48:48 +04:00
char * subsystem ;
2003-04-10 21:53:46 +04:00
int retval = - EINVAL ;
2005-04-27 07:59:47 +04:00
2003-10-15 10:32:17 +04:00
main_argv = argv ;
main_envp = envp ;
2003-10-16 10:51:27 +04:00
dbg ( " version %s " , UDEV_VERSION ) ;
2005-04-27 07:59:47 +04:00
if ( argc ! = 2 ) {
dbg ( " unknown number of arguments " ) ;
2003-04-10 21:53:46 +04:00
goto exit ;
2005-04-27 07:59:47 +04:00
}
2003-07-21 07:48:48 +04:00
subsystem = argv [ 1 ] ;
2003-10-22 07:19:09 +04:00
devpath = get_devpath ( ) ;
if ( ! devpath ) {
dbg ( " no devpath? " ) ;
2003-07-19 16:06:55 +04:00
goto exit ;
}
2003-11-25 09:27:17 +03:00
dbg ( " looking at '%s' " , devpath ) ;
2003-07-17 12:24:51 +04:00
2003-07-19 16:06:55 +04:00
/* we only care about class devices and block stuff */
2003-10-22 07:19:09 +04:00
if ( ! strstr ( devpath , " class " ) & &
! strstr ( devpath , " block " ) ) {
2003-11-25 09:27:17 +03:00
dbg ( " not a block or class device " ) ;
2003-07-19 16:06:55 +04:00
goto exit ;
}
2003-07-17 07:18:06 +04:00
2003-07-21 07:48:48 +04: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-27 07:59:47 +04:00
action = get_action ( ) ;
if ( ! action ) {
dbg ( " no action? " ) ;
2003-04-10 21:53:46 +04:00
goto exit ;
2005-04-27 07:59:47 +04:00
}
2003-12-03 12:08:46 +03:00
/* initialize our configuration */
udev_init_config ( ) ;
[PATCH] D-BUS patch for udev-008
Attached is a patch against udev-008 to send out a D-BUS message when a
device node is added or removed.
Using D-BUS lingo, udev acquires the org.kernel.udev service and sends
out a NodeCreated or NodeDeleted signal on the
org.kernel.udev.NodeMonitor interface. Each signal carries two
parameters: the node in question and the corresponding sysfs path.
[Note: the D-BUS concepts of service, interface, object can be a bit
confusing at first glance]
An example program listening for these messages looks like this
#!/usr/bin/python
import dbus
import gtk
def udev_signal_received(dbus_iface, member, service, object_path, message):
[filename, sysfs_path] = message.get_args_list()
if member=='NodeCreated':
print 'Node %s created for %s'%(filename, sysfs_path)
elif member=='NodeDeleted':
print 'Node %s deleted for %s'%(filename, sysfs_path)
def main():
bus = dbus.Bus(dbus.Bus.TYPE_SYSTEM)
bus.add_signal_receiver(udev_signal_received,
'org.kernel.udev.NodeMonitor', # interface
'org.kernel.udev', # service
'/org/kernel/udev/NodeMonitor') # object
gtk.mainloop()
if __name__ == '__main__':
main()
and this is the output when hot-plugging some usb-storage.
[david@laptop udev-008]$ ~/node_monitor.py
Node /udev/sda created for /block/sda
Node /udev/sda1 created for /block/sda/sda1
Node /udev/sda1 deleted for /block/sda/sda1
Node /udev/sda deleted for /block/sda
The patch requires D-BUS 0.20 or later while the python example program
requires D-BUS from CVS as I only recently applied a patch against the
python bindings.
2003-12-08 20:19:19 +03:00
# ifdef USE_DBUS
/* connect to the system message bus */
sysbus_connect ( ) ;
# endif /* USE_DBUS */
2003-10-15 10:20:53 +04:00
/* initialize udev database */
retval = udevdb_init ( UDEVDB_DEFAULT ) ;
if ( retval ! = 0 ) {
2003-11-25 09:27:17 +03:00
dbg ( " unable to initialize database " ) ;
2003-10-15 10:20:53 +04:00
goto exit ;
}
2003-07-21 07:48:48 +04:00
/* initialize the naming deamon */
namedev_init ( ) ;
2003-04-10 22:02:32 +04:00
if ( strcmp ( action , " add " ) = = 0 )
2003-10-22 07:19:09 +04:00
retval = udev_add_device ( devpath , subsystem ) ;
2003-04-10 21:53:46 +04:00
2003-10-15 10:20:53 +04:00
else if ( strcmp ( action , " remove " ) = = 0 )
2003-10-22 07:19:09 +04:00
retval = udev_remove_device ( devpath , subsystem ) ;
2003-04-10 21:53:46 +04:00
2003-10-15 10:20:53 +04:00
else {
2003-11-25 09:27:17 +03:00
dbg ( " unknown action '%s' " , action ) ;
2003-10-15 10:20:53 +04:00
retval = - EINVAL ;
}
udevdb_exit ( ) ;
2003-04-10 21:53:46 +04:00
[PATCH] D-BUS patch for udev-008
Attached is a patch against udev-008 to send out a D-BUS message when a
device node is added or removed.
Using D-BUS lingo, udev acquires the org.kernel.udev service and sends
out a NodeCreated or NodeDeleted signal on the
org.kernel.udev.NodeMonitor interface. Each signal carries two
parameters: the node in question and the corresponding sysfs path.
[Note: the D-BUS concepts of service, interface, object can be a bit
confusing at first glance]
An example program listening for these messages looks like this
#!/usr/bin/python
import dbus
import gtk
def udev_signal_received(dbus_iface, member, service, object_path, message):
[filename, sysfs_path] = message.get_args_list()
if member=='NodeCreated':
print 'Node %s created for %s'%(filename, sysfs_path)
elif member=='NodeDeleted':
print 'Node %s deleted for %s'%(filename, sysfs_path)
def main():
bus = dbus.Bus(dbus.Bus.TYPE_SYSTEM)
bus.add_signal_receiver(udev_signal_received,
'org.kernel.udev.NodeMonitor', # interface
'org.kernel.udev', # service
'/org/kernel/udev/NodeMonitor') # object
gtk.mainloop()
if __name__ == '__main__':
main()
and this is the output when hot-plugging some usb-storage.
[david@laptop udev-008]$ ~/node_monitor.py
Node /udev/sda created for /block/sda
Node /udev/sda1 created for /block/sda/sda1
Node /udev/sda1 deleted for /block/sda/sda1
Node /udev/sda deleted for /block/sda
The patch requires D-BUS 0.20 or later while the python example program
requires D-BUS from CVS as I only recently applied a patch against the
python bindings.
2003-12-08 20:19:19 +03:00
# ifdef USE_DBUS
/* disconnect from the system message bus */
sysbus_disconnect ( ) ;
# endif /* USE_DBUS */
2003-04-10 21:53:46 +04:00
exit :
return retval ;
2005-04-27 07:59:47 +04:00
}