//******************************************************************************
//*this code is protected by the GNU affero GPLv3
//*author:Sylvain BERTRAND <sylvain.bertrand AT gmail dot com>
//* <digital.ragnarok AT gmail dot com>
//******************************************************************************
#include <ulinux/compiler_types.h>
#include <ulinux/types.h>
#include <ulinux/sysc.h>
#include <ulinux/stat.h>
#include <ulinux/mmap.h>
#include <ulinux/error.h>
#include <ulinux/file.h>
#ifndef QUIET
#include <stdarg.h>
#include <ulinux/utils/ascii/string/vsprintf.h>
#endif
#include "globals.h"
#include "modules_list.h"
static void module_load(k_u8 *m)
{
k_i fd=(k_i)sysc(open,3,m,K_O_RDONLY,0);
if(K_ISERR(fd)){
OUT("ERROR(%d):unable to open module file\n",fd);
sysc(exit_group,1,-1);
}
struct k_stat m_stat;
k_l r=sysc(fstat,2,fd,&m_stat);
if(K_ISERR(r)){
OUT("ERROR(%ld):unable to stat module file\n",r);
sysc(exit_group,1,-1);
}
OUT("size=%lu...",m_stat.sz);
k_l addr=sysc(mmap,6,0,m_stat.sz,K_PROT_READ,
K_MAP_PRIVATE|K_MAP_POPULATE,fd,0);
if(K_ISERR(addr)){
OUT("ERROR(%ld):unable to mmap module file\n",addr);
sysc(exit_group,1,-1);
}
r=sysc(init_module,3,addr,m_stat.sz,"");
if(K_ISERR(r)){
OUT("ERROR(%ld):unable init module\n",r);
sysc(exit_group,1,-1);
}
do r=sysc(close,1,fd); while(r==-K_EINTR);
if(K_ISERR(r)){
OUT("ERROR(%ld):unable to close module file\n",r);
sysc(exit_group,1,-1);
}
return;
}
void modules_load(void)
{
k_u8 **m=modules_list;
while(*m!=0){
OUT(PRE "loading module '%s'...",*m);
module_load(*m);
OUTC("done\n");
++m;
}
#ifdef SCSI_WAIT_SCAN
k_l r=sysc(delete_module,1,"scsi_wait_scan");
if(K_ISERR(r)){
OUT(PRE "ERROR(%ld):unable to delete the scsi_wait_scan module\n",r);
sysc(exit_group,1,-1);
}
#endif
}