/uevent.c (6c62952dc3479ba202b797f412a2f203d58ca52b) (3358 bytes) (mode 100644) (type blob)
//******************************************************************************
//*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/stat.h>
#include <ulinux/error.h>
#include <ulinux/utils/ascii/string/conv/decimal/decimal.h>
#include <ulinux/utils/mem.h>
#include <ulinux/sysc.h>
#ifndef QUIET
#include <stdarg.h>
#include <ulinux/utils/ascii/string/vsprintf.h>
#endif
#include "globals.h"
static void root_mknod(k_u16 major,k_u32 minor)
{
OUT(PRE "creating root device node:%s major=%u minor=%u...","/dev/" ROOT,
major,minor);
k_l r=sysc(mknod,3,"/dev/" ROOT,K_S_IFBLK|K_S_IRUSR|K_S_IWUSR|K_S_IRGRP
|K_S_IWGRP,
(minor&0xff)|(major<<8)|((minor&~0xff)<< 12));
if(K_ISERR(r)){
OUT("ERROR(%ld):unable to create the root node\n",r);
sysc(exit_group,1,-1);
}
OUTC("done\n");
}
static k_ut hdr_action_is_add(k_u8 *hdr)
{
#define HDR_ACTION_ADD "add@"
if(u_memcmp(hdr,(k_u8*)HDR_ACTION_ADD,sizeof(HDR_ACTION_ADD)-1)) return 0;
return 1;
}
static void hdr_skip(k_u8 **p)
{
while(*(*p)++);
}
#define var_skip hdr_skip
static k_ut key_is_subsystem(k_u8 *p)
{
#define KEY_SUBSYSTEM "SUBSYSTEM="
if(u_memcmp(p,(k_u8*)KEY_SUBSYSTEM,sizeof(KEY_SUBSYSTEM)-1)) return 0;
return 1;
}
static k_ut key_is_devname(k_u8 *p)
{
#define KEY_DEVNAME "DEVNAME="
if(u_memcmp(p,(k_u8*)KEY_DEVNAME,sizeof(KEY_DEVNAME)-1)) return 0;
return 1;
}
static k_ut key_is_major(k_u8 *p)
{
#define KEY_MAJOR "MAJOR="
if(u_memcmp(p,(k_u8*)KEY_MAJOR,sizeof(KEY_MAJOR)-1)) return 0;
return 1;
}
static k_ut key_is_minor(k_u8 *p)
{
#define KEY_MINOR "MINOR="
if(u_memcmp(p,(k_u8*)KEY_MINOR,sizeof(KEY_MINOR)-1)) return 0;
return 1;
}
static void move_to_value(k_u8 **p)
{
while(*(*p)++!='=');
}
static k_ut value_is_block(k_u8 *p)
{
#define VALUE_BLOCK "block"
if(!*p||u_memcmp(p,(k_u8*)VALUE_BLOCK,sizeof(VALUE_BLOCK)-1)) return 0;
return 1;
}
static void value_skip(k_u8 **p)
{
while(*(*p)++);
}
static void value_str_consume(k_u8 **p,k_u8 *d)
{
do *d++=**p; while(*(*p)++);
}
void uevent_process(k_u8 *p,k_i sz)
{
if(!hdr_action_is_add(p)) return;
k_u8 *p_end=p+sz;
hdr_skip(&p);
k_u8 dev_name[256];
u_memset(dev_name,0,sizeof(dev_name));
k_u16 major=0;
k_u32 minor=0;
while(p<p_end){
if(key_is_subsystem(p)){
move_to_value(&p);
if(!value_is_block(p)) return;
else value_skip(&p);
}else if(key_is_devname(p)){
move_to_value(&p);
value_str_consume(&p,dev_name);
}else if(key_is_major(p)){
move_to_value(&p);
if(!u_a_strict_dec2u16(&major,p)){
OUT(PRE "ERROR:unable to convert major '%s'\n",p);
sysc(exit_group,1,-1);
}
value_skip(&p);
}else if(key_is_minor(p)){
move_to_value(&p);
if(!u_a_strict_dec2u32(&minor,p)){
OUT(PRE "ERROR:unable to convert minor '%s'\n",p);
sysc(exit_group,1,-1);
}
value_skip(&p);
}else var_skip(&p);
}
if(!u_memcmp(dev_name,(k_u8*)ROOT,sizeof(ROOT)-1)){
root_mknod(major,minor);
}
}
Mode |
Type |
Size |
Ref |
File |
100644 |
blob |
350 |
f04e1ce48fd9a513ac6327a17f79a88e6933aa8b |
README |
100644 |
blob |
64 |
fae48d3badf8b799435342a1a4372c319facc1af |
TODO |
100644 |
blob |
1163 |
2b6b3bf3a8b53f33c0e4f8f73493ac6c2932f88c |
conf.mk |
100644 |
blob |
715 |
736621ea6373728f5ea091cf7f0705225b93f7b6 |
globals.h |
100644 |
blob |
4729 |
b999a4585d9986f75b4df02ae8cce1452325e2d2 |
init.c |
100644 |
blob |
3400 |
2eebf4f8ecff7c8a054f0d18bc715b62866e2ad0 |
makefile |
100644 |
blob |
1915 |
899930b3b7369403bb99bbf253c2162d306b9c83 |
modules.c |
100644 |
blob |
406 |
f5e162a64baf80fef122ef374b138aa50fc4158b |
modules.h |
100644 |
blob |
3264 |
d0b3b3d53097117b7919f5b35936ad6f44a44dd0 |
ramfs.c |
100644 |
blob |
403 |
4e38d9f1f1c8c5235493322737469627277f86c4 |
ramfs.h |
040000 |
tree |
- |
411cf6aace0ae666b41cecc267da82828eba511d |
script |
100644 |
blob |
3358 |
6c62952dc3479ba202b797f412a2f203d58ca52b |
uevent.c |
100644 |
blob |
416 |
867f22d10d93effd2a58227deded6274f63ebcfd |
uevent.h |
100644 |
blob |
4158 |
cef85f6fdac6d626135a76df290eb774056b9532 |
uevents.c |
100644 |
blob |
463 |
233e58ec60a14a4fd0d984fb96fb70326ddb0654 |
uevents.h |
040000 |
tree |
- |
f9fb6abe5603a4502f20c933c84e72feadcf2a88 |
ulinux |
Hints:
Before first commit, do not forget to setup your git environment:
git config --global user.name "your_name_here"
git config --global user.email "your@email_here"
Clone this repository using HTTP(S):
git clone https://rocketgit.com/user/sylware/cinitramfs
Clone this repository using ssh (do not forget to upload a key first):
git clone ssh://rocketgit@ssh.rocketgit.com/user/sylware/cinitramfs
Clone this repository using git:
git clone git://git.rocketgit.com/user/sylware/cinitramfs
You are allowed to anonymously push to this repository.
This means that your pushed commits will automatically be transformed into a
merge request:
... clone the repository ...
... make some changes and some commits ...
git push origin main