2004-03-25 07:46:58 +03:00
/*
2004-03-27 12:21:46 +03:00
* dev_d . c - dev . d / multiplexer
2004-03-25 07:46:58 +03:00
*
* Copyright ( C ) 2004 Greg Kroah - Hartman < greg @ kroah . com >
*
* This program is free software ; you can redistribute it and / or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation version 2 of the License .
*/
2004-03-27 12:21:46 +03:00
/*
2004-03-25 07:46:58 +03:00
* This essentially emulates the following shell script logic in C :
2004-03-27 12:21:46 +03:00
* DIR = " /etc/dev.d "
* export DEVNODE = " whatever_dev_name_udev_just_gave "
* for I in " ${DIR}/$DEVNODE/ " * . dev " ${DIR}/$1/ " * . dev " ${DIR}/default/ " * . dev ; do
* if [ - f $ I ] ; then $ I $ 1 ; fi
* done
* exit 1 ;
2004-03-25 07:46:58 +03:00
*/
# include <stdio.h>
# include <stdlib.h>
# include <string.h>
# include <sys/types.h>
# include <sys/wait.h>
# include <unistd.h>
# include "udev.h"
# include "udev_lib.h"
# include "logging.h"
2004-03-27 12:21:46 +03:00
# define DEVD_DIR " / etc / dev.d / "
# define DEVD_SUFFIX ".dev"
2004-03-25 07:46:58 +03:00
2004-03-27 12:21:46 +03:00
static int run_program ( char * name )
2004-03-25 07:46:58 +03:00
{
pid_t pid ;
dbg ( " running %s " , name ) ;
pid = fork ( ) ;
2004-03-27 12:21:46 +03:00
switch ( pid ) {
case 0 :
/* child */
execv ( name , main_argv ) ;
dbg ( " exec of child failed " ) ;
exit ( 1 ) ;
case - 1 :
dbg ( " fork of child failed " ) ;
break ;
return - 1 ;
default :
2004-03-25 07:46:58 +03:00
wait ( NULL ) ;
}
2004-03-27 12:21:46 +03:00
return 0 ;
2004-03-25 07:46:58 +03:00
}
2004-03-27 12:21:46 +03:00
/*
* runs files in these directories in order :
* < node name given by udev > /
* subsystem /
* default /
2004-03-25 07:46:58 +03:00
*/
void dev_d_send ( struct udevice * dev , char * subsystem )
{
char dirname [ 256 ] ;
char devnode [ NAME_SIZE ] ;
strfieldcpy ( devnode , udev_root ) ;
strfieldcat ( devnode , dev - > name ) ;
setenv ( " DEVNODE " , devnode , 1 ) ;
2004-03-27 12:21:46 +03:00
strcpy ( dirname , DEVD_DIR ) ;
strfieldcat ( dirname , dev - > name ) ;
call_foreach_file ( run_program , dirname , DEVD_SUFFIX ) ;
2004-03-25 07:46:58 +03:00
2004-03-27 12:21:46 +03:00
strcpy ( dirname , DEVD_DIR ) ;
strfieldcat ( dirname , subsystem ) ;
call_foreach_file ( run_program , dirname , DEVD_SUFFIX ) ;
2004-03-25 07:46:58 +03:00
2004-03-27 12:21:46 +03:00
strcpy ( dirname , DEVD_DIR " default " ) ;
call_foreach_file ( run_program , dirname , DEVD_SUFFIX ) ;
2004-03-25 07:46:58 +03:00
}