2003-07-17 12:24:51 +04:00
/*
2005-03-13 00:36:32 +03:00
* udev_rules . c
2003-07-17 12:24:51 +04:00
*
* Copyright ( C ) 2003 Greg Kroah - Hartman < greg @ kroah . com >
2005-02-14 08:03:06 +03:00
* Copyright ( C ) 2003 - 2005 Kay Sievers < kay . sievers @ vrfy . org >
2003-07-17 12:24:51 +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 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 <stddef.h>
# include <stdlib.h>
# include <string.h>
# include <stdio.h>
# include <fcntl.h>
# include <ctype.h>
# include <unistd.h>
# include <errno.h>
2005-08-11 19:32:59 +04:00
# include <syslog.h>
2003-10-15 10:32:17 +04:00
# include <sys/wait.h>
2005-07-08 01:01:04 +04:00
# include <sys/stat.h>
2003-07-17 12:24:51 +04:00
2004-02-24 06:07:25 +03:00
# include "libsysfs/sysfs/libsysfs.h"
2003-07-17 12:24:51 +04:00
# include "list.h"
2005-03-07 06:29:43 +03:00
# include "udev_libc_wrapper.h"
2003-07-17 12:24:51 +04:00
# include "udev.h"
2004-11-25 04:44:38 +03:00
# include "udev_utils.h"
2003-07-17 12:24:51 +04:00
# include "udev_version.h"
[PATCH] add udev logging to info log
On Thu, Jan 15, 2004 at 05:14:16AM +0100, Kay Sievers wrote:
> On Wed, Jan 14, 2004 at 01:10:43PM -0800, Greg KH wrote:
> > On Wed, Jan 14, 2004 at 02:34:26PM -0600, Clay Haapala wrote:
> > > On Wed, 14 Jan 2004, Chris Friesen spake thusly:
> > > >
> > > > Maybe for ones with a matching rule, you could print something like:
> > > >
> > > >
> > > Is the act of printing/syslogging a rule in an of itself?
> >
> > No, as currently the only way stuff ends up in the syslog is if
> > DEBUG=true is used on the build line.
> >
> > But it's sounding like we might want to change that... :)
>
> How about this in the syslog after connect/disconnect?
>
> Jan 15 05:07:45 pim udev[28007]: configured rule in '/etc/udev/udev.rules' at line 17 applied, 'video*' becomes 'video/webcam%n'
> Jan 15 05:07:45 pim udev[28007]: creating device node '/udev/video/webcam0'
> Jan 15 05:07:47 pim udev[28015]: removing device node '/udev/video/webcam0'
Here is a slightly better version. I've created a logging.h file and
moved the debug macros from udev.h in there.
If you type:
'make' - you will get a binary that prints one or two lines to syslog
if a device node is created or deleted
'make LOG=false' - you get a binary that prints asolutely nothing
'make DEBUG=true' - the same as today, it will print all debug lines
2004-01-16 08:53:20 +03:00
# include "logging.h"
2005-03-13 00:36:32 +03:00
# include "udev_rules.h"
2004-11-12 08:32:19 +03:00
# include "udev_db.h"
2003-07-17 12:24:51 +04:00
[PATCH] Adding '%s' format specifier to NAME and SYMLINK
On Thu, Feb 12, 2004 at 05:34:57PM -0800, Greg KH wrote:
> On Tue, Feb 10, 2004 at 09:14:20AM +0100, Hannes Reinecke wrote:
> > Hi all,
> >
> > this patch makes the format for NAME and SYMLINK a bit more flexible:
> > I've added a new format specifier '%s{<SYSFS_var>}', which allows for
> > the value of any sysfs entry found for this device to be inserted.
> > Example (for our S/390 fcp adapter):
> >
> > BUS="ccw", SYSFS_devtype="1732/03", NAME="%k" \
> > SYMLINK="zfcp-%s{hba_id}-%s{wwpn}:%s{fcp_lun}"
> >
> > I know this could also be done with an external program, but having this
> > incorporated into udev makes life easier, especially if run from
> > initramfs. Plus it makes the rules easier to follow, as the result is
> > directly visible and need not to be looked up in some external program.
> >
> > Comments etc. welcome.
>
> Oops, sorry I missed this for the 017 release. I'll look at it tomorrow
> and get back to you. At first glance it looks like a good thing.
>
> Oh, you forgot to update the documentation, that's important to do if
> you want this change to make it in :)
I took a part of the code and made a version that uses already implemented
attribute finding logic.
The parsing of the format length '%3x' and the '%x{attribute}' is a fuction now,
maybe there are more possible users in the future.
I've also added the test to udev-test.pl.
2004-02-17 08:36:34 +03:00
/* extract possible {attr} and move str behind it */
static char * get_format_attribute ( char * * str )
{
char * pos ;
char * attr = NULL ;
if ( * str [ 0 ] = = ' { ' ) {
pos = strchr ( * str , ' } ' ) ;
if ( pos = = NULL ) {
2005-03-27 03:11:03 +04:00
err ( " missing closing brace for format " ) ;
[PATCH] Adding '%s' format specifier to NAME and SYMLINK
On Thu, Feb 12, 2004 at 05:34:57PM -0800, Greg KH wrote:
> On Tue, Feb 10, 2004 at 09:14:20AM +0100, Hannes Reinecke wrote:
> > Hi all,
> >
> > this patch makes the format for NAME and SYMLINK a bit more flexible:
> > I've added a new format specifier '%s{<SYSFS_var>}', which allows for
> > the value of any sysfs entry found for this device to be inserted.
> > Example (for our S/390 fcp adapter):
> >
> > BUS="ccw", SYSFS_devtype="1732/03", NAME="%k" \
> > SYMLINK="zfcp-%s{hba_id}-%s{wwpn}:%s{fcp_lun}"
> >
> > I know this could also be done with an external program, but having this
> > incorporated into udev makes life easier, especially if run from
> > initramfs. Plus it makes the rules easier to follow, as the result is
> > directly visible and need not to be looked up in some external program.
> >
> > Comments etc. welcome.
>
> Oops, sorry I missed this for the 017 release. I'll look at it tomorrow
> and get back to you. At first glance it looks like a good thing.
>
> Oh, you forgot to update the documentation, that's important to do if
> you want this change to make it in :)
I took a part of the code and made a version that uses already implemented
attribute finding logic.
The parsing of the format length '%3x' and the '%x{attribute}' is a fuction now,
maybe there are more possible users in the future.
I've also added the test to udev-test.pl.
2004-02-17 08:36:34 +03:00
return NULL ;
}
pos [ 0 ] = ' \0 ' ;
attr = * str + 1 ;
* str = pos + 1 ;
dbg ( " attribute='%s', str='%s' " , attr , * str ) ;
}
return attr ;
}
/* extract possible format length and move str behind it*/
static int get_format_len ( char * * str )
{
int num ;
char * tail ;
if ( isdigit ( * str [ 0 ] ) ) {
num = ( int ) strtoul ( * str , & tail , 10 ) ;
2004-03-02 10:17:59 +03:00
if ( num > 0 ) {
[PATCH] Adding '%s' format specifier to NAME and SYMLINK
On Thu, Feb 12, 2004 at 05:34:57PM -0800, Greg KH wrote:
> On Tue, Feb 10, 2004 at 09:14:20AM +0100, Hannes Reinecke wrote:
> > Hi all,
> >
> > this patch makes the format for NAME and SYMLINK a bit more flexible:
> > I've added a new format specifier '%s{<SYSFS_var>}', which allows for
> > the value of any sysfs entry found for this device to be inserted.
> > Example (for our S/390 fcp adapter):
> >
> > BUS="ccw", SYSFS_devtype="1732/03", NAME="%k" \
> > SYMLINK="zfcp-%s{hba_id}-%s{wwpn}:%s{fcp_lun}"
> >
> > I know this could also be done with an external program, but having this
> > incorporated into udev makes life easier, especially if run from
> > initramfs. Plus it makes the rules easier to follow, as the result is
> > directly visible and need not to be looked up in some external program.
> >
> > Comments etc. welcome.
>
> Oops, sorry I missed this for the 017 release. I'll look at it tomorrow
> and get back to you. At first glance it looks like a good thing.
>
> Oh, you forgot to update the documentation, that's important to do if
> you want this change to make it in :)
I took a part of the code and made a version that uses already implemented
attribute finding logic.
The parsing of the format length '%3x' and the '%x{attribute}' is a fuction now,
maybe there are more possible users in the future.
I've also added the test to udev-test.pl.
2004-02-17 08:36:34 +03:00
* str = tail ;
dbg ( " format length=%i " , num ) ;
return num ;
} else {
2005-03-27 03:11:03 +04:00
err ( " format parsing error '%s' " , * str ) ;
[PATCH] Adding '%s' format specifier to NAME and SYMLINK
On Thu, Feb 12, 2004 at 05:34:57PM -0800, Greg KH wrote:
> On Tue, Feb 10, 2004 at 09:14:20AM +0100, Hannes Reinecke wrote:
> > Hi all,
> >
> > this patch makes the format for NAME and SYMLINK a bit more flexible:
> > I've added a new format specifier '%s{<SYSFS_var>}', which allows for
> > the value of any sysfs entry found for this device to be inserted.
> > Example (for our S/390 fcp adapter):
> >
> > BUS="ccw", SYSFS_devtype="1732/03", NAME="%k" \
> > SYMLINK="zfcp-%s{hba_id}-%s{wwpn}:%s{fcp_lun}"
> >
> > I know this could also be done with an external program, but having this
> > incorporated into udev makes life easier, especially if run from
> > initramfs. Plus it makes the rules easier to follow, as the result is
> > directly visible and need not to be looked up in some external program.
> >
> > Comments etc. welcome.
>
> Oops, sorry I missed this for the 017 release. I'll look at it tomorrow
> and get back to you. At first glance it looks like a good thing.
>
> Oh, you forgot to update the documentation, that's important to do if
> you want this change to make it in :)
I took a part of the code and made a version that uses already implemented
attribute finding logic.
The parsing of the format length '%3x' and the '%x{attribute}' is a fuction now,
maybe there are more possible users in the future.
I've also added the test to udev-test.pl.
2004-02-17 08:36:34 +03:00
}
}
return - 1 ;
}
2005-06-25 15:10:16 +04:00
static int get_key ( char * * line , char * * key , char * * value )
{
char * linepos ;
char * temp ;
linepos = * line ;
if ( ! linepos )
return - 1 ;
if ( strchr ( linepos , ' \\ ' ) ) {
dbg ( " escaped characters are not supported, skip " ) ;
return - 1 ;
}
/* skip whitespace */
while ( isspace ( linepos [ 0 ] ) )
linepos + + ;
/* get the key */
* key = linepos ;
while ( 1 ) {
linepos + + ;
if ( linepos [ 0 ] = = ' \0 ' )
return - 1 ;
if ( isspace ( linepos [ 0 ] ) )
break ;
if ( linepos [ 0 ] = = ' = ' )
break ;
}
/* terminate key */
linepos [ 0 ] = ' \0 ' ;
linepos + + ;
/* skip whitespace */
while ( isspace ( linepos [ 0 ] ) )
linepos + + ;
/* get the value*/
if ( linepos [ 0 ] = = ' " ' ) {
linepos + + ;
temp = strchr ( linepos , ' " ' ) ;
2005-06-26 20:55:24 +04:00
if ( ! temp ) {
dbg ( " missing closing quote " ) ;
2005-06-25 15:10:16 +04:00
return - 1 ;
2005-06-26 20:55:24 +04:00
}
dbg ( " value is quoted " ) ;
2005-06-25 15:10:16 +04:00
temp [ 0 ] = ' \0 ' ;
} else if ( linepos [ 0 ] = = ' \' ' ) {
linepos + + ;
temp = strchr ( linepos , ' \' ' ) ;
2005-06-26 20:55:24 +04:00
if ( ! temp ) {
dbg ( " missing closing quote " ) ;
2005-06-25 15:10:16 +04:00
return - 1 ;
2005-06-26 20:55:24 +04:00
}
dbg ( " value is quoted " ) ;
2005-06-25 15:10:16 +04:00
temp [ 0 ] = ' \0 ' ;
2005-06-26 20:55:24 +04:00
} else if ( linepos [ 0 ] = = ' \0 ' ) {
dbg ( " value is empty " ) ;
2005-06-25 15:10:16 +04:00
} else {
temp = linepos ;
while ( temp [ 0 ] & & ! isspace ( temp [ 0 ] ) )
temp + + ;
temp [ 0 ] = ' \0 ' ;
}
* value = linepos ;
return 0 ;
}
2005-06-26 20:55:24 +04:00
static int import_keys_into_env ( struct udevice * udev , const char * buf , size_t bufsize )
2005-06-25 15:10:16 +04:00
{
char line [ LINE_SIZE ] ;
2005-06-25 17:35:14 +04:00
const char * bufline ;
2005-06-25 15:10:16 +04:00
char * linepos ;
char * variable ;
char * value ;
size_t cur ;
size_t count ;
int lineno ;
2005-06-26 20:55:24 +04:00
/* loop through the whole buffer */
2005-06-25 15:10:16 +04:00
lineno = 0 ;
cur = 0 ;
while ( cur < bufsize ) {
count = buf_get_line ( buf , bufsize , cur ) ;
bufline = & buf [ cur ] ;
cur + = count + 1 ;
lineno + + ;
if ( count > = sizeof ( line ) ) {
err ( " line too long, conf line skipped %s, line %d " , udev_config_filename , lineno ) ;
continue ;
}
/* eat the whitespace */
while ( ( count > 0 ) & & isspace ( bufline [ 0 ] ) ) {
bufline + + ;
count - - ;
}
if ( count = = 0 )
continue ;
/* see if this is a comment */
if ( bufline [ 0 ] = = COMMENT_CHARACTER )
continue ;
2005-08-08 04:21:55 +04:00
memcpy ( line , bufline , count ) ;
line [ count ] = ' \0 ' ;
2005-06-25 15:10:16 +04:00
linepos = line ;
if ( get_key ( & linepos , & variable , & value ) = = 0 ) {
2005-06-25 20:58:49 +04:00
dbg ( " import '%s=%s' " , variable , value ) ;
2005-06-26 20:55:24 +04:00
name_list_key_add ( & udev - > env_list , variable , value ) ;
2005-06-25 20:58:49 +04:00
setenv ( variable , value , 1 ) ;
2005-06-25 15:10:16 +04:00
}
}
2005-06-25 17:35:14 +04:00
return 0 ;
}
2005-06-26 20:55:24 +04:00
static int import_file_into_env ( struct udevice * udev , const char * filename )
2005-06-25 17:35:14 +04:00
{
char * buf ;
size_t bufsize ;
if ( file_map ( filename , & buf , & bufsize ) ! = 0 ) {
err ( " can't open '%s' " , filename ) ;
return - 1 ;
}
2005-06-26 20:55:24 +04:00
import_keys_into_env ( udev , buf , bufsize ) ;
2005-06-25 15:10:16 +04:00
file_unmap ( buf , bufsize ) ;
2005-06-25 17:35:14 +04:00
return 0 ;
2005-06-25 15:10:16 +04:00
}
2005-06-25 20:58:49 +04:00
static int import_program_into_env ( struct udevice * udev , const char * program )
{
char result [ 1024 ] ;
size_t reslen ;
2005-08-15 13:57:04 +04:00
if ( run_program ( program , udev - > subsystem , result , sizeof ( result ) , & reslen , ( udev_log_priority > = LOG_INFO ) ) ! = 0 )
2005-06-25 20:58:49 +04:00
return - 1 ;
2005-06-26 20:55:24 +04:00
return import_keys_into_env ( udev , result , reslen ) ;
2005-06-25 20:58:49 +04:00
}
2005-07-12 16:46:36 +04:00
static int import_parent_into_env ( struct udevice * udev , struct sysfs_class_device * class_dev , const char * filter )
{
struct sysfs_class_device * parent = sysfs_get_classdev_parent ( class_dev ) ;
int rc = - 1 ;
if ( parent ! = NULL ) {
struct udevice udev_parent ;
struct name_entry * name_loop ;
dbg ( " found parent '%s', get the node name " , parent - > path ) ;
udev_init_device ( & udev_parent , NULL , NULL , NULL ) ;
/* import the udev_db of the parent */
if ( udev_db_get_device ( & udev_parent , & parent - > path [ strlen ( sysfs_path ) ] ) = = 0 ) {
dbg ( " import stored parent env '%s' " , udev_parent . name ) ;
list_for_each_entry ( name_loop , & udev_parent . env_list , node ) {
char name [ NAME_SIZE ] ;
char * pos ;
strlcpy ( name , name_loop - > name , sizeof ( name ) ) ;
pos = strchr ( name , ' = ' ) ;
if ( pos ) {
pos [ 0 ] = ' \0 ' ;
pos + + ;
if ( strcmp_pattern ( filter , name ) = = 0 ) {
dbg ( " import key '%s' " , name_loop - > name ) ;
name_list_add ( & udev - > env_list , name_loop - > name , 0 ) ;
setenv ( name , pos , 1 ) ;
} else
dbg ( " skip key '%s' " , name_loop - > name ) ;
}
}
rc = 0 ;
} else
dbg ( " parent not found in database " ) ;
udev_cleanup_device ( & udev_parent ) ;
}
return rc ;
}
2005-06-25 20:58:49 +04:00
/* finds the lowest positive N such that <name>N isn't present in the udevdb
* if < name > doesn ' t exist , 0 is returned , N otherwise
[PATCH] compatibility symlinks for udev
On Mon, 2004-09-06 at 17:45 +0200, Kay Sievers wrote:
> On Mon, 2004-09-06 at 16:46 +0200, David Zeuthen wrote:
>
> Nice, I like it. It's a easy way to group device nodes of the same type,
> but coming from different kernel subsystems.
>
That's a good way of putting it, yeah.
> > Here's a patch against udev-030 that can help create compatibility
> > symlinks like /dev/cdrom, /dev/cdrom1 etc. The patch introduces a new
> > substitution type %C (for Compatibility) that can be used as follows
>
> I suggest using %e for enumeration here, cause "compatibility" can
> easily be misunderstood.
>
Good point, I've changed that.
> And we need a few lines added to the man page at udev.8.in :)
>
Done. I've also added an example.
Also, Kay pointed out offlist that the rules can be written to not
require a shell script; this actually works
KERNEL="sr*", NAME="%k", SYMLINK="cdrom%e"
KERNEL="scd*", NAME="%k", SYMLINK="cdrom%e"
KERNEL="pcd*", NAME="%k", SYMLINK="cdrom%e"
KERNEL="hd[a-z]", PROGRAM="/bin/cat /proc/ide/%k/media", RESULT="cdrom", NAME="\%k", SYMLINK="cdrom%e"
KERNEL="fd[0-9]", NAME="%k", SYMLINK="floppy%e"
KERNEL="hd[a-z]", PROGRAM="/bin/cat /proc/ide/%k/media", RESULT="floppy", NAME=\"%k", SYMLINK="floppy%e"
New patch is attached.
David
2004-09-11 08:04:13 +04:00
*/
2005-08-13 02:18:44 +04:00
static int find_free_number ( const char * name )
[PATCH] compatibility symlinks for udev
On Mon, 2004-09-06 at 17:45 +0200, Kay Sievers wrote:
> On Mon, 2004-09-06 at 16:46 +0200, David Zeuthen wrote:
>
> Nice, I like it. It's a easy way to group device nodes of the same type,
> but coming from different kernel subsystems.
>
That's a good way of putting it, yeah.
> > Here's a patch against udev-030 that can help create compatibility
> > symlinks like /dev/cdrom, /dev/cdrom1 etc. The patch introduces a new
> > substitution type %C (for Compatibility) that can be used as follows
>
> I suggest using %e for enumeration here, cause "compatibility" can
> easily be misunderstood.
>
Good point, I've changed that.
> And we need a few lines added to the man page at udev.8.in :)
>
Done. I've also added an example.
Also, Kay pointed out offlist that the rules can be written to not
require a shell script; this actually works
KERNEL="sr*", NAME="%k", SYMLINK="cdrom%e"
KERNEL="scd*", NAME="%k", SYMLINK="cdrom%e"
KERNEL="pcd*", NAME="%k", SYMLINK="cdrom%e"
KERNEL="hd[a-z]", PROGRAM="/bin/cat /proc/ide/%k/media", RESULT="cdrom", NAME="\%k", SYMLINK="cdrom%e"
KERNEL="fd[0-9]", NAME="%k", SYMLINK="floppy%e"
KERNEL="hd[a-z]", PROGRAM="/bin/cat /proc/ide/%k/media", RESULT="floppy", NAME=\"%k", SYMLINK="floppy%e"
New patch is attached.
David
2004-09-11 08:04:13 +04:00
{
2005-03-07 06:29:43 +03:00
char devpath [ PATH_SIZE ] ;
char filename [ PATH_SIZE ] ;
2004-11-06 16:28:01 +03:00
int num = 0 ;
[PATCH] compatibility symlinks for udev
On Mon, 2004-09-06 at 17:45 +0200, Kay Sievers wrote:
> On Mon, 2004-09-06 at 16:46 +0200, David Zeuthen wrote:
>
> Nice, I like it. It's a easy way to group device nodes of the same type,
> but coming from different kernel subsystems.
>
That's a good way of putting it, yeah.
> > Here's a patch against udev-030 that can help create compatibility
> > symlinks like /dev/cdrom, /dev/cdrom1 etc. The patch introduces a new
> > substitution type %C (for Compatibility) that can be used as follows
>
> I suggest using %e for enumeration here, cause "compatibility" can
> easily be misunderstood.
>
Good point, I've changed that.
> And we need a few lines added to the man page at udev.8.in :)
>
Done. I've also added an example.
Also, Kay pointed out offlist that the rules can be written to not
require a shell script; this actually works
KERNEL="sr*", NAME="%k", SYMLINK="cdrom%e"
KERNEL="scd*", NAME="%k", SYMLINK="cdrom%e"
KERNEL="pcd*", NAME="%k", SYMLINK="cdrom%e"
KERNEL="hd[a-z]", PROGRAM="/bin/cat /proc/ide/%k/media", RESULT="cdrom", NAME="\%k", SYMLINK="cdrom%e"
KERNEL="fd[0-9]", NAME="%k", SYMLINK="floppy%e"
KERNEL="hd[a-z]", PROGRAM="/bin/cat /proc/ide/%k/media", RESULT="floppy", NAME=\"%k", SYMLINK="floppy%e"
New patch is attached.
David
2004-09-11 08:04:13 +04:00
2005-03-07 06:29:43 +03:00
strlcpy ( filename , name , sizeof ( filename ) ) ;
[PATCH] compatibility symlinks for udev
On Mon, 2004-09-06 at 17:45 +0200, Kay Sievers wrote:
> On Mon, 2004-09-06 at 16:46 +0200, David Zeuthen wrote:
>
> Nice, I like it. It's a easy way to group device nodes of the same type,
> but coming from different kernel subsystems.
>
That's a good way of putting it, yeah.
> > Here's a patch against udev-030 that can help create compatibility
> > symlinks like /dev/cdrom, /dev/cdrom1 etc. The patch introduces a new
> > substitution type %C (for Compatibility) that can be used as follows
>
> I suggest using %e for enumeration here, cause "compatibility" can
> easily be misunderstood.
>
Good point, I've changed that.
> And we need a few lines added to the man page at udev.8.in :)
>
Done. I've also added an example.
Also, Kay pointed out offlist that the rules can be written to not
require a shell script; this actually works
KERNEL="sr*", NAME="%k", SYMLINK="cdrom%e"
KERNEL="scd*", NAME="%k", SYMLINK="cdrom%e"
KERNEL="pcd*", NAME="%k", SYMLINK="cdrom%e"
KERNEL="hd[a-z]", PROGRAM="/bin/cat /proc/ide/%k/media", RESULT="cdrom", NAME="\%k", SYMLINK="cdrom%e"
KERNEL="fd[0-9]", NAME="%k", SYMLINK="floppy%e"
KERNEL="hd[a-z]", PROGRAM="/bin/cat /proc/ide/%k/media", RESULT="floppy", NAME=\"%k", SYMLINK="floppy%e"
New patch is attached.
David
2004-09-11 08:04:13 +04:00
while ( 1 ) {
2004-11-06 16:28:01 +03:00
dbg ( " look for existing node '%s' " , filename ) ;
2005-03-07 06:29:43 +03:00
if ( udev_db_search_name ( devpath , sizeof ( devpath ) , filename ) ! = 0 ) {
2004-11-06 16:28:01 +03:00
dbg ( " free num=%d " , num ) ;
return num ;
}
[PATCH] compatibility symlinks for udev
On Mon, 2004-09-06 at 17:45 +0200, Kay Sievers wrote:
> On Mon, 2004-09-06 at 16:46 +0200, David Zeuthen wrote:
>
> Nice, I like it. It's a easy way to group device nodes of the same type,
> but coming from different kernel subsystems.
>
That's a good way of putting it, yeah.
> > Here's a patch against udev-030 that can help create compatibility
> > symlinks like /dev/cdrom, /dev/cdrom1 etc. The patch introduces a new
> > substitution type %C (for Compatibility) that can be used as follows
>
> I suggest using %e for enumeration here, cause "compatibility" can
> easily be misunderstood.
>
Good point, I've changed that.
> And we need a few lines added to the man page at udev.8.in :)
>
Done. I've also added an example.
Also, Kay pointed out offlist that the rules can be written to not
require a shell script; this actually works
KERNEL="sr*", NAME="%k", SYMLINK="cdrom%e"
KERNEL="scd*", NAME="%k", SYMLINK="cdrom%e"
KERNEL="pcd*", NAME="%k", SYMLINK="cdrom%e"
KERNEL="hd[a-z]", PROGRAM="/bin/cat /proc/ide/%k/media", RESULT="cdrom", NAME="\%k", SYMLINK="cdrom%e"
KERNEL="fd[0-9]", NAME="%k", SYMLINK="floppy%e"
KERNEL="hd[a-z]", PROGRAM="/bin/cat /proc/ide/%k/media", RESULT="floppy", NAME=\"%k", SYMLINK="floppy%e"
New patch is attached.
David
2004-09-11 08:04:13 +04:00
2004-11-06 16:28:01 +03:00
num + + ;
if ( num > 1000 ) {
info ( " find_free_number gone crazy (num=%d), aborted " , num ) ;
return - 1 ;
}
2005-03-07 06:29:43 +03:00
snprintf ( filename , sizeof ( filename ) , " %s%d " , name , num ) ;
filename [ sizeof ( filename ) - 1 ] = ' \0 ' ;
2004-11-06 16:28:01 +03:00
}
[PATCH] compatibility symlinks for udev
On Mon, 2004-09-06 at 17:45 +0200, Kay Sievers wrote:
> On Mon, 2004-09-06 at 16:46 +0200, David Zeuthen wrote:
>
> Nice, I like it. It's a easy way to group device nodes of the same type,
> but coming from different kernel subsystems.
>
That's a good way of putting it, yeah.
> > Here's a patch against udev-030 that can help create compatibility
> > symlinks like /dev/cdrom, /dev/cdrom1 etc. The patch introduces a new
> > substitution type %C (for Compatibility) that can be used as follows
>
> I suggest using %e for enumeration here, cause "compatibility" can
> easily be misunderstood.
>
Good point, I've changed that.
> And we need a few lines added to the man page at udev.8.in :)
>
Done. I've also added an example.
Also, Kay pointed out offlist that the rules can be written to not
require a shell script; this actually works
KERNEL="sr*", NAME="%k", SYMLINK="cdrom%e"
KERNEL="scd*", NAME="%k", SYMLINK="cdrom%e"
KERNEL="pcd*", NAME="%k", SYMLINK="cdrom%e"
KERNEL="hd[a-z]", PROGRAM="/bin/cat /proc/ide/%k/media", RESULT="cdrom", NAME="\%k", SYMLINK="cdrom%e"
KERNEL="fd[0-9]", NAME="%k", SYMLINK="floppy%e"
KERNEL="hd[a-z]", PROGRAM="/bin/cat /proc/ide/%k/media", RESULT="floppy", NAME=\"%k", SYMLINK="floppy%e"
New patch is attached.
David
2004-09-11 08:04:13 +04:00
}
2005-03-27 03:15:07 +04:00
static int find_sysfs_attribute ( struct sysfs_class_device * class_dev , struct sysfs_device * sysfs_device ,
const char * name , char * value , size_t len )
{
2005-08-05 03:52:57 +04:00
struct sysfs_class_device * class_dev_parent ;
2005-03-27 03:15:07 +04:00
struct sysfs_attribute * tmpattr ;
dbg ( " look for device attribute '%s' " , name ) ;
if ( class_dev ) {
2005-06-20 02:29:38 +04:00
dbg ( " look for class attribute '%s/%s' " , class_dev - > path , name ) ;
2005-03-27 03:15:07 +04:00
tmpattr = sysfs_get_classdev_attr ( class_dev , name ) ;
if ( tmpattr )
goto attr_found ;
2005-08-05 03:52:57 +04:00
class_dev_parent = sysfs_get_classdev_parent ( class_dev ) ;
if ( class_dev_parent ) {
tmpattr = sysfs_get_classdev_attr ( class_dev_parent , name ) ;
if ( tmpattr )
goto attr_found ;
}
2005-03-27 03:15:07 +04:00
}
if ( sysfs_device ) {
2005-06-20 02:29:38 +04:00
dbg ( " look for devices attribute '%s/%s' " , sysfs_device - > path , name ) ;
2005-03-27 03:15:07 +04:00
tmpattr = sysfs_get_device_attr ( sysfs_device , name ) ;
if ( tmpattr )
goto attr_found ;
}
return - 1 ;
attr_found :
strlcpy ( value , tmpattr - > value , len ) ;
remove_trailing_char ( value , ' \n ' ) ;
dbg ( " found attribute '%s' " , tmpattr - > path ) ;
return 0 ;
}
2005-07-07 22:05:51 +04:00
# define WAIT_LOOP_PER_SECOND 20
static int wait_for_sysfs ( struct udevice * udev , const char * file , int timeout )
{
char filename [ PATH_SIZE ] ;
struct stat stats ;
int loop = timeout * WAIT_LOOP_PER_SECOND ;
snprintf ( filename , sizeof ( filename ) , " %s%s/%s " , sysfs_path , udev - > devpath , file ) ;
filename [ sizeof ( filename ) - 1 ] = ' \0 ' ;
dbg ( " wait %i sec for '%s' " , timeout , filename ) ;
while ( - - loop ) {
if ( stat ( filename , & stats ) = = 0 ) {
dbg ( " file appeared after %i loops " , ( timeout * WAIT_LOOP_PER_SECOND ) - loop - 1 ) ;
return 0 ;
}
usleep ( 1000 * 1000 / WAIT_LOOP_PER_SECOND ) ;
}
dbg ( " waiting for '%s' failed " , filename ) ;
return - 1 ;
}
[PATCH] udev - safer string handling - part two
As promised, here is the next round. We provide in addition to the
already used macros:
strfieldcpy(to, from)
strfieldcat(to, from)
the corresponding friends, if the size of the target is not known and
must be provided by the caller:
strnfieldcpy(to, from, maxsize)
strnfieldcat(to, from, maxsize)
and switch nearly all possibly unsafe users of strcat(), strncat(),
strcpy() and strncpy() to these safer macros.
The last known remaining issue seems the use of sprintf() and
snprintf(). I will take on it later today or tomorrow.
2004-02-27 06:40:22 +03:00
static void apply_format ( struct udevice * udev , char * string , size_t maxsize ,
2005-03-04 22:52:19 +03:00
struct sysfs_class_device * class_dev , struct sysfs_device * sysfs_device )
2003-11-24 09:25:13 +03:00
{
2005-03-07 06:29:43 +03:00
char temp [ PATH_SIZE ] ;
char temp2 [ PATH_SIZE ] ;
2005-06-25 15:10:16 +04:00
char * head , * tail , * pos , * cpos , * attr , * rest ;
2004-02-28 17:53:25 +03:00
int len ;
2004-02-17 12:29:03 +03:00
int i ;
[PATCH] compatibility symlinks for udev
On Mon, 2004-09-06 at 17:45 +0200, Kay Sievers wrote:
> On Mon, 2004-09-06 at 16:46 +0200, David Zeuthen wrote:
>
> Nice, I like it. It's a easy way to group device nodes of the same type,
> but coming from different kernel subsystems.
>
That's a good way of putting it, yeah.
> > Here's a patch against udev-030 that can help create compatibility
> > symlinks like /dev/cdrom, /dev/cdrom1 etc. The patch introduces a new
> > substitution type %C (for Compatibility) that can be used as follows
>
> I suggest using %e for enumeration here, cause "compatibility" can
> easily be misunderstood.
>
Good point, I've changed that.
> And we need a few lines added to the man page at udev.8.in :)
>
Done. I've also added an example.
Also, Kay pointed out offlist that the rules can be written to not
require a shell script; this actually works
KERNEL="sr*", NAME="%k", SYMLINK="cdrom%e"
KERNEL="scd*", NAME="%k", SYMLINK="cdrom%e"
KERNEL="pcd*", NAME="%k", SYMLINK="cdrom%e"
KERNEL="hd[a-z]", PROGRAM="/bin/cat /proc/ide/%k/media", RESULT="cdrom", NAME="\%k", SYMLINK="cdrom%e"
KERNEL="fd[0-9]", NAME="%k", SYMLINK="floppy%e"
KERNEL="hd[a-z]", PROGRAM="/bin/cat /proc/ide/%k/media", RESULT="floppy", NAME=\"%k", SYMLINK="floppy%e"
New patch is attached.
David
2004-09-11 08:04:13 +04:00
unsigned int next_free_number ;
2005-02-10 11:03:55 +03:00
struct sysfs_class_device * class_dev_parent ;
2005-06-20 02:29:38 +04:00
enum subst_type {
SUBST_UNKNOWN ,
SUBST_DEVPATH ,
SUBST_ID ,
SUBST_KERNEL_NUMBER ,
SUBST_KERNEL_NAME ,
SUBST_MAJOR ,
SUBST_MINOR ,
SUBST_RESULT ,
SUBST_SYSFS ,
SUBST_ENUM ,
SUBST_PARENT ,
SUBST_TEMP_NODE ,
SUBST_ROOT ,
SUBST_MODALIAS ,
2005-06-25 15:10:16 +04:00
SUBST_ENV ,
2005-06-20 02:29:38 +04:00
} ;
static const struct subst_map {
char * name ;
char fmt ;
enum subst_type type ;
} map [ ] = {
{ . name = " devpath " , . fmt = ' p ' , . type = SUBST_DEVPATH } ,
{ . name = " id " , . fmt = ' b ' , . type = SUBST_ID } ,
{ . name = " number " , . fmt = ' n ' , . type = SUBST_KERNEL_NUMBER } ,
{ . name = " kernel " , . fmt = ' k ' , . type = SUBST_KERNEL_NAME } ,
{ . name = " major " , . fmt = ' M ' , . type = SUBST_MAJOR } ,
{ . name = " minor " , . fmt = ' m ' , . type = SUBST_MINOR } ,
{ . name = " result " , . fmt = ' c ' , . type = SUBST_RESULT } ,
{ . name = " sysfs " , . fmt = ' s ' , . type = SUBST_SYSFS } ,
{ . name = " enum " , . fmt = ' e ' , . type = SUBST_ENUM } ,
{ . name = " parent " , . fmt = ' P ' , . type = SUBST_PARENT } ,
{ . name = " tempnode " , . fmt = ' N ' , . type = SUBST_TEMP_NODE } ,
{ . name = " root " , . fmt = ' r ' , . type = SUBST_ROOT } ,
{ . name = " modalias " , . fmt = ' A ' , . type = SUBST_MODALIAS } ,
2005-06-25 15:10:16 +04:00
{ . name = " env " , . fmt = ' E ' , . type = SUBST_ENV } ,
2005-08-13 02:18:44 +04:00
{ NULL , ' \0 ' , 0 }
2005-06-20 02:29:38 +04:00
} ;
enum subst_type type ;
const struct subst_map * subst ;
head = string ;
2003-11-24 09:25:13 +03:00
while ( 1 ) {
2005-06-20 02:29:38 +04:00
len = - 1 ;
while ( head [ 0 ] ! = ' \0 ' ) {
if ( head [ 0 ] = = ' $ ' ) {
/* substitute named variable */
if ( head [ 1 ] = = ' \0 ' )
break ;
if ( head [ 1 ] = = ' $ ' ) {
strlcpy ( temp , head + 2 , sizeof ( temp ) ) ;
strlcpy ( head + 1 , temp , maxsize ) ;
head + + ;
continue ;
}
head [ 0 ] = ' \0 ' ;
for ( subst = map ; subst - > name ; subst + + ) {
if ( strncasecmp ( & head [ 1 ] , subst - > name , strlen ( subst - > name ) ) = = 0 ) {
type = subst - > type ;
tail = head + strlen ( subst - > name ) + 1 ;
dbg ( " will substitute format name '%s' " , subst - > name ) ;
goto found ;
}
}
}
else if ( head [ 0 ] = = ' % ' ) {
/* substitute format char */
if ( head [ 1 ] = = ' \0 ' )
break ;
if ( head [ 1 ] = = ' % ' ) {
strlcpy ( temp , head + 2 , sizeof ( temp ) ) ;
strlcpy ( head + 1 , temp , maxsize ) ;
head + + ;
continue ;
}
head [ 0 ] = ' \0 ' ;
tail = head + 1 ;
len = get_format_len ( & tail ) ;
for ( subst = map ; subst - > name ; subst + + ) {
if ( tail [ 0 ] = = subst - > fmt ) {
type = subst - > type ;
tail + + ;
dbg ( " will substitute format char '%c' " , subst - > fmt ) ;
goto found ;
}
}
}
head + + ;
}
break ;
found :
[PATCH] Adding '%s' format specifier to NAME and SYMLINK
On Thu, Feb 12, 2004 at 05:34:57PM -0800, Greg KH wrote:
> On Tue, Feb 10, 2004 at 09:14:20AM +0100, Hannes Reinecke wrote:
> > Hi all,
> >
> > this patch makes the format for NAME and SYMLINK a bit more flexible:
> > I've added a new format specifier '%s{<SYSFS_var>}', which allows for
> > the value of any sysfs entry found for this device to be inserted.
> > Example (for our S/390 fcp adapter):
> >
> > BUS="ccw", SYSFS_devtype="1732/03", NAME="%k" \
> > SYMLINK="zfcp-%s{hba_id}-%s{wwpn}:%s{fcp_lun}"
> >
> > I know this could also be done with an external program, but having this
> > incorporated into udev makes life easier, especially if run from
> > initramfs. Plus it makes the rules easier to follow, as the result is
> > directly visible and need not to be looked up in some external program.
> >
> > Comments etc. welcome.
>
> Oops, sorry I missed this for the 017 release. I'll look at it tomorrow
> and get back to you. At first glance it looks like a good thing.
>
> Oh, you forgot to update the documentation, that's important to do if
> you want this change to make it in :)
I took a part of the code and made a version that uses already implemented
attribute finding logic.
The parsing of the format length '%3x' and the '%x{attribute}' is a fuction now,
maybe there are more possible users in the future.
I've also added the test to udev-test.pl.
2004-02-17 08:36:34 +03:00
attr = get_format_attribute ( & tail ) ;
2005-06-20 02:29:38 +04:00
strlcpy ( temp , tail , sizeof ( temp ) ) ;
dbg ( " format=%i, string='%s', tail='%s', class_dev=%p, sysfs_dev=%p " ,
type , string , tail , class_dev , sysfs_device ) ;
[PATCH] Adding '%s' format specifier to NAME and SYMLINK
On Thu, Feb 12, 2004 at 05:34:57PM -0800, Greg KH wrote:
> On Tue, Feb 10, 2004 at 09:14:20AM +0100, Hannes Reinecke wrote:
> > Hi all,
> >
> > this patch makes the format for NAME and SYMLINK a bit more flexible:
> > I've added a new format specifier '%s{<SYSFS_var>}', which allows for
> > the value of any sysfs entry found for this device to be inserted.
> > Example (for our S/390 fcp adapter):
> >
> > BUS="ccw", SYSFS_devtype="1732/03", NAME="%k" \
> > SYMLINK="zfcp-%s{hba_id}-%s{wwpn}:%s{fcp_lun}"
> >
> > I know this could also be done with an external program, but having this
> > incorporated into udev makes life easier, especially if run from
> > initramfs. Plus it makes the rules easier to follow, as the result is
> > directly visible and need not to be looked up in some external program.
> >
> > Comments etc. welcome.
>
> Oops, sorry I missed this for the 017 release. I'll look at it tomorrow
> and get back to you. At first glance it looks like a good thing.
>
> Oh, you forgot to update the documentation, that's important to do if
> you want this change to make it in :)
I took a part of the code and made a version that uses already implemented
attribute finding logic.
The parsing of the format length '%3x' and the '%x{attribute}' is a fuction now,
maybe there are more possible users in the future.
I've also added the test to udev-test.pl.
2004-02-17 08:36:34 +03:00
2005-06-20 02:29:38 +04:00
switch ( type ) {
case SUBST_DEVPATH :
2005-03-07 06:29:43 +03:00
strlcat ( string , udev - > devpath , maxsize ) ;
2005-06-20 02:29:38 +04:00
dbg ( " substitute devpath '%s' " , udev - > devpath ) ;
2005-02-09 06:37:32 +03:00
break ;
2005-06-20 02:29:38 +04:00
case SUBST_ID :
2005-03-07 06:29:43 +03:00
strlcat ( string , udev - > bus_id , maxsize ) ;
[PATCH] Adding '%s' format specifier to NAME and SYMLINK
On Thu, Feb 12, 2004 at 05:34:57PM -0800, Greg KH wrote:
> On Tue, Feb 10, 2004 at 09:14:20AM +0100, Hannes Reinecke wrote:
> > Hi all,
> >
> > this patch makes the format for NAME and SYMLINK a bit more flexible:
> > I've added a new format specifier '%s{<SYSFS_var>}', which allows for
> > the value of any sysfs entry found for this device to be inserted.
> > Example (for our S/390 fcp adapter):
> >
> > BUS="ccw", SYSFS_devtype="1732/03", NAME="%k" \
> > SYMLINK="zfcp-%s{hba_id}-%s{wwpn}:%s{fcp_lun}"
> >
> > I know this could also be done with an external program, but having this
> > incorporated into udev makes life easier, especially if run from
> > initramfs. Plus it makes the rules easier to follow, as the result is
> > directly visible and need not to be looked up in some external program.
> >
> > Comments etc. welcome.
>
> Oops, sorry I missed this for the 017 release. I'll look at it tomorrow
> and get back to you. At first glance it looks like a good thing.
>
> Oh, you forgot to update the documentation, that's important to do if
> you want this change to make it in :)
I took a part of the code and made a version that uses already implemented
attribute finding logic.
The parsing of the format length '%3x' and the '%x{attribute}' is a fuction now,
maybe there are more possible users in the future.
I've also added the test to udev-test.pl.
2004-02-17 08:36:34 +03:00
dbg ( " substitute bus_id '%s' " , udev - > bus_id ) ;
break ;
2005-06-20 02:29:38 +04:00
case SUBST_KERNEL_NAME :
2005-03-07 06:29:43 +03:00
strlcat ( string , udev - > kernel_name , maxsize ) ;
[PATCH] Adding '%s' format specifier to NAME and SYMLINK
On Thu, Feb 12, 2004 at 05:34:57PM -0800, Greg KH wrote:
> On Tue, Feb 10, 2004 at 09:14:20AM +0100, Hannes Reinecke wrote:
> > Hi all,
> >
> > this patch makes the format for NAME and SYMLINK a bit more flexible:
> > I've added a new format specifier '%s{<SYSFS_var>}', which allows for
> > the value of any sysfs entry found for this device to be inserted.
> > Example (for our S/390 fcp adapter):
> >
> > BUS="ccw", SYSFS_devtype="1732/03", NAME="%k" \
> > SYMLINK="zfcp-%s{hba_id}-%s{wwpn}:%s{fcp_lun}"
> >
> > I know this could also be done with an external program, but having this
> > incorporated into udev makes life easier, especially if run from
> > initramfs. Plus it makes the rules easier to follow, as the result is
> > directly visible and need not to be looked up in some external program.
> >
> > Comments etc. welcome.
>
> Oops, sorry I missed this for the 017 release. I'll look at it tomorrow
> and get back to you. At first glance it looks like a good thing.
>
> Oh, you forgot to update the documentation, that's important to do if
> you want this change to make it in :)
I took a part of the code and made a version that uses already implemented
attribute finding logic.
The parsing of the format length '%3x' and the '%x{attribute}' is a fuction now,
maybe there are more possible users in the future.
I've also added the test to udev-test.pl.
2004-02-17 08:36:34 +03:00
dbg ( " substitute kernel name '%s' " , udev - > kernel_name ) ;
break ;
2005-06-20 02:29:38 +04:00
case SUBST_KERNEL_NUMBER :
2005-03-07 06:29:43 +03:00
strlcat ( string , udev - > kernel_number , maxsize ) ;
[PATCH] Adding '%s' format specifier to NAME and SYMLINK
On Thu, Feb 12, 2004 at 05:34:57PM -0800, Greg KH wrote:
> On Tue, Feb 10, 2004 at 09:14:20AM +0100, Hannes Reinecke wrote:
> > Hi all,
> >
> > this patch makes the format for NAME and SYMLINK a bit more flexible:
> > I've added a new format specifier '%s{<SYSFS_var>}', which allows for
> > the value of any sysfs entry found for this device to be inserted.
> > Example (for our S/390 fcp adapter):
> >
> > BUS="ccw", SYSFS_devtype="1732/03", NAME="%k" \
> > SYMLINK="zfcp-%s{hba_id}-%s{wwpn}:%s{fcp_lun}"
> >
> > I know this could also be done with an external program, but having this
> > incorporated into udev makes life easier, especially if run from
> > initramfs. Plus it makes the rules easier to follow, as the result is
> > directly visible and need not to be looked up in some external program.
> >
> > Comments etc. welcome.
>
> Oops, sorry I missed this for the 017 release. I'll look at it tomorrow
> and get back to you. At first glance it looks like a good thing.
>
> Oh, you forgot to update the documentation, that's important to do if
> you want this change to make it in :)
I took a part of the code and made a version that uses already implemented
attribute finding logic.
The parsing of the format length '%3x' and the '%x{attribute}' is a fuction now,
maybe there are more possible users in the future.
I've also added the test to udev-test.pl.
2004-02-17 08:36:34 +03:00
dbg ( " substitute kernel number '%s' " , udev - > kernel_number ) ;
break ;
2005-06-20 02:29:38 +04:00
case SUBST_MAJOR :
2005-03-05 08:50:09 +03:00
sprintf ( temp2 , " %d " , major ( udev - > devt ) ) ;
2005-03-07 06:29:43 +03:00
strlcat ( string , temp2 , maxsize ) ;
2005-03-05 08:50:09 +03:00
dbg ( " substitute major number '%s' " , temp2 ) ;
[PATCH] Adding '%s' format specifier to NAME and SYMLINK
On Thu, Feb 12, 2004 at 05:34:57PM -0800, Greg KH wrote:
> On Tue, Feb 10, 2004 at 09:14:20AM +0100, Hannes Reinecke wrote:
> > Hi all,
> >
> > this patch makes the format for NAME and SYMLINK a bit more flexible:
> > I've added a new format specifier '%s{<SYSFS_var>}', which allows for
> > the value of any sysfs entry found for this device to be inserted.
> > Example (for our S/390 fcp adapter):
> >
> > BUS="ccw", SYSFS_devtype="1732/03", NAME="%k" \
> > SYMLINK="zfcp-%s{hba_id}-%s{wwpn}:%s{fcp_lun}"
> >
> > I know this could also be done with an external program, but having this
> > incorporated into udev makes life easier, especially if run from
> > initramfs. Plus it makes the rules easier to follow, as the result is
> > directly visible and need not to be looked up in some external program.
> >
> > Comments etc. welcome.
>
> Oops, sorry I missed this for the 017 release. I'll look at it tomorrow
> and get back to you. At first glance it looks like a good thing.
>
> Oh, you forgot to update the documentation, that's important to do if
> you want this change to make it in :)
I took a part of the code and made a version that uses already implemented
attribute finding logic.
The parsing of the format length '%3x' and the '%x{attribute}' is a fuction now,
maybe there are more possible users in the future.
I've also added the test to udev-test.pl.
2004-02-17 08:36:34 +03:00
break ;
2005-06-20 02:29:38 +04:00
case SUBST_MINOR :
sprintf ( temp2 , " %d " , minor ( udev - > devt ) ) ;
strlcat ( string , temp2 , maxsize ) ;
dbg ( " substitute minor number '%s' " , temp2 ) ;
break ;
case SUBST_RESULT :
2005-03-04 22:52:19 +03:00
if ( udev - > program_result [ 0 ] = = ' \0 ' )
2003-11-24 09:25:13 +03:00
break ;
2004-02-17 12:29:03 +03:00
/* get part part of the result string */
2004-02-28 17:53:25 +03:00
i = 0 ;
2004-02-17 12:29:03 +03:00
if ( attr ! = NULL )
2004-03-11 12:37:18 +03:00
i = strtoul ( attr , & rest , 10 ) ;
2004-02-17 12:29:03 +03:00
if ( i > 0 ) {
2005-03-05 08:50:09 +03:00
dbg ( " request part #%d of result string " , i ) ;
cpos = udev - > program_result ;
while ( - - i ) {
while ( cpos [ 0 ] ! = ' \0 ' & & ! isspace ( cpos [ 0 ] ) )
cpos + + ;
while ( isspace ( cpos [ 0 ] ) )
cpos + + ;
[PATCH] get part of callout return string
Try this patch if you like, to get special parts of the callout output.
This beast works now:
CALLOUT, BUS="scsi", PROGRAM="/bin/echo -n node link1 link2", ID="node *", NAME="%1c", SYMLINK="%2c %3c"
The callout returned string is separated by spaces and is
addressed by the "len" value of the 'c' format char.
Since we support symlinks, this my be useful for other uses of callout too.
introduce 'len number' for format chars
the first use is 'c'-the callout return to select a part of the output string like:
CALLOUT, BUS="scsi", PROGRAM="/bin/echo -n node link1 link2", ID="node *", NAME="%1c", SYMLINK="%2c %3c"
(note: first part is requested by len=1, len=0 will return the whole string)
add a test to udev-test.pl
2003-12-16 09:54:38 +03:00
}
2004-03-04 05:16:35 +03:00
if ( i > 0 ) {
2005-03-27 03:11:03 +04:00
err ( " requested part of result string not found " ) ;
2004-03-04 05:16:35 +03:00
break ;
[PATCH] Adding '%s' format specifier to NAME and SYMLINK
On Thu, Feb 12, 2004 at 05:34:57PM -0800, Greg KH wrote:
> On Tue, Feb 10, 2004 at 09:14:20AM +0100, Hannes Reinecke wrote:
> > Hi all,
> >
> > this patch makes the format for NAME and SYMLINK a bit more flexible:
> > I've added a new format specifier '%s{<SYSFS_var>}', which allows for
> > the value of any sysfs entry found for this device to be inserted.
> > Example (for our S/390 fcp adapter):
> >
> > BUS="ccw", SYSFS_devtype="1732/03", NAME="%k" \
> > SYMLINK="zfcp-%s{hba_id}-%s{wwpn}:%s{fcp_lun}"
> >
> > I know this could also be done with an external program, but having this
> > incorporated into udev makes life easier, especially if run from
> > initramfs. Plus it makes the rules easier to follow, as the result is
> > directly visible and need not to be looked up in some external program.
> >
> > Comments etc. welcome.
>
> Oops, sorry I missed this for the 017 release. I'll look at it tomorrow
> and get back to you. At first glance it looks like a good thing.
>
> Oh, you forgot to update the documentation, that's important to do if
> you want this change to make it in :)
I took a part of the code and made a version that uses already implemented
attribute finding logic.
The parsing of the format length '%3x' and the '%x{attribute}' is a fuction now,
maybe there are more possible users in the future.
I've also added the test to udev-test.pl.
2004-02-17 08:36:34 +03:00
}
2005-03-07 06:29:43 +03:00
strlcpy ( temp2 , cpos , sizeof ( temp2 ) ) ;
2005-03-05 08:50:09 +03:00
/* %{2+}c copies the whole string from the second part on */
if ( rest [ 0 ] ! = ' + ' ) {
cpos = strchr ( temp2 , ' ' ) ;
if ( cpos )
cpos [ 0 ] = ' \0 ' ;
}
2005-03-07 06:29:43 +03:00
strlcat ( string , temp2 , maxsize ) ;
2004-03-04 11:54:13 +03:00
dbg ( " substitute part of result string '%s' " , temp2 ) ;
[PATCH] Adding '%s' format specifier to NAME and SYMLINK
On Thu, Feb 12, 2004 at 05:34:57PM -0800, Greg KH wrote:
> On Tue, Feb 10, 2004 at 09:14:20AM +0100, Hannes Reinecke wrote:
> > Hi all,
> >
> > this patch makes the format for NAME and SYMLINK a bit more flexible:
> > I've added a new format specifier '%s{<SYSFS_var>}', which allows for
> > the value of any sysfs entry found for this device to be inserted.
> > Example (for our S/390 fcp adapter):
> >
> > BUS="ccw", SYSFS_devtype="1732/03", NAME="%k" \
> > SYMLINK="zfcp-%s{hba_id}-%s{wwpn}:%s{fcp_lun}"
> >
> > I know this could also be done with an external program, but having this
> > incorporated into udev makes life easier, especially if run from
> > initramfs. Plus it makes the rules easier to follow, as the result is
> > directly visible and need not to be looked up in some external program.
> >
> > Comments etc. welcome.
>
> Oops, sorry I missed this for the 017 release. I'll look at it tomorrow
> and get back to you. At first glance it looks like a good thing.
>
> Oh, you forgot to update the documentation, that's important to do if
> you want this change to make it in :)
I took a part of the code and made a version that uses already implemented
attribute finding logic.
The parsing of the format length '%3x' and the '%x{attribute}' is a fuction now,
maybe there are more possible users in the future.
I've also added the test to udev-test.pl.
2004-02-17 08:36:34 +03:00
} else {
2005-03-07 06:29:43 +03:00
strlcat ( string , udev - > program_result , maxsize ) ;
[PATCH] Adding '%s' format specifier to NAME and SYMLINK
On Thu, Feb 12, 2004 at 05:34:57PM -0800, Greg KH wrote:
> On Tue, Feb 10, 2004 at 09:14:20AM +0100, Hannes Reinecke wrote:
> > Hi all,
> >
> > this patch makes the format for NAME and SYMLINK a bit more flexible:
> > I've added a new format specifier '%s{<SYSFS_var>}', which allows for
> > the value of any sysfs entry found for this device to be inserted.
> > Example (for our S/390 fcp adapter):
> >
> > BUS="ccw", SYSFS_devtype="1732/03", NAME="%k" \
> > SYMLINK="zfcp-%s{hba_id}-%s{wwpn}:%s{fcp_lun}"
> >
> > I know this could also be done with an external program, but having this
> > incorporated into udev makes life easier, especially if run from
> > initramfs. Plus it makes the rules easier to follow, as the result is
> > directly visible and need not to be looked up in some external program.
> >
> > Comments etc. welcome.
>
> Oops, sorry I missed this for the 017 release. I'll look at it tomorrow
> and get back to you. At first glance it looks like a good thing.
>
> Oh, you forgot to update the documentation, that's important to do if
> you want this change to make it in :)
I took a part of the code and made a version that uses already implemented
attribute finding logic.
The parsing of the format length '%3x' and the '%x{attribute}' is a fuction now,
maybe there are more possible users in the future.
I've also added the test to udev-test.pl.
2004-02-17 08:36:34 +03:00
dbg ( " substitute result string '%s' " , udev - > program_result ) ;
2003-11-24 09:25:13 +03:00
}
break ;
2005-06-20 02:29:38 +04:00
case SUBST_SYSFS :
2005-02-21 16:01:23 +03:00
if ( attr = = NULL ) {
[PATCH] Adding '%s' format specifier to NAME and SYMLINK
On Thu, Feb 12, 2004 at 05:34:57PM -0800, Greg KH wrote:
> On Tue, Feb 10, 2004 at 09:14:20AM +0100, Hannes Reinecke wrote:
> > Hi all,
> >
> > this patch makes the format for NAME and SYMLINK a bit more flexible:
> > I've added a new format specifier '%s{<SYSFS_var>}', which allows for
> > the value of any sysfs entry found for this device to be inserted.
> > Example (for our S/390 fcp adapter):
> >
> > BUS="ccw", SYSFS_devtype="1732/03", NAME="%k" \
> > SYMLINK="zfcp-%s{hba_id}-%s{wwpn}:%s{fcp_lun}"
> >
> > I know this could also be done with an external program, but having this
> > incorporated into udev makes life easier, especially if run from
> > initramfs. Plus it makes the rules easier to follow, as the result is
> > directly visible and need not to be looked up in some external program.
> >
> > Comments etc. welcome.
>
> Oops, sorry I missed this for the 017 release. I'll look at it tomorrow
> and get back to you. At first glance it looks like a good thing.
>
> Oh, you forgot to update the documentation, that's important to do if
> you want this change to make it in :)
I took a part of the code and made a version that uses already implemented
attribute finding logic.
The parsing of the format length '%3x' and the '%x{attribute}' is a fuction now,
maybe there are more possible users in the future.
I've also added the test to udev-test.pl.
2004-02-17 08:36:34 +03:00
dbg ( " missing attribute " ) ;
2005-02-21 16:01:23 +03:00
break ;
}
2005-03-27 03:15:07 +04:00
if ( find_sysfs_attribute ( class_dev , sysfs_device , attr , temp2 , sizeof ( temp2 ) ) ! = 0 ) {
2005-03-28 13:22:17 +04:00
struct sysfs_device * parent_device ;
dbg ( " sysfs attribute '%s' not found, walk up the physical devices " , attr ) ;
parent_device = sysfs_get_device_parent ( sysfs_device ) ;
while ( parent_device ) {
dbg ( " looking at '%s' " , parent_device - > path ) ;
if ( find_sysfs_attribute ( NULL , parent_device , attr , temp2 , sizeof ( temp2 ) ) = = 0 )
break ;
parent_device = sysfs_get_device_parent ( parent_device ) ;
}
if ( ! parent_device )
break ;
2005-02-21 16:01:23 +03:00
}
2005-03-27 03:15:07 +04:00
/* strip trailing whitespace of sysfs value */
i = strlen ( temp2 ) ;
while ( i > 0 & & isspace ( temp2 [ i - 1 ] ) )
temp2 [ - - i ] = ' \0 ' ;
replace_untrusted_chars ( temp2 ) ;
strlcat ( string , temp2 , maxsize ) ;
dbg ( " substitute sysfs value '%s' " , temp2 ) ;
[PATCH] Adding '%s' format specifier to NAME and SYMLINK
On Thu, Feb 12, 2004 at 05:34:57PM -0800, Greg KH wrote:
> On Tue, Feb 10, 2004 at 09:14:20AM +0100, Hannes Reinecke wrote:
> > Hi all,
> >
> > this patch makes the format for NAME and SYMLINK a bit more flexible:
> > I've added a new format specifier '%s{<SYSFS_var>}', which allows for
> > the value of any sysfs entry found for this device to be inserted.
> > Example (for our S/390 fcp adapter):
> >
> > BUS="ccw", SYSFS_devtype="1732/03", NAME="%k" \
> > SYMLINK="zfcp-%s{hba_id}-%s{wwpn}:%s{fcp_lun}"
> >
> > I know this could also be done with an external program, but having this
> > incorporated into udev makes life easier, especially if run from
> > initramfs. Plus it makes the rules easier to follow, as the result is
> > directly visible and need not to be looked up in some external program.
> >
> > Comments etc. welcome.
>
> Oops, sorry I missed this for the 017 release. I'll look at it tomorrow
> and get back to you. At first glance it looks like a good thing.
>
> Oh, you forgot to update the documentation, that's important to do if
> you want this change to make it in :)
I took a part of the code and made a version that uses already implemented
attribute finding logic.
The parsing of the format length '%3x' and the '%x{attribute}' is a fuction now,
maybe there are more possible users in the future.
I've also added the test to udev-test.pl.
2004-02-17 08:36:34 +03:00
break ;
2005-06-20 02:29:38 +04:00
case SUBST_ENUM :
2005-08-13 02:18:44 +04:00
next_free_number = find_free_number ( string ) ;
[PATCH] compatibility symlinks for udev
On Mon, 2004-09-06 at 17:45 +0200, Kay Sievers wrote:
> On Mon, 2004-09-06 at 16:46 +0200, David Zeuthen wrote:
>
> Nice, I like it. It's a easy way to group device nodes of the same type,
> but coming from different kernel subsystems.
>
That's a good way of putting it, yeah.
> > Here's a patch against udev-030 that can help create compatibility
> > symlinks like /dev/cdrom, /dev/cdrom1 etc. The patch introduces a new
> > substitution type %C (for Compatibility) that can be used as follows
>
> I suggest using %e for enumeration here, cause "compatibility" can
> easily be misunderstood.
>
Good point, I've changed that.
> And we need a few lines added to the man page at udev.8.in :)
>
Done. I've also added an example.
Also, Kay pointed out offlist that the rules can be written to not
require a shell script; this actually works
KERNEL="sr*", NAME="%k", SYMLINK="cdrom%e"
KERNEL="scd*", NAME="%k", SYMLINK="cdrom%e"
KERNEL="pcd*", NAME="%k", SYMLINK="cdrom%e"
KERNEL="hd[a-z]", PROGRAM="/bin/cat /proc/ide/%k/media", RESULT="cdrom", NAME="\%k", SYMLINK="cdrom%e"
KERNEL="fd[0-9]", NAME="%k", SYMLINK="floppy%e"
KERNEL="hd[a-z]", PROGRAM="/bin/cat /proc/ide/%k/media", RESULT="floppy", NAME=\"%k", SYMLINK="floppy%e"
New patch is attached.
David
2004-09-11 08:04:13 +04:00
if ( next_free_number > 0 ) {
2004-11-06 16:28:01 +03:00
sprintf ( temp2 , " %d " , next_free_number ) ;
2005-03-07 06:29:43 +03:00
strlcat ( string , temp2 , maxsize ) ;
[PATCH] compatibility symlinks for udev
On Mon, 2004-09-06 at 17:45 +0200, Kay Sievers wrote:
> On Mon, 2004-09-06 at 16:46 +0200, David Zeuthen wrote:
>
> Nice, I like it. It's a easy way to group device nodes of the same type,
> but coming from different kernel subsystems.
>
That's a good way of putting it, yeah.
> > Here's a patch against udev-030 that can help create compatibility
> > symlinks like /dev/cdrom, /dev/cdrom1 etc. The patch introduces a new
> > substitution type %C (for Compatibility) that can be used as follows
>
> I suggest using %e for enumeration here, cause "compatibility" can
> easily be misunderstood.
>
Good point, I've changed that.
> And we need a few lines added to the man page at udev.8.in :)
>
Done. I've also added an example.
Also, Kay pointed out offlist that the rules can be written to not
require a shell script; this actually works
KERNEL="sr*", NAME="%k", SYMLINK="cdrom%e"
KERNEL="scd*", NAME="%k", SYMLINK="cdrom%e"
KERNEL="pcd*", NAME="%k", SYMLINK="cdrom%e"
KERNEL="hd[a-z]", PROGRAM="/bin/cat /proc/ide/%k/media", RESULT="cdrom", NAME="\%k", SYMLINK="cdrom%e"
KERNEL="fd[0-9]", NAME="%k", SYMLINK="floppy%e"
KERNEL="hd[a-z]", PROGRAM="/bin/cat /proc/ide/%k/media", RESULT="floppy", NAME=\"%k", SYMLINK="floppy%e"
New patch is attached.
David
2004-09-11 08:04:13 +04:00
}
break ;
2005-06-20 02:29:38 +04:00
case SUBST_PARENT :
2005-02-21 15:48:10 +03:00
if ( ! class_dev )
break ;
2005-02-10 11:03:55 +03:00
class_dev_parent = sysfs_get_classdev_parent ( class_dev ) ;
if ( class_dev_parent ! = NULL ) {
struct udevice udev_parent ;
dbg ( " found parent '%s', get the node name " , class_dev_parent - > path ) ;
2005-03-29 13:25:52 +04:00
udev_init_device ( & udev_parent , NULL , NULL , NULL ) ;
2005-02-10 11:03:55 +03:00
/* lookup the name in the udev_db with the DEVPATH of the parent */
2005-03-05 07:35:31 +03:00
if ( udev_db_get_device ( & udev_parent , & class_dev_parent - > path [ strlen ( sysfs_path ) ] ) = = 0 ) {
2005-03-07 06:29:43 +03:00
strlcat ( string , udev_parent . name , maxsize ) ;
2005-02-10 11:03:55 +03:00
dbg ( " substitute parent node name'%s' " , udev_parent . name ) ;
} else
dbg ( " parent not found in database " ) ;
2005-03-05 07:35:31 +03:00
udev_cleanup_device ( & udev_parent ) ;
2005-02-10 11:03:55 +03:00
}
break ;
2005-06-20 02:29:38 +04:00
case SUBST_TEMP_NODE :
2005-02-09 06:37:32 +03:00
if ( udev - > tmp_node [ 0 ] = = ' \0 ' ) {
dbg ( " create temporary device node for callout " ) ;
2005-03-07 06:29:43 +03:00
snprintf ( udev - > tmp_node , sizeof ( udev - > tmp_node ) , " %s/.tmp-%u-%u " ,
udev_root , major ( udev - > devt ) , minor ( udev - > devt ) ) ;
udev - > tmp_node [ sizeof ( udev - > tmp_node ) - 1 ] = ' \0 ' ;
2005-02-21 15:44:39 +03:00
udev_make_node ( udev , udev - > tmp_node , udev - > devt , 0600 , 0 , 0 ) ;
2005-02-09 06:37:32 +03:00
}
2005-03-07 06:29:43 +03:00
strlcat ( string , udev - > tmp_node , maxsize ) ;
2005-02-09 06:37:32 +03:00
dbg ( " substitute temporary device node name '%s' " , udev - > tmp_node ) ;
break ;
2005-06-20 02:29:38 +04:00
case SUBST_ROOT :
2005-03-07 06:29:43 +03:00
strlcat ( string , udev_root , maxsize ) ;
2005-02-10 11:03:55 +03:00
dbg ( " substitute udev_root '%s' " , udev_root ) ;
break ;
2005-06-20 02:29:38 +04:00
case SUBST_MODALIAS :
if ( find_sysfs_attribute ( NULL , sysfs_device , " modalias " , temp2 , sizeof ( temp2 ) ) ! = 0 )
break ;
strlcat ( string , temp2 , maxsize ) ;
dbg ( " substitute MODALIAS '%s' " , temp2 ) ;
break ;
2005-06-25 15:10:16 +04:00
case SUBST_ENV :
if ( attr = = NULL ) {
dbg ( " missing attribute " ) ;
break ;
}
pos = getenv ( attr ) ;
2005-07-12 16:46:36 +04:00
if ( pos = = NULL ) {
dbg ( " env '%s' not avialable " , attr ) ;
2005-06-25 15:10:16 +04:00
break ;
2005-07-12 16:46:36 +04:00
}
2005-06-25 15:10:16 +04:00
dbg ( " substitute env '%s=%s' " , attr , pos ) ;
2005-07-12 13:42:39 +04:00
strlcat ( string , pos , maxsize ) ;
2005-06-25 15:10:16 +04:00
break ;
[PATCH] Adding '%s' format specifier to NAME and SYMLINK
On Thu, Feb 12, 2004 at 05:34:57PM -0800, Greg KH wrote:
> On Tue, Feb 10, 2004 at 09:14:20AM +0100, Hannes Reinecke wrote:
> > Hi all,
> >
> > this patch makes the format for NAME and SYMLINK a bit more flexible:
> > I've added a new format specifier '%s{<SYSFS_var>}', which allows for
> > the value of any sysfs entry found for this device to be inserted.
> > Example (for our S/390 fcp adapter):
> >
> > BUS="ccw", SYSFS_devtype="1732/03", NAME="%k" \
> > SYMLINK="zfcp-%s{hba_id}-%s{wwpn}:%s{fcp_lun}"
> >
> > I know this could also be done with an external program, but having this
> > incorporated into udev makes life easier, especially if run from
> > initramfs. Plus it makes the rules easier to follow, as the result is
> > directly visible and need not to be looked up in some external program.
> >
> > Comments etc. welcome.
>
> Oops, sorry I missed this for the 017 release. I'll look at it tomorrow
> and get back to you. At first glance it looks like a good thing.
>
> Oh, you forgot to update the documentation, that's important to do if
> you want this change to make it in :)
I took a part of the code and made a version that uses already implemented
attribute finding logic.
The parsing of the format length '%3x' and the '%x{attribute}' is a fuction now,
maybe there are more possible users in the future.
I've also added the test to udev-test.pl.
2004-02-17 08:36:34 +03:00
default :
2005-06-20 02:29:38 +04:00
err ( " unknown substitution type=%i " , type ) ;
[PATCH] Adding '%s' format specifier to NAME and SYMLINK
On Thu, Feb 12, 2004 at 05:34:57PM -0800, Greg KH wrote:
> On Tue, Feb 10, 2004 at 09:14:20AM +0100, Hannes Reinecke wrote:
> > Hi all,
> >
> > this patch makes the format for NAME and SYMLINK a bit more flexible:
> > I've added a new format specifier '%s{<SYSFS_var>}', which allows for
> > the value of any sysfs entry found for this device to be inserted.
> > Example (for our S/390 fcp adapter):
> >
> > BUS="ccw", SYSFS_devtype="1732/03", NAME="%k" \
> > SYMLINK="zfcp-%s{hba_id}-%s{wwpn}:%s{fcp_lun}"
> >
> > I know this could also be done with an external program, but having this
> > incorporated into udev makes life easier, especially if run from
> > initramfs. Plus it makes the rules easier to follow, as the result is
> > directly visible and need not to be looked up in some external program.
> >
> > Comments etc. welcome.
>
> Oops, sorry I missed this for the 017 release. I'll look at it tomorrow
> and get back to you. At first glance it looks like a good thing.
>
> Oh, you forgot to update the documentation, that's important to do if
> you want this change to make it in :)
I took a part of the code and made a version that uses already implemented
attribute finding logic.
The parsing of the format length '%3x' and the '%x{attribute}' is a fuction now,
maybe there are more possible users in the future.
I've also added the test to udev-test.pl.
2004-02-17 08:36:34 +03:00
break ;
}
2005-06-20 02:29:38 +04:00
/* possibly truncate to format-char specified length */
if ( len ! = - 1 ) {
head [ len ] = ' \0 ' ;
dbg ( " truncate to %i chars, subtitution string becomes '%s' " , len , head ) ;
}
strlcat ( string , temp , maxsize ) ;
2003-11-24 09:25:13 +03:00
}
}
2005-07-05 17:24:41 +04:00
static char * key_val ( struct udev_rule * rule , struct key * key )
{
return rule - > buf + key - > val_off ;
}
static char * key_pair_name ( struct udev_rule * rule , struct key_pair * pair )
{
return rule - > buf + pair - > key_name_off ;
}
static int match_key ( const char * key_name , struct udev_rule * rule , struct key * key , const char * val )
2005-07-04 21:44:25 +04:00
{
int match ;
2005-07-12 14:52:56 +04:00
char value [ PATH_SIZE ] ;
2005-07-05 17:24:41 +04:00
char * key_value ;
2005-07-12 14:52:56 +04:00
char * pos ;
2005-07-04 21:44:25 +04:00
2005-07-05 17:24:41 +04:00
if ( key - > operation = = KEY_OP_UNSET )
2005-07-04 21:44:25 +04:00
return 0 ;
2005-07-12 14:52:56 +04:00
strlcpy ( value , rule - > buf + key - > val_off , sizeof ( value ) ) ;
key_value = value ;
2005-07-05 17:24:41 +04:00
2005-07-12 14:52:56 +04:00
dbg ( " key %s value='%s' " , key_name , key_value ) ;
while ( key_value ) {
pos = strchr ( key_value , ' | ' ) ;
if ( pos ) {
pos [ 0 ] = ' \0 ' ;
pos + + ;
}
dbg ( " match %s '%s' <-> '%s' " , key_name , key_value , val ) ;
match = ( strcmp_pattern ( key_value , val ) = = 0 ) ;
if ( match & & ( key - > operation ! = KEY_OP_NOMATCH ) ) {
dbg ( " %s is true (matching value) " , key_name ) ;
return 0 ;
}
if ( ! match & & ( key - > operation = = KEY_OP_NOMATCH ) ) {
dbg ( " %s is true (non-matching value) " , key_name ) ;
return 0 ;
}
key_value = pos ;
2005-07-04 21:44:25 +04:00
}
2005-07-12 14:52:56 +04:00
dbg ( " %s is false " , key_name ) ;
2005-07-04 21:44:25 +04:00
return - 1 ;
}
2005-03-13 00:36:32 +03:00
static int match_rule ( struct udevice * udev , struct udev_rule * rule ,
2004-11-29 15:44:01 +03:00
struct sysfs_class_device * class_dev , struct sysfs_device * sysfs_device )
2003-12-20 12:05:13 +03:00
{
2005-03-28 04:12:39 +04:00
struct sysfs_device * parent_device = sysfs_device ;
2005-08-16 06:25:20 +04:00
int i ;
2005-03-28 04:12:39 +04:00
2005-07-05 17:24:41 +04:00
if ( match_key ( " ACTION " , rule , & rule - > action , udev - > action ) )
2005-07-04 21:44:25 +04:00
goto exit ;
2005-04-02 19:45:35 +04:00
2005-07-05 17:24:41 +04:00
if ( match_key ( " KERNEL " , rule , & rule - > kernel_name , udev - > kernel_name ) )
2005-07-04 21:44:25 +04:00
goto exit ;
2003-11-13 16:52:08 +03:00
2005-07-05 17:24:41 +04:00
if ( match_key ( " SUBSYSTEM " , rule , & rule - > subsystem , udev - > subsystem ) )
2005-07-04 21:44:25 +04:00
goto exit ;
2004-11-12 08:52:55 +03:00
2005-07-05 17:24:41 +04:00
if ( match_key ( " DEVPATH " , rule , & rule - > devpath , udev - > devpath ) )
2005-07-04 21:44:25 +04:00
goto exit ;
2005-06-20 02:29:38 +04:00
2005-07-05 17:24:41 +04:00
if ( rule - > modalias . operation ! = KEY_OP_UNSET ) {
2005-06-20 02:29:38 +04:00
char value [ NAME_SIZE ] ;
if ( find_sysfs_attribute ( NULL , sysfs_device , " modalias " , value , sizeof ( value ) ) ! = 0 ) {
2005-07-04 22:42:04 +04:00
dbg ( " MODALIAS value not found " ) ;
2005-06-20 02:29:38 +04:00
goto exit ;
}
2005-07-05 17:24:41 +04:00
if ( match_key ( " MODALIAS " , rule , & rule - > modalias , value ) )
2005-07-04 21:44:25 +04:00
goto exit ;
2005-06-20 02:29:38 +04:00
}
2005-08-16 06:25:20 +04:00
for ( i = 0 ; i < rule - > env . count ; i + + ) {
struct key_pair * pair = & rule - > env . keys [ i ] ;
2005-03-13 13:40:32 +03:00
2005-08-16 06:25:20 +04:00
/* we only check for matches, assignments will be handled later */
if ( pair - > key . operation ! = KEY_OP_ASSIGN ) {
2005-07-05 17:24:41 +04:00
const char * key_name = key_pair_name ( rule , pair ) ;
const char * value = getenv ( key_name ) ;
2005-03-13 13:40:32 +03:00
if ( ! value ) {
2005-08-16 06:25:20 +04:00
dbg ( " ENV{'%s'} is not set, treat as empty " , key_name ) ;
2005-07-16 07:50:34 +04:00
value = " " ;
2005-03-13 13:40:32 +03:00
}
2005-07-05 17:24:41 +04:00
if ( match_key ( " ENV " , rule , & pair - > key , value ) )
2005-07-04 21:44:25 +04:00
goto exit ;
2005-03-13 13:40:32 +03:00
}
}
2005-07-07 22:05:51 +04:00
if ( rule - > wait_for_sysfs . operation ! = KEY_OP_UNSET ) {
int match ;
match = ( wait_for_sysfs ( udev , key_val ( rule , & rule - > wait_for_sysfs ) , 3 ) = = 0 ) ;
if ( match & & ( rule - > wait_for_sysfs . operation ! = KEY_OP_NOMATCH ) ) {
2005-07-12 14:52:56 +04:00
dbg ( " WAIT_FOR_SYSFS is true (matching value) " ) ;
2005-07-07 22:05:51 +04:00
return 0 ;
}
if ( ! match & & ( rule - > wait_for_sysfs . operation = = KEY_OP_NOMATCH ) ) {
2005-07-12 14:52:56 +04:00
dbg ( " WAIT_FOR_SYSFS is true, (non matching value) " ) ;
2005-07-07 22:05:51 +04:00
return 0 ;
}
2005-07-12 14:52:56 +04:00
dbg ( " WAIT_FOR_SYSFS is false " ) ;
2005-07-07 22:05:51 +04:00
return - 1 ;
}
2005-02-14 03:46:05 +03:00
/* walk up the chain of physical devices and find a match */
2005-02-11 20:33:40 +03:00
while ( 1 ) {
2004-11-13 07:21:12 +03:00
/* check for matching driver */
2005-07-05 17:24:41 +04:00
if ( rule - > driver . operation ! = KEY_OP_UNSET ) {
2005-03-28 04:12:39 +04:00
if ( parent_device = = NULL ) {
2005-03-09 04:12:22 +03:00
dbg ( " device has no sysfs_device " ) ;
2005-03-14 06:18:20 +03:00
goto exit ;
2005-03-09 04:12:22 +03:00
}
2005-07-05 17:24:41 +04:00
if ( match_key ( " DRIVER " , rule , & rule - > driver , parent_device - > driver_name ) )
2005-07-04 21:44:25 +04:00
goto try_parent ;
2004-11-13 07:21:12 +03:00
}
2005-02-11 07:21:03 +03:00
/* check for matching bus value */
2005-07-05 17:24:41 +04:00
if ( rule - > bus . operation ! = KEY_OP_UNSET ) {
2005-03-28 04:12:39 +04:00
if ( parent_device = = NULL ) {
2005-03-09 04:12:22 +03:00
dbg ( " device has no sysfs_device " ) ;
2005-03-14 06:18:20 +03:00
goto exit ;
2005-02-11 07:21:03 +03:00
}
2005-07-05 17:24:41 +04:00
if ( match_key ( " BUS " , rule , & rule - > bus , parent_device - > bus ) )
2005-07-04 21:44:25 +04:00
goto try_parent ;
2005-02-11 07:21:03 +03:00
}
[PATCH] udev - drop all methods :)
> Hi,
> as promised yesterday, here is a patch that drops the explicit methods
> given in the udev config and implement only one type of rule.
>
> A rule now consists only of a number of keys to match. All known keys
> are valid in any combination. The former configs should work with a few
> changes:
>
> o the "<METHOD>, " at the beginning of the line should be removed
>
> o the result of the externel program is matched with RESULT= instead if ID=
> the PROGRAM= key is only valid if the program exits with zero
> (just exit with nozero in a script if the rule should not match)
>
> o rules are processed in order they appear in the file, no priority
>
> o if NAME="" is given, udev is instructed to ignore this device,
> no node will be created
>
>
> EXAMPLE:
>
> # combined BUS, SYSFS and KERNEL
> BUS="usb", KERNEL="video*", SYSFS_model="Creative Labs WebCam*", NAME="test/webcam%n"
>
> # exec script only for the first ide drive (hda), all other will be skipped
> BUS="ide", KERNEL="hda*", PROGRAM="/home/kay/src/udev.kay/extras/ide-devfs.sh %k %b %n", RESULT="hd*", NAME="%1c", SYMLINK="%2c %3c"
>
>
> The udev-test.pl and test.block works fine here.
> Please adapt your config and give it a try.
>
Here is a slightly better version of the patch.
After a conversation with Patrick, we are now able to execute the PROGRAM
and also match in all following rules with the RESULT value from this exec.
EXAMPLE:
We have 7 rules with RESULT and 2 with PROGRAM.
Only the 5th rule matches with the callout result from the exec in the 4th rule.
RULES:
PROGRAM="/bin/echo abc", RESULT="no_match", NAME="web-no-2"
KERNEL="video*", RESULT="123", NAME="web-no-3"
KERNEL="video*", RESULT="123", NAME="web-no-4"
PROGRAM="/bin/echo 123", RESULT="no_match", NAME="web-no-5"
KERNEL="video*", RESULT="123", NAME="web-yes"
RESULT:
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: process rule
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: check PROGRAM
Jan 11 23:36:52 pim udev[26050]: execute_program: executing '/bin/echo abc'
Jan 11 23:36:52 pim udev[26050]: execute_program: result is 'abc'
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: PROGRAM returned successful
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: check for RESULT dev->result='no_match', udev->program_result='abc'
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: RESULT is not matching
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: process rule
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: check for KERNEL dev->kernel='video*' class_dev->name='video0'
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: KERNEL matches
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: check for RESULT dev->result='123', udev->program_result='abc'
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: RESULT is not matching
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: process rule
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: check for KERNEL dev->kernel='video*' class_dev->name='video0'
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: KERNEL matches
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: check for RESULT dev->result='123', udev->program_result='abc'
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: RESULT is not matching
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: process rule
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: check PROGRAM
Jan 11 23:36:52 pim udev[26050]: execute_program: executing '/bin/echo 123'
Jan 11 23:36:52 pim udev[26050]: execute_program: result is '123'
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: PROGRAM returned successful
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: check for RESULT dev->result='no_match', udev->program_result='123'
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: RESULT is not matching
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: process rule
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: check for KERNEL dev->kernel='video*' class_dev->name='video0'
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: KERNEL matches
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: check for RESULT dev->result='123', udev->program_result='123'
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: RESULT matches
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: found matching rule, 'video*' becomes ''
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: name, 'web-yes' is going to have owner='', group='', mode = 0600
2004-01-13 08:39:05 +03:00
/* check for matching bus id */
2005-07-05 17:24:41 +04:00
if ( rule - > id . operation ! = KEY_OP_UNSET ) {
2005-03-28 04:12:39 +04:00
if ( parent_device = = NULL ) {
2005-03-09 04:12:22 +03:00
dbg ( " device has no sysfs_device " ) ;
2005-03-14 06:18:20 +03:00
goto exit ;
2005-03-09 04:12:22 +03:00
}
2005-07-05 17:24:41 +04:00
if ( match_key ( " ID " , rule , & rule - > id , parent_device - > bus_id ) )
2005-07-04 21:44:25 +04:00
goto try_parent ;
[PATCH] udev - drop all methods :)
> Hi,
> as promised yesterday, here is a patch that drops the explicit methods
> given in the udev config and implement only one type of rule.
>
> A rule now consists only of a number of keys to match. All known keys
> are valid in any combination. The former configs should work with a few
> changes:
>
> o the "<METHOD>, " at the beginning of the line should be removed
>
> o the result of the externel program is matched with RESULT= instead if ID=
> the PROGRAM= key is only valid if the program exits with zero
> (just exit with nozero in a script if the rule should not match)
>
> o rules are processed in order they appear in the file, no priority
>
> o if NAME="" is given, udev is instructed to ignore this device,
> no node will be created
>
>
> EXAMPLE:
>
> # combined BUS, SYSFS and KERNEL
> BUS="usb", KERNEL="video*", SYSFS_model="Creative Labs WebCam*", NAME="test/webcam%n"
>
> # exec script only for the first ide drive (hda), all other will be skipped
> BUS="ide", KERNEL="hda*", PROGRAM="/home/kay/src/udev.kay/extras/ide-devfs.sh %k %b %n", RESULT="hd*", NAME="%1c", SYMLINK="%2c %3c"
>
>
> The udev-test.pl and test.block works fine here.
> Please adapt your config and give it a try.
>
Here is a slightly better version of the patch.
After a conversation with Patrick, we are now able to execute the PROGRAM
and also match in all following rules with the RESULT value from this exec.
EXAMPLE:
We have 7 rules with RESULT and 2 with PROGRAM.
Only the 5th rule matches with the callout result from the exec in the 4th rule.
RULES:
PROGRAM="/bin/echo abc", RESULT="no_match", NAME="web-no-2"
KERNEL="video*", RESULT="123", NAME="web-no-3"
KERNEL="video*", RESULT="123", NAME="web-no-4"
PROGRAM="/bin/echo 123", RESULT="no_match", NAME="web-no-5"
KERNEL="video*", RESULT="123", NAME="web-yes"
RESULT:
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: process rule
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: check PROGRAM
Jan 11 23:36:52 pim udev[26050]: execute_program: executing '/bin/echo abc'
Jan 11 23:36:52 pim udev[26050]: execute_program: result is 'abc'
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: PROGRAM returned successful
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: check for RESULT dev->result='no_match', udev->program_result='abc'
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: RESULT is not matching
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: process rule
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: check for KERNEL dev->kernel='video*' class_dev->name='video0'
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: KERNEL matches
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: check for RESULT dev->result='123', udev->program_result='abc'
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: RESULT is not matching
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: process rule
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: check for KERNEL dev->kernel='video*' class_dev->name='video0'
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: KERNEL matches
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: check for RESULT dev->result='123', udev->program_result='abc'
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: RESULT is not matching
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: process rule
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: check PROGRAM
Jan 11 23:36:52 pim udev[26050]: execute_program: executing '/bin/echo 123'
Jan 11 23:36:52 pim udev[26050]: execute_program: result is '123'
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: PROGRAM returned successful
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: check for RESULT dev->result='no_match', udev->program_result='123'
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: RESULT is not matching
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: process rule
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: check for KERNEL dev->kernel='video*' class_dev->name='video0'
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: KERNEL matches
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: check for RESULT dev->result='123', udev->program_result='123'
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: RESULT matches
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: found matching rule, 'video*' becomes ''
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: name, 'web-yes' is going to have owner='', group='', mode = 0600
2004-01-13 08:39:05 +03:00
}
2003-11-13 16:52:08 +03:00
[PATCH] udev - drop all methods :)
> Hi,
> as promised yesterday, here is a patch that drops the explicit methods
> given in the udev config and implement only one type of rule.
>
> A rule now consists only of a number of keys to match. All known keys
> are valid in any combination. The former configs should work with a few
> changes:
>
> o the "<METHOD>, " at the beginning of the line should be removed
>
> o the result of the externel program is matched with RESULT= instead if ID=
> the PROGRAM= key is only valid if the program exits with zero
> (just exit with nozero in a script if the rule should not match)
>
> o rules are processed in order they appear in the file, no priority
>
> o if NAME="" is given, udev is instructed to ignore this device,
> no node will be created
>
>
> EXAMPLE:
>
> # combined BUS, SYSFS and KERNEL
> BUS="usb", KERNEL="video*", SYSFS_model="Creative Labs WebCam*", NAME="test/webcam%n"
>
> # exec script only for the first ide drive (hda), all other will be skipped
> BUS="ide", KERNEL="hda*", PROGRAM="/home/kay/src/udev.kay/extras/ide-devfs.sh %k %b %n", RESULT="hd*", NAME="%1c", SYMLINK="%2c %3c"
>
>
> The udev-test.pl and test.block works fine here.
> Please adapt your config and give it a try.
>
Here is a slightly better version of the patch.
After a conversation with Patrick, we are now able to execute the PROGRAM
and also match in all following rules with the RESULT value from this exec.
EXAMPLE:
We have 7 rules with RESULT and 2 with PROGRAM.
Only the 5th rule matches with the callout result from the exec in the 4th rule.
RULES:
PROGRAM="/bin/echo abc", RESULT="no_match", NAME="web-no-2"
KERNEL="video*", RESULT="123", NAME="web-no-3"
KERNEL="video*", RESULT="123", NAME="web-no-4"
PROGRAM="/bin/echo 123", RESULT="no_match", NAME="web-no-5"
KERNEL="video*", RESULT="123", NAME="web-yes"
RESULT:
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: process rule
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: check PROGRAM
Jan 11 23:36:52 pim udev[26050]: execute_program: executing '/bin/echo abc'
Jan 11 23:36:52 pim udev[26050]: execute_program: result is 'abc'
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: PROGRAM returned successful
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: check for RESULT dev->result='no_match', udev->program_result='abc'
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: RESULT is not matching
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: process rule
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: check for KERNEL dev->kernel='video*' class_dev->name='video0'
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: KERNEL matches
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: check for RESULT dev->result='123', udev->program_result='abc'
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: RESULT is not matching
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: process rule
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: check for KERNEL dev->kernel='video*' class_dev->name='video0'
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: KERNEL matches
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: check for RESULT dev->result='123', udev->program_result='abc'
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: RESULT is not matching
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: process rule
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: check PROGRAM
Jan 11 23:36:52 pim udev[26050]: execute_program: executing '/bin/echo 123'
Jan 11 23:36:52 pim udev[26050]: execute_program: result is '123'
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: PROGRAM returned successful
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: check for RESULT dev->result='no_match', udev->program_result='123'
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: RESULT is not matching
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: process rule
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: check for KERNEL dev->kernel='video*' class_dev->name='video0'
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: KERNEL matches
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: check for RESULT dev->result='123', udev->program_result='123'
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: RESULT matches
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: found matching rule, 'video*' becomes ''
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: name, 'web-yes' is going to have owner='', group='', mode = 0600
2004-01-13 08:39:05 +03:00
/* check for matching sysfs pairs */
2005-07-05 17:24:41 +04:00
if ( rule - > sysfs . count ) {
dbg ( " check %i SYSFS keys " , rule - > sysfs . count ) ;
for ( i = 0 ; i < rule - > sysfs . count ; i + + ) {
struct key_pair * pair = & rule - > sysfs . keys [ i ] ;
const char * key_name = key_pair_name ( rule , pair ) ;
const char * key_value = key_val ( rule , & pair - > key ) ;
2005-03-28 14:20:05 +04:00
char value [ VALUE_SIZE ] ;
2005-03-28 14:37:54 +04:00
size_t len ;
2005-03-13 13:40:32 +03:00
2005-07-05 17:24:41 +04:00
if ( find_sysfs_attribute ( class_dev , parent_device , key_name , value , sizeof ( value ) ) ! = 0 )
2005-03-28 14:20:05 +04:00
goto try_parent ;
/* strip trailing whitespace of value, if not asked to match for it */
2005-07-05 17:24:41 +04:00
len = strlen ( key_value ) ;
if ( len & & ! isspace ( key_value [ len - 1 ] ) ) {
2005-03-28 14:37:54 +04:00
len = strlen ( value ) ;
2005-03-28 14:20:05 +04:00
while ( len > 0 & & isspace ( value [ len - 1 ] ) )
value [ - - len ] = ' \0 ' ;
2005-06-27 19:04:56 +04:00
dbg ( " removed %zi trailing whitespace chars from '%s' " , strlen ( value ) - len , value ) ;
2005-03-28 14:20:05 +04:00
}
2005-07-05 17:24:41 +04:00
if ( match_key ( " SYSFS " , rule , & pair - > key , value ) )
2005-07-04 21:44:25 +04:00
goto try_parent ;
[PATCH] udev - drop all methods :)
> Hi,
> as promised yesterday, here is a patch that drops the explicit methods
> given in the udev config and implement only one type of rule.
>
> A rule now consists only of a number of keys to match. All known keys
> are valid in any combination. The former configs should work with a few
> changes:
>
> o the "<METHOD>, " at the beginning of the line should be removed
>
> o the result of the externel program is matched with RESULT= instead if ID=
> the PROGRAM= key is only valid if the program exits with zero
> (just exit with nozero in a script if the rule should not match)
>
> o rules are processed in order they appear in the file, no priority
>
> o if NAME="" is given, udev is instructed to ignore this device,
> no node will be created
>
>
> EXAMPLE:
>
> # combined BUS, SYSFS and KERNEL
> BUS="usb", KERNEL="video*", SYSFS_model="Creative Labs WebCam*", NAME="test/webcam%n"
>
> # exec script only for the first ide drive (hda), all other will be skipped
> BUS="ide", KERNEL="hda*", PROGRAM="/home/kay/src/udev.kay/extras/ide-devfs.sh %k %b %n", RESULT="hd*", NAME="%1c", SYMLINK="%2c %3c"
>
>
> The udev-test.pl and test.block works fine here.
> Please adapt your config and give it a try.
>
Here is a slightly better version of the patch.
After a conversation with Patrick, we are now able to execute the PROGRAM
and also match in all following rules with the RESULT value from this exec.
EXAMPLE:
We have 7 rules with RESULT and 2 with PROGRAM.
Only the 5th rule matches with the callout result from the exec in the 4th rule.
RULES:
PROGRAM="/bin/echo abc", RESULT="no_match", NAME="web-no-2"
KERNEL="video*", RESULT="123", NAME="web-no-3"
KERNEL="video*", RESULT="123", NAME="web-no-4"
PROGRAM="/bin/echo 123", RESULT="no_match", NAME="web-no-5"
KERNEL="video*", RESULT="123", NAME="web-yes"
RESULT:
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: process rule
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: check PROGRAM
Jan 11 23:36:52 pim udev[26050]: execute_program: executing '/bin/echo abc'
Jan 11 23:36:52 pim udev[26050]: execute_program: result is 'abc'
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: PROGRAM returned successful
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: check for RESULT dev->result='no_match', udev->program_result='abc'
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: RESULT is not matching
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: process rule
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: check for KERNEL dev->kernel='video*' class_dev->name='video0'
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: KERNEL matches
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: check for RESULT dev->result='123', udev->program_result='abc'
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: RESULT is not matching
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: process rule
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: check for KERNEL dev->kernel='video*' class_dev->name='video0'
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: KERNEL matches
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: check for RESULT dev->result='123', udev->program_result='abc'
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: RESULT is not matching
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: process rule
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: check PROGRAM
Jan 11 23:36:52 pim udev[26050]: execute_program: executing '/bin/echo 123'
Jan 11 23:36:52 pim udev[26050]: execute_program: result is '123'
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: PROGRAM returned successful
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: check for RESULT dev->result='no_match', udev->program_result='123'
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: RESULT is not matching
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: process rule
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: check for KERNEL dev->kernel='video*' class_dev->name='video0'
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: KERNEL matches
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: check for RESULT dev->result='123', udev->program_result='123'
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: RESULT matches
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: found matching rule, 'video*' becomes ''
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: name, 'web-yes' is going to have owner='', group='', mode = 0600
2004-01-13 08:39:05 +03:00
}
2005-07-05 17:24:41 +04:00
dbg ( " all %i SYSFS keys matched " , rule - > sysfs . count ) ;
[PATCH] udev - drop all methods :)
> Hi,
> as promised yesterday, here is a patch that drops the explicit methods
> given in the udev config and implement only one type of rule.
>
> A rule now consists only of a number of keys to match. All known keys
> are valid in any combination. The former configs should work with a few
> changes:
>
> o the "<METHOD>, " at the beginning of the line should be removed
>
> o the result of the externel program is matched with RESULT= instead if ID=
> the PROGRAM= key is only valid if the program exits with zero
> (just exit with nozero in a script if the rule should not match)
>
> o rules are processed in order they appear in the file, no priority
>
> o if NAME="" is given, udev is instructed to ignore this device,
> no node will be created
>
>
> EXAMPLE:
>
> # combined BUS, SYSFS and KERNEL
> BUS="usb", KERNEL="video*", SYSFS_model="Creative Labs WebCam*", NAME="test/webcam%n"
>
> # exec script only for the first ide drive (hda), all other will be skipped
> BUS="ide", KERNEL="hda*", PROGRAM="/home/kay/src/udev.kay/extras/ide-devfs.sh %k %b %n", RESULT="hd*", NAME="%1c", SYMLINK="%2c %3c"
>
>
> The udev-test.pl and test.block works fine here.
> Please adapt your config and give it a try.
>
Here is a slightly better version of the patch.
After a conversation with Patrick, we are now able to execute the PROGRAM
and also match in all following rules with the RESULT value from this exec.
EXAMPLE:
We have 7 rules with RESULT and 2 with PROGRAM.
Only the 5th rule matches with the callout result from the exec in the 4th rule.
RULES:
PROGRAM="/bin/echo abc", RESULT="no_match", NAME="web-no-2"
KERNEL="video*", RESULT="123", NAME="web-no-3"
KERNEL="video*", RESULT="123", NAME="web-no-4"
PROGRAM="/bin/echo 123", RESULT="no_match", NAME="web-no-5"
KERNEL="video*", RESULT="123", NAME="web-yes"
RESULT:
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: process rule
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: check PROGRAM
Jan 11 23:36:52 pim udev[26050]: execute_program: executing '/bin/echo abc'
Jan 11 23:36:52 pim udev[26050]: execute_program: result is 'abc'
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: PROGRAM returned successful
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: check for RESULT dev->result='no_match', udev->program_result='abc'
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: RESULT is not matching
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: process rule
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: check for KERNEL dev->kernel='video*' class_dev->name='video0'
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: KERNEL matches
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: check for RESULT dev->result='123', udev->program_result='abc'
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: RESULT is not matching
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: process rule
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: check for KERNEL dev->kernel='video*' class_dev->name='video0'
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: KERNEL matches
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: check for RESULT dev->result='123', udev->program_result='abc'
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: RESULT is not matching
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: process rule
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: check PROGRAM
Jan 11 23:36:52 pim udev[26050]: execute_program: executing '/bin/echo 123'
Jan 11 23:36:52 pim udev[26050]: execute_program: result is '123'
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: PROGRAM returned successful
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: check for RESULT dev->result='no_match', udev->program_result='123'
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: RESULT is not matching
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: process rule
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: check for KERNEL dev->kernel='video*' class_dev->name='video0'
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: KERNEL matches
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: check for RESULT dev->result='123', udev->program_result='123'
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: RESULT matches
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: found matching rule, 'video*' becomes ''
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: name, 'web-yes' is going to have owner='', group='', mode = 0600
2004-01-13 08:39:05 +03:00
}
2005-02-14 03:46:05 +03:00
/* found matching physical device */
break ;
2004-02-12 09:28:51 +03:00
try_parent :
dbg ( " try parent sysfs device " ) ;
2005-03-28 04:12:39 +04:00
parent_device = sysfs_get_device_parent ( parent_device ) ;
if ( parent_device = = NULL )
2005-02-11 07:21:03 +03:00
goto exit ;
2005-03-28 04:12:39 +04:00
dbg ( " look at sysfs_device->path='%s' " , parent_device - > path ) ;
dbg ( " look at sysfs_device->bus_id='%s' " , parent_device - > bus_id ) ;
2004-01-23 11:21:13 +03:00
}
2005-02-11 07:21:03 +03:00
2005-02-14 03:46:05 +03:00
/* execute external program */
2005-07-05 17:24:41 +04:00
if ( rule - > program . operation ! = KEY_OP_UNSET ) {
2005-03-07 06:29:43 +03:00
char program [ PATH_SIZE ] ;
2005-06-25 17:35:14 +04:00
char result [ PATH_SIZE ] ;
2005-02-14 03:46:05 +03:00
2005-07-05 17:24:41 +04:00
strlcpy ( program , key_val ( rule , & rule - > program ) , sizeof ( program ) ) ;
2005-02-14 03:46:05 +03:00
apply_format ( udev , program , sizeof ( program ) , class_dev , sysfs_device ) ;
2005-08-15 13:57:04 +04:00
if ( run_program ( program , udev - > subsystem , result , sizeof ( result ) , NULL , ( udev_log_priority > = LOG_INFO ) ) ! = 0 ) {
2005-07-12 14:52:56 +04:00
dbg ( " PROGRAM is false " ) ;
2005-08-11 19:32:59 +04:00
udev - > program_result [ 0 ] = ' \0 ' ;
2005-07-05 17:24:41 +04:00
if ( rule - > program . operation ! = KEY_OP_NOMATCH )
2005-03-13 07:46:31 +03:00
goto exit ;
} else {
2005-07-04 22:42:04 +04:00
dbg ( " PROGRAM matches " ) ;
2005-06-25 17:35:14 +04:00
remove_trailing_char ( result , ' \n ' ) ;
replace_untrusted_chars ( result ) ;
dbg ( " result is '%s' " , result ) ;
strlcpy ( udev - > program_result , result , sizeof ( udev - > program_result ) ) ;
2005-07-04 22:42:04 +04:00
dbg ( " PROGRAM returned successful " ) ;
2005-07-05 17:24:41 +04:00
if ( rule - > program . operation = = KEY_OP_NOMATCH )
2005-03-13 07:46:31 +03:00
goto exit ;
2005-02-14 03:46:05 +03:00
}
2005-07-04 22:42:04 +04:00
dbg ( " PROGRAM key is true " ) ;
2005-02-14 03:46:05 +03:00
}
/* check for matching result of external program */
2005-07-05 17:24:41 +04:00
if ( match_key ( " RESULT " , rule , & rule - > result , udev - > program_result ) )
2005-07-04 21:44:25 +04:00
goto exit ;
2005-02-14 03:46:05 +03:00
2005-08-16 06:25:20 +04:00
/* import variables returned from program or or file into environment */
if ( rule - > import . operation ! = KEY_OP_UNSET ) {
char import [ PATH_SIZE ] ;
int rc = - 1 ;
strlcpy ( import , key_val ( rule , & rule - > import ) , sizeof ( import ) ) ;
apply_format ( udev , import , sizeof ( import ) , class_dev , sysfs_device ) ;
dbg ( " check for IMPORT import='%s' " , import ) ;
if ( rule - > import_type = = IMPORT_PROGRAM ) {
rc = import_program_into_env ( udev , import ) ;
} else if ( rule - > import_type = = IMPORT_FILE ) {
dbg ( " import file import='%s' " , import ) ;
rc = import_file_into_env ( udev , import ) ;
} else if ( rule - > import_type = = IMPORT_PARENT & & class_dev ) {
dbg ( " import parent import='%s' " , import ) ;
rc = import_parent_into_env ( udev , class_dev , import ) ;
}
if ( rc ) {
dbg ( " IMPORT failed " ) ;
if ( rule - > import . operation ! = KEY_OP_NOMATCH )
goto exit ;
} else
dbg ( " IMPORT '%s' imported " , key_val ( rule , & rule - > import ) ) ;
dbg ( " IMPORT key is true " ) ;
}
/* rule matches, if we have ENV assignments export it */
for ( i = 0 ; i < rule - > env . count ; i + + ) {
struct key_pair * pair = & rule - > env . keys [ i ] ;
if ( pair - > key . operation = = KEY_OP_ASSIGN ) {
const char * key_name = key_pair_name ( rule , pair ) ;
const char * value = key_val ( rule , & pair - > key ) ;
2005-08-26 23:38:18 +04:00
name_list_key_add ( & udev - > env_list , key_name , value ) ;
2005-08-16 06:25:20 +04:00
setenv ( key_name , value , 1 ) ;
dbg ( " export ENV '%s=%s' " , key_name , value ) ;
}
}
2005-02-14 03:46:05 +03:00
return 0 ;
2005-02-11 07:21:03 +03:00
exit :
return - 1 ;
2004-01-23 11:21:13 +03:00
}
2005-07-05 17:24:41 +04:00
int udev_rules_get_name ( struct udev_rules * rules , struct udevice * udev , struct sysfs_class_device * class_dev )
2004-01-23 11:21:13 +03:00
{
2004-10-15 07:36:07 +04:00
struct sysfs_class_device * class_dev_parent ;
2004-01-23 11:21:13 +03:00
struct sysfs_device * sysfs_device = NULL ;
2005-03-13 00:36:32 +03:00
struct udev_rule * rule ;
2005-07-08 00:32:48 +04:00
int name_set = 0 ;
2004-01-23 11:21:13 +03:00
2004-10-15 07:36:07 +04:00
dbg ( " class_dev->name='%s' " , class_dev - > name ) ;
/* Figure out where the "device"-symlink is at. For char devices this will
* always be in the class_dev - > path . On block devices , only the main block
* device will have the device symlink in it ' s path . All partition devices
* need to look at the symlink in its parent directory .
*/
class_dev_parent = sysfs_get_classdev_parent ( class_dev ) ;
if ( class_dev_parent ! = NULL ) {
dbg ( " given class device has a parent, use this instead " ) ;
sysfs_device = sysfs_get_classdev_device ( class_dev_parent ) ;
} else {
sysfs_device = sysfs_get_classdev_device ( class_dev ) ;
}
2004-01-23 11:21:13 +03:00
if ( sysfs_device ) {
2004-10-19 06:11:51 +04:00
dbg ( " found devices device: path='%s', bus_id='%s', bus='%s' " ,
2004-10-15 07:36:07 +04:00
sysfs_device - > path , sysfs_device - > bus_id , sysfs_device - > bus ) ;
2005-03-07 06:29:43 +03:00
strlcpy ( udev - > bus_id , sysfs_device - > bus_id , sizeof ( udev - > bus_id ) ) ;
2004-01-23 11:21:13 +03:00
}
2005-02-21 16:48:12 +03:00
dbg ( " udev->kernel_name='%s' " , udev - > kernel_name ) ;
2004-01-23 11:21:13 +03:00
/* look for a matching rule to apply */
2005-07-05 17:24:41 +04:00
udev_rules_iter_init ( rules ) ;
2005-06-24 20:05:32 +04:00
while ( 1 ) {
2005-07-05 17:24:41 +04:00
rule = udev_rules_iter_next ( rules ) ;
2005-06-24 20:05:32 +04:00
if ( rule = = NULL )
break ;
2005-07-08 00:32:48 +04:00
if ( name_set & & rule - > name . operation ! = KEY_OP_UNSET ) {
2005-06-20 02:29:38 +04:00
dbg ( " node name already set, rule ignored " ) ;
continue ;
}
2004-01-23 11:21:13 +03:00
dbg ( " process rule " ) ;
2005-03-13 00:36:32 +03:00
if ( match_rule ( udev , rule , class_dev , sysfs_device ) = = 0 ) {
2005-02-14 08:03:06 +03:00
/* apply options */
2005-03-13 00:36:32 +03:00
if ( rule - > ignore_device ) {
2005-07-05 17:24:41 +04:00
info ( " rule applied, '%s' is ignored " , udev - > kernel_name ) ;
2005-04-02 19:45:35 +04:00
udev - > ignore_device = 1 ;
return 0 ;
2005-02-14 08:03:06 +03:00
}
2005-03-13 00:36:32 +03:00
if ( rule - > ignore_remove ) {
2005-03-04 22:52:19 +03:00
udev - > ignore_remove = 1 ;
2005-03-13 00:36:32 +03:00
dbg ( " remove event should be ignored " ) ;
2005-02-14 08:03:06 +03:00
}
/* apply all_partitions option only at a main block device */
2005-03-13 00:36:32 +03:00
if ( rule - > partitions & & udev - > type = = DEV_BLOCK & & udev - > kernel_number [ 0 ] = = ' \0 ' ) {
udev - > partitions = rule - > partitions ;
2005-02-14 08:03:06 +03:00
dbg ( " creation of partition nodes requested " ) ;
}
2005-02-06 02:13:18 +03:00
/* apply permissions */
2005-06-05 06:57:03 +04:00
if ( ! udev - > mode_final & & rule - > mode ! = 0000 ) {
if ( rule - > mode_operation = = KEY_OP_ASSIGN_FINAL )
udev - > mode_final = 1 ;
2005-03-13 00:36:32 +03:00
udev - > mode = rule - > mode ;
2005-07-05 17:24:41 +04:00
dbg ( " applied mode=%#o to '%s' " , rule - > mode , udev - > kernel_name ) ;
2005-02-06 02:13:18 +03:00
}
2005-07-05 17:24:41 +04:00
if ( ! udev - > owner_final & & rule - > owner . operation ! = KEY_OP_UNSET ) {
if ( rule - > owner . operation = = KEY_OP_ASSIGN_FINAL )
2005-06-05 06:57:03 +04:00
udev - > owner_final = 1 ;
2005-07-05 17:24:41 +04:00
strlcpy ( udev - > owner , key_val ( rule , & rule - > owner ) , sizeof ( udev - > owner ) ) ;
2005-02-06 02:13:18 +03:00
apply_format ( udev , udev - > owner , sizeof ( udev - > owner ) , class_dev , sysfs_device ) ;
dbg ( " applied owner='%s' to '%s' " , udev - > owner , udev - > kernel_name ) ;
}
2005-07-05 17:24:41 +04:00
if ( ! udev - > group_final & & rule - > group . operation ! = KEY_OP_UNSET ) {
if ( rule - > group . operation = = KEY_OP_ASSIGN_FINAL )
2005-06-05 06:57:03 +04:00
udev - > group_final = 1 ;
2005-07-05 17:24:41 +04:00
strlcpy ( udev - > group , key_val ( rule , & rule - > group ) , sizeof ( udev - > group ) ) ;
2005-07-14 13:39:55 +04:00
apply_format ( udev , udev - > group , sizeof ( udev - > group ) , class_dev , sysfs_device ) ;
2005-02-06 02:13:18 +03:00
dbg ( " applied group='%s' to '%s' " , udev - > group , udev - > kernel_name ) ;
}
2005-02-21 16:48:12 +03:00
/* collect symlinks */
2005-07-05 17:24:41 +04:00
if ( ! udev - > symlink_final & & rule - > symlink . operation ! = KEY_OP_UNSET ) {
2005-03-07 06:29:43 +03:00
char temp [ PATH_SIZE ] ;
2005-03-05 07:35:31 +03:00
char * pos , * next ;
2004-03-25 04:34:00 +03:00
2005-07-05 17:24:41 +04:00
if ( rule - > symlink . operation = = KEY_OP_ASSIGN_FINAL )
2005-06-05 06:57:03 +04:00
udev - > symlink_final = 1 ;
2005-07-05 17:24:41 +04:00
if ( rule - > symlink . operation = = KEY_OP_ASSIGN | | rule - > symlink . operation = = KEY_OP_ASSIGN_FINAL ) {
2005-06-05 07:13:33 +04:00
struct name_entry * name_loop ;
struct name_entry * temp_loop ;
2005-06-05 17:55:29 +04:00
info ( " reset symlink list " ) ;
2005-06-05 07:13:33 +04:00
list_for_each_entry_safe ( name_loop , temp_loop , & udev - > symlink_list , node ) {
list_del ( & name_loop - > node ) ;
free ( name_loop ) ;
}
}
2005-07-05 17:24:41 +04:00
strlcpy ( temp , key_val ( rule , & rule - > symlink ) , sizeof ( temp ) ) ;
apply_format ( udev , temp , sizeof ( temp ) , class_dev , sysfs_device ) ;
2005-08-15 13:57:04 +04:00
dbg ( " rule applied, added symlink '%s' " , temp ) ;
2005-07-05 17:24:41 +04:00
/* add multiple symlinks separated by spaces */
pos = temp ;
2005-07-08 01:43:13 +04:00
while ( isspace ( pos [ 0 ] ) )
pos + + ;
next = strchr ( pos , ' ' ) ;
2005-07-05 17:24:41 +04:00
while ( next ) {
next [ 0 ] = ' \0 ' ;
2005-03-27 03:11:03 +04:00
info ( " add symlink '%s' " , pos ) ;
2005-03-05 07:35:31 +03:00
name_list_add ( & udev - > symlink_list , pos , 0 ) ;
2005-07-08 01:43:13 +04:00
while ( isspace ( next [ 1 ] ) )
next + + ;
2005-07-05 17:24:41 +04:00
pos = & next [ 1 ] ;
next = strchr ( pos , ' ' ) ;
2005-03-05 07:35:31 +03:00
}
2005-07-08 01:43:13 +04:00
if ( pos [ 0 ] ! = ' \0 ' ) {
info ( " add symlink '%s' " , pos ) ;
name_list_add ( & udev - > symlink_list , pos , 0 ) ;
}
2004-03-02 09:23:39 +03:00
}
2005-04-02 19:45:35 +04:00
/* set name, later rules with name set will be ignored */
2005-07-05 17:24:41 +04:00
if ( rule - > name . operation ! = KEY_OP_UNSET ) {
2005-07-08 00:32:48 +04:00
name_set = 1 ;
2005-07-05 17:24:41 +04:00
strlcpy ( udev - > name , key_val ( rule , & rule - > name ) , sizeof ( udev - > name ) ) ;
apply_format ( udev , udev - > name , sizeof ( udev - > name ) , class_dev , sysfs_device ) ;
info ( " rule applied, '%s' becomes '%s' " , udev - > kernel_name , udev - > name ) ;
if ( udev - > type ! = DEV_NET )
dbg ( " name, '%s' is going to have owner='%s', group='%s', mode=%#o partitions=%i " ,
udev - > name , udev - > owner , udev - > group , udev - > mode , udev - > partitions ) ;
2005-04-02 19:45:35 +04:00
}
2004-11-29 15:44:01 +03:00
2005-07-05 17:24:41 +04:00
if ( ! udev - > run_final & & rule - > run . operation ! = KEY_OP_UNSET ) {
2005-04-02 19:45:35 +04:00
char program [ PATH_SIZE ] ;
2005-07-05 17:24:41 +04:00
if ( rule - > run . operation = = KEY_OP_ASSIGN_FINAL )
2005-06-05 06:57:03 +04:00
udev - > run_final = 1 ;
2005-07-05 17:24:41 +04:00
if ( rule - > run . operation = = KEY_OP_ASSIGN | | rule - > run . operation = = KEY_OP_ASSIGN_FINAL ) {
2005-06-05 07:13:33 +04:00
struct name_entry * name_loop ;
struct name_entry * temp_loop ;
2005-06-05 17:55:29 +04:00
info ( " reset run list " ) ;
2005-06-05 07:13:33 +04:00
list_for_each_entry_safe ( name_loop , temp_loop , & udev - > run_list , node ) {
list_del ( & name_loop - > node ) ;
free ( name_loop ) ;
}
}
2005-07-05 17:24:41 +04:00
strlcpy ( program , key_val ( rule , & rule - > run ) , sizeof ( program ) ) ;
apply_format ( udev , program , sizeof ( program ) , class_dev , sysfs_device ) ;
dbg ( " add run '%s' " , program ) ;
name_list_add ( & udev - > run_list , program , 0 ) ;
2004-03-02 09:23:39 +03:00
}
2005-03-13 00:55:08 +03:00
if ( rule - > last_rule ) {
dbg ( " last rule to be applied " ) ;
break ;
}
2005-07-16 09:46:31 +04:00
if ( rule - > goto_label . operation ! = KEY_OP_UNSET ) {
dbg ( " moving forward to label '%s' " , key_val ( rule , & rule - > goto_label ) ) ;
udev_rules_iter_label ( rules , key_val ( rule , & rule - > goto_label ) ) ;
}
2004-01-23 11:21:13 +03:00
}
[PATCH] udev - drop all methods :)
> Hi,
> as promised yesterday, here is a patch that drops the explicit methods
> given in the udev config and implement only one type of rule.
>
> A rule now consists only of a number of keys to match. All known keys
> are valid in any combination. The former configs should work with a few
> changes:
>
> o the "<METHOD>, " at the beginning of the line should be removed
>
> o the result of the externel program is matched with RESULT= instead if ID=
> the PROGRAM= key is only valid if the program exits with zero
> (just exit with nozero in a script if the rule should not match)
>
> o rules are processed in order they appear in the file, no priority
>
> o if NAME="" is given, udev is instructed to ignore this device,
> no node will be created
>
>
> EXAMPLE:
>
> # combined BUS, SYSFS and KERNEL
> BUS="usb", KERNEL="video*", SYSFS_model="Creative Labs WebCam*", NAME="test/webcam%n"
>
> # exec script only for the first ide drive (hda), all other will be skipped
> BUS="ide", KERNEL="hda*", PROGRAM="/home/kay/src/udev.kay/extras/ide-devfs.sh %k %b %n", RESULT="hd*", NAME="%1c", SYMLINK="%2c %3c"
>
>
> The udev-test.pl and test.block works fine here.
> Please adapt your config and give it a try.
>
Here is a slightly better version of the patch.
After a conversation with Patrick, we are now able to execute the PROGRAM
and also match in all following rules with the RESULT value from this exec.
EXAMPLE:
We have 7 rules with RESULT and 2 with PROGRAM.
Only the 5th rule matches with the callout result from the exec in the 4th rule.
RULES:
PROGRAM="/bin/echo abc", RESULT="no_match", NAME="web-no-2"
KERNEL="video*", RESULT="123", NAME="web-no-3"
KERNEL="video*", RESULT="123", NAME="web-no-4"
PROGRAM="/bin/echo 123", RESULT="no_match", NAME="web-no-5"
KERNEL="video*", RESULT="123", NAME="web-yes"
RESULT:
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: process rule
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: check PROGRAM
Jan 11 23:36:52 pim udev[26050]: execute_program: executing '/bin/echo abc'
Jan 11 23:36:52 pim udev[26050]: execute_program: result is 'abc'
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: PROGRAM returned successful
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: check for RESULT dev->result='no_match', udev->program_result='abc'
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: RESULT is not matching
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: process rule
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: check for KERNEL dev->kernel='video*' class_dev->name='video0'
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: KERNEL matches
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: check for RESULT dev->result='123', udev->program_result='abc'
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: RESULT is not matching
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: process rule
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: check for KERNEL dev->kernel='video*' class_dev->name='video0'
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: KERNEL matches
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: check for RESULT dev->result='123', udev->program_result='abc'
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: RESULT is not matching
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: process rule
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: check PROGRAM
Jan 11 23:36:52 pim udev[26050]: execute_program: executing '/bin/echo 123'
Jan 11 23:36:52 pim udev[26050]: execute_program: result is '123'
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: PROGRAM returned successful
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: check for RESULT dev->result='no_match', udev->program_result='123'
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: RESULT is not matching
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: process rule
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: check for KERNEL dev->kernel='video*' class_dev->name='video0'
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: KERNEL matches
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: check for RESULT dev->result='123', udev->program_result='123'
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: RESULT matches
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: found matching rule, 'video*' becomes ''
Jan 11 23:36:52 pim udev[26050]: namedev_name_device: name, 'web-yes' is going to have owner='', group='', mode = 0600
2004-01-13 08:39:05 +03:00
}
2003-10-20 08:56:21 +04:00
2005-07-08 00:32:48 +04:00
if ( ! name_set ) {
2005-03-07 06:29:43 +03:00
strlcpy ( udev - > name , udev - > kernel_name , sizeof ( udev - > name ) ) ;
2005-08-11 23:01:46 +04:00
info ( " no node name set, will use kernel name '%s' " , udev - > name ) ;
2005-03-04 22:52:19 +03:00
}
2003-11-13 04:38:14 +03:00
2005-02-09 06:37:32 +03:00
if ( udev - > tmp_node [ 0 ] ! = ' \0 ' ) {
dbg ( " removing temporary device node " ) ;
unlink_secure ( udev - > tmp_node ) ;
udev - > tmp_node [ 0 ] = ' \0 ' ;
}
2003-11-12 19:26:08 +03:00
return 0 ;
2003-07-19 09:48:28 +04:00
}
2005-04-02 19:45:35 +04:00
2005-07-20 20:12:56 +04:00
int udev_rules_get_run ( struct udev_rules * rules , struct udevice * udev ,
struct sysfs_class_device * class_dev , struct sysfs_device * sysfs_dev )
2005-04-02 19:45:35 +04:00
{
struct udev_rule * rule ;
2005-07-20 20:12:56 +04:00
if ( class_dev & & ! sysfs_dev )
sysfs_dev = sysfs_get_classdev_device ( class_dev ) ;
if ( sysfs_dev ) {
dbg ( " found devices device: path='%s', bus_id='%s', bus='%s' " ,
sysfs_dev - > path , sysfs_dev - > bus_id , sysfs_dev - > bus ) ;
strlcpy ( udev - > bus_id , sysfs_dev - > bus_id , sizeof ( udev - > bus_id ) ) ;
}
dbg ( " udev->kernel_name='%s' " , udev - > kernel_name ) ;
2005-04-02 19:45:35 +04:00
/* look for a matching rule to apply */
2005-07-05 17:24:41 +04:00
udev_rules_iter_init ( rules ) ;
2005-06-24 20:05:32 +04:00
while ( 1 ) {
2005-07-05 17:24:41 +04:00
rule = udev_rules_iter_next ( rules ) ;
2005-06-24 20:05:32 +04:00
if ( rule = = NULL )
break ;
2005-04-02 19:45:35 +04:00
2005-06-24 20:05:32 +04:00
dbg ( " process rule " ) ;
2005-07-05 17:24:41 +04:00
if ( rule - > name . operation ! = KEY_OP_UNSET | | rule - > symlink . operation ! = KEY_OP_UNSET | |
rule - > mode_operation ! = KEY_OP_UNSET | | rule - > owner . operation ! = KEY_OP_UNSET | | rule - > group . operation ! = KEY_OP_UNSET ) {
2005-04-02 19:45:35 +04:00
dbg ( " skip rule that names a device " ) ;
continue ;
}
2005-07-20 20:12:56 +04:00
if ( match_rule ( udev , rule , class_dev , sysfs_dev ) = = 0 ) {
2005-06-05 17:55:29 +04:00
if ( rule - > ignore_device ) {
2005-07-05 17:24:41 +04:00
info ( " rule applied, '%s' is ignored " , udev - > kernel_name ) ;
2005-06-05 17:55:29 +04:00
udev - > ignore_device = 1 ;
return 0 ;
2005-04-02 19:45:35 +04:00
}
2005-07-05 17:24:41 +04:00
if ( ! udev - > run_final & & rule - > run . operation ! = KEY_OP_UNSET ) {
2005-06-05 17:55:29 +04:00
char program [ PATH_SIZE ] ;
2005-04-02 19:45:35 +04:00
2005-07-05 17:24:41 +04:00
if ( rule - > run . operation = = KEY_OP_ASSIGN | | rule - > run . operation = = KEY_OP_ASSIGN_FINAL ) {
2005-06-05 17:55:29 +04:00
struct name_entry * name_loop ;
struct name_entry * temp_loop ;
2005-04-02 19:45:35 +04:00
2005-06-05 17:55:29 +04:00
info ( " reset run list " ) ;
list_for_each_entry_safe ( name_loop , temp_loop , & udev - > run_list , node ) {
list_del ( & name_loop - > node ) ;
free ( name_loop ) ;
}
2005-04-02 19:45:35 +04:00
}
2005-07-05 17:24:41 +04:00
strlcpy ( program , key_val ( rule , & rule - > run ) , sizeof ( program ) ) ;
2005-07-20 20:12:56 +04:00
apply_format ( udev , program , sizeof ( program ) , class_dev , sysfs_dev ) ;
2005-07-05 17:24:41 +04:00
dbg ( " add run '%s' " , program ) ;
name_list_add ( & udev - > run_list , program , 0 ) ;
if ( rule - > run . operation = = KEY_OP_ASSIGN_FINAL )
2005-06-05 17:55:29 +04:00
break ;
2005-04-02 19:45:35 +04:00
}
2005-06-05 17:55:29 +04:00
if ( rule - > last_rule ) {
dbg ( " last rule to be applied " ) ;
break ;
}
2005-07-20 20:12:56 +04:00
if ( rule - > goto_label . operation ! = KEY_OP_UNSET ) {
dbg ( " moving forward to label '%s' " , key_val ( rule , & rule - > goto_label ) ) ;
udev_rules_iter_label ( rules , key_val ( rule , & rule - > goto_label ) ) ;
}
2005-04-02 19:45:35 +04:00
}
}
return 0 ;
}