List of commits:
Subject Hash Author Date (UTC)
ready, now need to know why init libc is crashing 39e165e544af1632e0d1926a686173e8b7543bdd Sylvain BERTRAND 2011-12-30 02:35:57
uevents cleanup 082938475c119d68ce5def18a1c21f69c596b1a1 Sylvain BERTRAND 2011-12-26 23:32:00
uevent monitor to ulinux patterns e9e2e03953d3a28e08aeb3a7388b334cda8a8479 Sylvain BERTRAND 2011-12-26 22:38:45
modules properly loaded ac79794945662bad9e97562c479dea5afe455687 Sylvain BERTRAND 2011-12-26 22:08:54
ulinux patterns: insert a kernel module ed879829ce6c44b77bddcd9c106a106261f47301 Sylvain BERTRAND 2011-12-26 21:29:33
ulinux dir_parse pattern 63cc7acc186efc291a76255e97d86e80901174e5 Sylvain BERTRAND 2011-12-26 02:24:55
ulinux improvements and more patterns a458c52301d3a34e8b51794fea7c1cb06c1c34f8 Sylvain BERTRAND 2011-12-22 22:09:06
ulinux patterns:network server 60c167bcd530f95d0a57189035620c3bc80f1e34 Sylvain BERTRAND 2011-12-20 00:39:56
ulinux cleanup and samples 92c893f28ef42f11943c0bf80a037a5b5f34ebef Sylvain BERTRAND 2011-12-16 01:51:22
uevent listener 55657699f291575139858aec466340e7624cd66a Sylvain BERTRAND 2011-12-15 18:01:06
uevent monitor e241bd4db4af8510902a5c606eee0e1e2dbdecda Sylvain BERTRAND 2011-12-13 00:37:45
block signals 91772917669645b5634563d0c06e361c87cf3e84 Sylvain BERTRAND 2011-12-09 17:04:34
initial commit 5310fde2d021e3505f8f1d5d9091726c236967ec Sylvain BERTRAND 2011-12-07 11:29:18
Commit 39e165e544af1632e0d1926a686173e8b7543bdd - ready, now need to know why init libc is crashing
Author: Sylvain BERTRAND
Author date (UTC): 2011-12-30 02:35
Committer name: Sylvain BERTRAND
Committer date (UTC): 2011-12-30 02:35
Parent(s): 082938475c119d68ce5def18a1c21f69c596b1a1
Signing key:
Tree: a878726da78c76c02fe21cbe99df8589c62944b5
File Lines added Lines deleted
conf.mk 15 0
init.c 67 1
makefile 11 4
modules.c 1 1
uevent.c 122 3
uevents.c 4 3
ulinux/archs/x86_64/utils/mem.c 17 1
ulinux/archs/x86_64/utils/mem.h 2 0
ulinux/epoll.h 2 0
ulinux/patterns/dir_parse/dir_parse.c 1 1
ulinux/socket/socket.h 1 0
ulinux/stat.h 4 4
ulinux/utils/ascii/block/conv/decimal/decimal.c 29 6
ulinux/utils/ascii/block/conv/decimal/decimal.h 4 2
ulinux/utils/ascii/string/conv/decimal/decimal.c 29 3
ulinux/utils/ascii/string/conv/decimal/decimal.h 4 2
File conf.mk changed (mode: 100644) (index bd3e578..48e53b2)
... ... ifdef DEBUG
22 22 CFLAGS+= -DDEBUG CFLAGS+= -DDEBUG
23 23 endif endif
24 24
25 #*******************************************************************************
25 26 #customized your module list (scsi_wait is dealed with) #customized your module list (scsi_wait is dealed with)
26 27 MODULES?=firmware_class ext4 ahci sd_mod sg MODULES?=firmware_class ext4 ahci sd_mod sg
27 28 SCSI_WAIT?=1 SCSI_WAIT?=1
29
30 #milliseconds to wait for more uevents
31 UEVENTS_TIMEOUT=1
32
33 #configure the root device
34 ROOT=\"sdb3\"
35 ROOT_FS=\"ext4\"
36 ROOT_OPTIONS=\"discard\"
37 ROOT_INIT=\"/sbin/init\"
38 #*******************************************************************************
39
28 40 ifdef SCSI_WAIT ifdef SCSI_WAIT
29 41 MODULES+= scsi_wait_scan MODULES+= scsi_wait_scan
30 42 CFLAGS+= -DSCSI_WAIT_SCAN CFLAGS+= -DSCSI_WAIT_SCAN
31 43 endif endif
44
45 CFLAGS+= -DROOT=$(ROOT) -DROOT_FS=$(ROOT_FS) -DROOT_OPTIONS=$(ROOT_OPTIONS)
46 CFLAGS+= -DUEVENTS_TIMEOUT=$(UEVENTS_TIMEOUT) -DROOT_INIT=$(ROOT_INIT)
File init.c changed (mode: 100644) (index 9650bdb..5a1f1d1)
... ... static void sigs_setup(void)
42 42 OUTC("done\n"); OUTC("done\n");
43 43 } }
44 44
45 static void newroot_mount(void)
46 {
47
48 OUTC(PRE "mounting root device /dev/" ROOT " on /newroot...\n");
49 k_l r=sysc(mount,5,"/dev/" ROOT,"/newroot",
50 ROOT_FS,K_MS_NOATIME|K_MS_NODIRATIME,ROOT_OPTIONS);
51 if(K_ISERR(r)){
52 OUT("ERROR(%ld):unable to mount root\n",r);
53 sysc(exit_group,1,-1);
54 }
55
56 }
57
58 static void ramfs_cleanup(void)
59 {
60 //TODO:eraze everything except /newroot
61 }
62
63 static void newroot_chdir()
64 {
65 OUTC(PRE "chdir to /newroot...");
66 k_l r=sysc(chdir,1,"/newroot");
67 if(K_ISERR(r)){
68 OUT("ERROR(%ld):unable to chdir to /newroot\n",r);
69 sysc(exit_group,1,-1);
70 }
71 OUTC("done\n");
72 }
73
74 static void newroot_move(void)
75 {
76 OUTC(PRE "mount moving . (/newroot) to / ...");
77 k_l r=sysc(mount,5,".","/",0,K_MS_MOVE,0);
78 if(K_ISERR(r)){
79 OUT("ERROR(%ld):unable to mount move . (/newroot) to /\n",r);
80 sysc(exit_group,1,-1);
81 }
82 OUTC("done\n");
83 }
84
85 static void newroot_chroot(void)
86 {
87 OUTC(PRE "chroot to . (/newroot)...");
88 k_l r=sysc(chroot,1,".");
89 if(K_ISERR(r)){
90 OUT("ERROR(%ld):unable to chroot to . (/newroot)\n",r);
91 sysc(exit_group,1,-1);
92 }
93 OUTC("done\n");
94 }
95
96 static void init_execve(void)
97 {
98 k_l r=sysc(execve,4,ROOT_INIT,0,0,0);
99 if(K_ISERR(r)){
100 OUT("ERROR(%ld):unable to run /sbin/init\n",r);
101 sysc(exit_group,1,-1);
102 }
103 }
104
45 105 void _start(void) void _start(void)
46 106 { {
47 107 # ifdef DEBUG # ifdef DEBUG
108 //k_l r=sysc(open,3,"/dev/console",K_O_WRONLY|K_O_CLOEXEC,0);
48 109 k_l r=sysc(open,3,"/dev/console",K_O_WRONLY,0); k_l r=sysc(open,3,"/dev/console",K_O_WRONLY,0);
49 110 if(K_ISERR(r)) sysc(exit_group,1,-1); if(K_ISERR(r)) sysc(exit_group,1,-1);
50 111 g_console=(k_i)r; g_console=(k_i)r;
 
... ... void _start(void)
56 117 uevents_setup(); uevents_setup();
57 118 modules_load(); modules_load();
58 119 uevents_process(); uevents_process();
59 sysc(exit_group,1,0);
120 newroot_mount();
121 ramfs_cleanup();
122 newroot_chdir();
123 newroot_move();
124 newroot_chroot();
125 init_execve();
60 126 } }
File makefile changed (mode: 100644) (index 21d8785..970faf7)
... ... $(S_DIR) \
7 7 $(OBJ_DIR) \ $(OBJ_DIR) \
8 8 $(MODULES_DIR) \ $(MODULES_DIR) \
9 9 $(CPIO_DIR)/dev \ $(CPIO_DIR)/dev \
10 $(CPIO_DIR)/proc \
11 $(CPIO_DIR)/sys
10 $(CPIO_DIR)/newroot
12 11
13 12
14 13 OBJS=\ OBJS=\
 
... ... $(OBJ_DIR)/modules.o \
17 16 $(OBJ_DIR)/uevents.o \ $(OBJ_DIR)/uevents.o \
18 17 $(OBJ_DIR)/uevent.o $(OBJ_DIR)/uevent.o
19 18
20 ifdef DEBUG
21 19 ULINUX_DEBUG_OBJS=\ ULINUX_DEBUG_OBJS=\
20 $(OBJ_DIR)/decimal.o
21
22 ifdef DEBUG
23 ULINUX_DEBUG_OBJS+= \
22 24 $(OBJ_DIR)/mem.o \ $(OBJ_DIR)/mem.o \
23 25 $(OBJ_DIR)/string.o \ $(OBJ_DIR)/string.o \
24 26 $(OBJ_DIR)/vsprintf.o $(OBJ_DIR)/vsprintf.o
27 endif
25 28
26 29 OBJS+= $(ULINUX_DEBUG_OBJS) OBJS+= $(ULINUX_DEBUG_OBJS)
27 endif
28 30
29 31 help: help:
30 32 @echo "targets are 'all', 'help'(this output), 'clean'" @echo "targets are 'all', 'help'(this output), 'clean'"
 
... ... $(OBJ_DIR)/vsprintf.o:$(S_DIR)/vsprintf.s
63 65 endif endif
64 66 #=============================================================================== #===============================================================================
65 67
68 $(S_DIR)/decimal.s:ulinux/utils/ascii/string/conv/decimal/decimal.c
69 $(CC) $(CFLAGS) $< -o $@
70 $(OBJ_DIR)/decimal.o:$(S_DIR)/decimal.s
71 $(AS) $(ASFLAGS) $< -o $@
72
66 73 $(CPIO_DIR)/dev/console: $(CPIO_DIR)/dev/console:
67 74 mknod --mode=0600 $(CPIO_DIR)/dev/console c 5 1 mknod --mode=0600 $(CPIO_DIR)/dev/console c 5 1
68 75
File modules.c changed (mode: 100644) (index 9b1a728..25c6426)
22 22
23 23 static void module_load(k_u8 *m) static void module_load(k_u8 *m)
24 24 { {
25 k_i fd=(k_i)sysc(open,3,m,K_O_RDONLY,0);
25 k_i fd=(k_i)sysc(open,3,m,K_O_RDONLY|K_O_CLOEXEC,0);
26 26 if(K_ISERR(fd)){ if(K_ISERR(fd)){
27 27 OUT("unable to open module(%ld)\n",fd); OUT("unable to open module(%ld)\n",fd);
28 28 goto err; goto err;
File uevent.c changed (mode: 100644) (index 12ec719..80d22b4)
5 5 //****************************************************************************** //******************************************************************************
6 6 #include <ulinux/compiler_types.h> #include <ulinux/compiler_types.h>
7 7 #include <ulinux/types.h> #include <ulinux/types.h>
8 #include <ulinux/stat.h>
9 #include <ulinux/error.h>
10 #include <ulinux/utils/ascii/string/conv/decimal/decimal.h>
11 #include <ulinux/utils/mem.h>
12 #ifdef DEBUG
13 #include <ulinux/sysc.h>
14 #include <stdarg.h>
15 #include <ulinux/utils/ascii/string/vsprintf.h>
16 #endif
8 17
9 18 #include "globals.h" #include "globals.h"
10 19
20 static void root_mknod(k_u16 major,k_u32 minor)
21 {
22 OUT(PRE "creating root device node:%s major=%u minor=%u...","/dev/" ROOT,
23 major,minor);
24 k_l r=sysc(mknod,3,"/dev/" ROOT,K_S_IFBLK|K_S_IRUSR|K_S_IWUSR|K_S_IRGRP
25 |K_S_IWGRP,
26 (minor&0xff)|(major<<8)|((minor&~0xff)<< 12));
27 if(K_ISERR(r)){
28 OUT("ERROR(%ld):unable to create the root node\n",r);
29 sysc(exit_group,1,-1);
30 }
31 OUTC("done\n");
32 }
33
34 static k_ut hdr_action_is_add(k_u8 *hdr)
35 {
36 #define HDR_ACTION_ADD "add@"
37 if(u_memcmp(hdr,(k_u8*)HDR_ACTION_ADD,sizeof(HDR_ACTION_ADD)-1)) return 0;
38 return 1;
39 }
40
41 static void hdr_skip(k_u8 **p)
42 {
43 while(*(*p)++);
44 }
45 #define var_skip hdr_skip
46
47 static k_ut key_is_subsystem(k_u8 *p)
48 {
49 #define KEY_SUBSYSTEM "SUBSYSTEM="
50 if(u_memcmp(p,(k_u8*)KEY_SUBSYSTEM,sizeof(KEY_SUBSYSTEM)-1)) return 0;
51 return 1;
52 }
53
54 static k_ut key_is_devname(k_u8 *p)
55 {
56 #define KEY_DEVNAME "DEVNAME="
57 if(u_memcmp(p,(k_u8*)KEY_DEVNAME,sizeof(KEY_DEVNAME)-1)) return 0;
58 return 1;
59 }
60
61 static k_ut key_is_major(k_u8 *p)
62 {
63 #define KEY_MAJOR "MAJOR="
64 if(u_memcmp(p,(k_u8*)KEY_MAJOR,sizeof(KEY_MAJOR)-1)) return 0;
65 return 1;
66 }
67
68 static k_ut key_is_minor(k_u8 *p)
69 {
70 #define KEY_MINOR "MINOR="
71 if(u_memcmp(p,(k_u8*)KEY_MINOR,sizeof(KEY_MINOR)-1)) return 0;
72 return 1;
73 }
74
75 static void move_to_value(k_u8 **p)
76 {
77 while(*(*p)++!='=');
78 }
79
80 static k_ut value_is_block(k_u8 *p)
81 {
82 #define VALUE_BLOCK "block"
83 if(!*p||u_memcmp(p,(k_u8*)VALUE_BLOCK,sizeof(VALUE_BLOCK)-1)) return 0;
84 return 1;
85 }
86
87 static void value_skip(k_u8 **p)
88 {
89 while(*(*p)++);
90 }
91
92 static void value_str_consume(k_u8 **p,k_u8 *d)
93 {
94 do *d++=**p; while(*(*p)++);
95 }
96
11 97 void uevent_process(k_u8 *p,k_i sz) void uevent_process(k_u8 *p,k_i sz)
12 98 { {
13 while(sz){
14 ++p;
15 sz--;
99 if(!hdr_action_is_add(p)) return;
100 k_u8 *p_end=p+sz;
101 hdr_skip(&p);
102
103 k_u8 dev_name[256];
104 u_memset(dev_name,0,sizeof(dev_name));
105 k_u16 major=0;
106 k_u32 minor=0;
107
108 while(p<p_end){
109 if(key_is_subsystem(p)){
110 move_to_value(&p);
111 if(!value_is_block(p)) return;
112 else value_skip(&p);
113 }else if(key_is_devname(p)){
114 move_to_value(&p);
115 value_str_consume(&p,dev_name);
116 }else if(key_is_major(p)){
117 move_to_value(&p);
118 if(!u_a_strict_dec2u16(&major,p)){
119 OUT(PRE "ERROR:unable to convert major '%s'\n",p);
120 sysc(exit_group,1,-1);
121 }
122 value_skip(&p);
123 }else if(key_is_minor(p)){
124 move_to_value(&p);
125 if(!u_a_strict_dec2u32(&minor,p)){
126 OUT(PRE "ERROR:unable to convert minor '%s'\n",p);
127 sysc(exit_group,1,-1);
128 }
129 value_skip(&p);
130 }else var_skip(&p);
131 }
132
133 if(!u_memcmp(dev_name,(k_u8*)ROOT,sizeof(ROOT)-1)){
134 root_mknod(major,minor);
16 135 } }
17 136 } }
File uevents.c changed (mode: 100644) (index 1684f9b..32961ea)
... ... static k_i s;
30 30 void uevents_setup(void) void uevents_setup(void)
31 31 { {
32 32 OUTC(PRE "setting up uevent..."); OUTC(PRE "setting up uevent...");
33 ep_fd=(k_i)sysc(epoll_create1,1,0);
33 ep_fd=(k_i)sysc(epoll_create1,1,K_EPOLL_CLOEXEC);
34 34 if(K_ISERR(ep_fd)){ if(K_ISERR(ep_fd)){
35 35 OUT("ERROR(%d):unable to create epoll fd\n",ep_fd); OUT("ERROR(%d):unable to create epoll fd\n",ep_fd);
36 36 sysc(exit_group,1,-1); sysc(exit_group,1,-1);
 
... ... void uevents_setup(void)
39 39 //---------------------------------------------------------------------------- //----------------------------------------------------------------------------
40 40
41 41 //blocking socket //blocking socket
42 s=(k_i)sysc(socket,3,K_PF_NETLINK,K_SOCK_RAW,K_NETLINK_KOBJECT_UEVENT);
42 s=(k_i)sysc(socket,3,K_PF_NETLINK,K_SOCK_RAW|K_SO_CLOEXEC,
43 K_NETLINK_KOBJECT_UEVENT);
43 44 if(K_ISERR(s)){ if(K_ISERR(s)){
44 45 OUT("ERROR(%d):unable to create uevent netlink socket\n",s); OUT("ERROR(%d):unable to create uevent netlink socket\n",s);
45 46 sysc(exit_group,1,-1); sysc(exit_group,1,-1);
 
... ... void uevents_process(void)
116 117 static struct k_epoll_event evts;//uevent netlink event static struct k_epoll_event evts;//uevent netlink event
117 118 do{ do{
118 119 u_memset(&evts,0,sizeof(evts)); u_memset(&evts,0,sizeof(evts));
119 r=sysc(epoll_wait,4,ep_fd,&evts,1,-1);
120 r=sysc(epoll_wait,4,ep_fd,&evts,1,UEVENTS_TIMEOUT);
120 121 }while(r==-K_EINTR); }while(r==-K_EINTR);
121 122 if(K_ISERR(r)){ if(K_ISERR(r)){
122 123 OUT(PRE "ERROR(%ld):error epolling uevent netlink socket\n",r); OUT(PRE "ERROR(%ld):error epolling uevent netlink socket\n",r);
File ulinux/archs/x86_64/utils/mem.c changed (mode: 100644) (index 366278a..2bb737b)
8 8 #include <stddef.h> #include <stddef.h>
9 9
10 10 //XXX:need a way to get the target CPUID flags in order to select the proper //XXX:need a way to get the target CPUID flags in order to select the proper
11 //path at compilation time and not runtime
11 //code path at compilation time and not runtime
12 12 void u_memcpy(void *d,void *s,k_ul len) void u_memcpy(void *d,void *s,k_ul len)
13 13 { {
14 14 __builtin_memcpy(d,s,len);//use gcc builtin for this arch __builtin_memcpy(d,s,len);//use gcc builtin for this arch
 
... ... void *memset(void *to,int c,size_t len)
35 35 while(len--) *d++=c; while(len--) *d++=c;
36 36 return to; return to;
37 37 } }
38
39 k_t u_memcmp(void *d,void *c,k_ul len)
40 {
41 return __builtin_memcmp(d,c,len);//use gcc builtin for this arch
42 }
43
44 //a memset implementation is needed anyway if gcc decides not to use its builtin
45 //stolen from linux
46 int memcmp(const void *cs,const void *ct,size_t count)
47 {
48 const k_u8 *su1,*su2;
49 k_i res=0;
50
51 for(su1=cs,su2=ct;0<count;++su1,++su2,count--) if((res=*su1-*su2)!=0) break;
52 return res;
53 }
File ulinux/archs/x86_64/utils/mem.h changed (mode: 100644) (index 32a51cc..f8b39e5)
2 2 #define ULINUX_ARCH_UTILS_MEM_H #define ULINUX_ARCH_UTILS_MEM_H
3 3 #define ULINUX_ARCH_HAS_MEMCPY #define ULINUX_ARCH_HAS_MEMCPY
4 4 #define ULINUX_ARCH_HAS_MEMSET #define ULINUX_ARCH_HAS_MEMSET
5 #define ULINUX_ARCH_HAS_MEMCMP
5 6 void u_memcpy(void *d,void *s,k_ul len); void u_memcpy(void *d,void *s,k_ul len);
6 7 void u_memset(void *d,k_u8 c,k_ul len); void u_memset(void *d,k_u8 c,k_ul len);
8 k_t u_memcmp(void *s1,void *s2,k_ul len);
7 9 #endif #endif
File ulinux/epoll.h changed (mode: 100644) (index 37421c3..4a56407)
5 5 //*author:Sylvain BERTRAND <sylvain.bertrand AT gmail dot com> //*author:Sylvain BERTRAND <sylvain.bertrand AT gmail dot com>
6 6 //* <digital.ragnarok AT gmail dot com> //* <digital.ragnarok AT gmail dot com>
7 7 //****************************************************************************** //******************************************************************************
8 #define K_EPOLL_CLOEXEC 02000000//same than K_O_CLOEXEC
9
8 10 #define K_EPOLL_CTL_ADD 1 #define K_EPOLL_CTL_ADD 1
9 11 #define K_EPOLL_CTL_DEL 2 #define K_EPOLL_CTL_DEL 2
10 12 #define K_EPOLL_CTL_MOD 3 #define K_EPOLL_CTL_MOD 3
File ulinux/patterns/dir_parse/dir_parse.c changed (mode: 100644) (index 38853ab..51d927f)
... ... static k_u depth=-1;
38 38
39 39 static void dout(struct k_dirent64 *d) static void dout(struct k_dirent64 *d)
40 40 { {
41 POUT("%20lu %20ld %2u ",d->ino,d->off,d->type,d->name);
41 POUT("%20lu %20ld %2u ",d->ino,d->off,d->type);
42 42 k_u i=depth; k_u i=depth;
43 43 while(i--) POUTC(" "); while(i--) POUTC(" ");
44 44 POUT("%s\n",d->name); POUT("%s\n",d->name);
File ulinux/socket/socket.h changed (mode: 100644) (index e22ace9..42b4074)
... ... enum k_sock_type{
160 160 #define K_SO_DOMAIN 39 #define K_SO_DOMAIN 39
161 161
162 162 #define K_SO_RXQ_OVFL 40 #define K_SO_RXQ_OVFL 40
163 #define K_SO_CLOEXEC 02000000//same than K_O_CLOEXEC
163 164 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
164 165 #endif #endif
File ulinux/stat.h changed (mode: 100644) (index 12f0850..f43524d)
23 23 #define K_S_IWUSR 00200 #define K_S_IWUSR 00200
24 24 #define K_S_IXUSR 00100 #define K_S_IXUSR 00100
25 25
26 #define k_S_IRWXG 00070
27 #define k_S_IRGRP 00040
28 #define k_S_IWGRP 00020
29 #define k_S_IXGRP 00010
26 #define K_S_IRWXG 00070
27 #define K_S_IRGRP 00040
28 #define K_S_IWGRP 00020
29 #define K_S_IXGRP 00010
30 30
31 31 #define K_S_IRWXO 00007 #define K_S_IRWXO 00007
32 32 #define K_S_IROTH 00004 #define K_S_IROTH 00004
File ulinux/utils/ascii/block/conv/decimal/decimal.c changed (mode: 100644) (index 42f56fb..594f7e0)
1 //**********************************************************************************************
1 //******************************************************************************
2 2 //*this code is protected by the GNU affero GPLv3 //*this code is protected by the GNU affero GPLv3
3 3 //*author:Sylvain BERTRAND (sylvain.bertrand AT gmail dot com) //*author:Sylvain BERTRAND (sylvain.bertrand AT gmail dot com)
4 //**********************************************************************************************
4 //* <digital.ragnarok AT gmail dot com>
5 //******************************************************************************
5 6 #include <ulinux/compiler_types.h> #include <ulinux/compiler_types.h>
6 7 #include <ulinux/arch/types.h> #include <ulinux/arch/types.h>
7 8
 
... ... k_ut u_a_strict_dec2u8_blk(k_u8 *dest,k_u8 *start,k_u8 *end)
20 21 buf=buf*10+(*start-'0'); buf=buf*10+(*start-'0');
21 22 ++start; ++start;
22 23 } }
23 if(buf&0xff00) return 0;//overflow, max is 999 way below what can do a u16
24 //overflow, max is 999 way below what can do a u16
25 if(buf&0xff00) return 0;
24 26 *dest=(k_u8)buf; *dest=(k_u8)buf;
25 27 return 1; return 1;
26 28 } }
27 29
28 //strict unisgned decimal ascii block to u16
30 //strict unsigned decimal ascii block to u16
29 31 //C version //C version
30 32 //caller must provide a valid memory block //caller must provide a valid memory block
31 33 //inplace conversion: ok //inplace conversion: ok
 
... ... k_ut u_a_strict_dec2u16_blk(k_u16 *dest,k_u8 *start,k_u8 *end)
39 41 buf=buf*10+(*start-'0'); buf=buf*10+(*start-'0');
40 42 ++start; ++start;
41 43 } }
42 if(buf&0xffff0000) return 0;//overflow, max is 99999 way below what can do a u32
43 *dest=buf;
44 //overflow, max is 99999 way below what can do a u32
45 if(buf&0xffff0000) return 0;
46 *dest=(k_u16)buf;
47 return 1;
48 }
49
50 //strict unsigned decimal ascii block to u32
51 //C version
52 //caller must provide a valid memory block
53 //inplace conversion: ok
54 //return compiler boolean:success or failed
55 k_ut u_a_strict_dec2u32_blk(k_u32 *dest,k_u8 *start,k_u8 *end)
56 {//do *not* trust content
57 if((k_ul)(end-start)>=sizeof("4294967295")-1) return 0;
58 k_u64 buf=0;
59 while(start<=end){
60 if(!u_a_is_digit(*start)) return 0;
61 buf=buf*10+(*start-'0');
62 ++start;
63 }
64 //overflow, max is 9999999999 way below what can do a u64
65 if(buf&0xffffffff00000000) return 0;
66 *dest=(k_u32)buf;
44 67 return 1; return 1;
45 68 } }
46 69
File ulinux/utils/ascii/block/conv/decimal/decimal.h changed (mode: 100644) (index 1ee3713..263a98b)
1 //**********************************************************************************************
1 //******************************************************************************
2 2 //*this code is protected by the GNU affero GPLv3 //*this code is protected by the GNU affero GPLv3
3 3 //*author:Sylvain BERTRAND (sylvain.bertrand AT gmail dot com) //*author:Sylvain BERTRAND (sylvain.bertrand AT gmail dot com)
4 //**********************************************************************************************
4 //* <digital.ragnarok AT gmail dot com>
5 //******************************************************************************
5 6 #ifndef ULINUX_UTILS_ASCII_BLOCK_CONV_DECIMAL_DECIMAL_H #ifndef ULINUX_UTILS_ASCII_BLOCK_CONV_DECIMAL_DECIMAL_H
6 7 #define ULINUX_UTILS_ASCII_BLOCK_CONV_DECIMAL_DECIMAL_H #define ULINUX_UTILS_ASCII_BLOCK_CONV_DECIMAL_DECIMAL_H
7 8 extern k_ut u_a_strict_dec2u8_blk(k_u8 *dest,k_u8 *start,k_u8 *end); extern k_ut u_a_strict_dec2u8_blk(k_u8 *dest,k_u8 *start,k_u8 *end);
8 9 extern k_ut u_a_strict_dec2u16_blk(k_u16 *dest,k_u8 *start,k_u8 *end); extern k_ut u_a_strict_dec2u16_blk(k_u16 *dest,k_u8 *start,k_u8 *end);
10 extern k_ut u_a_strict_dec2u32_blk(k_u32 *dest,k_u8 *start,k_u8 *end);
9 11 extern k_ut u_a_strict_dec2u64_blk(k_u64 *dest,k_u8 *start,k_u8 *end); extern k_ut u_a_strict_dec2u64_blk(k_u64 *dest,k_u8 *start,k_u8 *end);
10 12 #endif #endif
File ulinux/utils/ascii/string/conv/decimal/decimal.c changed (mode: 100644) (index 80839d3..fa6ed9b)
1 //**********************************************************************************************
1 //******************************************************************************
2 2 //*this code is protected by the GNU affero GPLv3 //*this code is protected by the GNU affero GPLv3
3 3 //*author:Sylvain BERTRAND (sylvain.bertrand AT gmail dot com) //*author:Sylvain BERTRAND (sylvain.bertrand AT gmail dot com)
4 //**********************************************************************************************
4 //* <digital.ragnarok AT gmail dot com>
5 //******************************************************************************
5 6
6 7 #include <ulinux/compiler_types.h> #include <ulinux/compiler_types.h>
7 8 #include <ulinux/arch/types.h> #include <ulinux/arch/types.h>
 
... ... k_ut u_a_strict_dec2u16(k_u16 *dest,k_u8 *start)
26 27 buf=buf*10+(*start-'0'); buf=buf*10+(*start-'0');
27 28 ++start; ++start;
28 29 } }
29 if(buf&0xffff0000) return 0;//overflow, max is 99999 way below what can do a u32
30 //overflow, max is 99999 way below what can do a u32
31 if(buf&0xffff0000) return 0;
30 32 *dest=(k_u16)buf; *dest=(k_u16)buf;
31 33 return 1; return 1;
32 34 } }
33 35
36 //strict unsigned decimal ascii str to u32
37 //C version
38 //caller must provide a valid pointer with readable data
39 //inplace conversion: ok
40 //return compiler boolean:success or failed
41 k_ut u_a_strict_dec2u32(k_u32 *dest,k_u8 *start)
42 {//do *not* trust
43 k_ul len;
44 if(!u_a_strnlen(&len,start,sizeof("4294967295")-1)) return 0;
45 if(!len) return 0;
46
47 k_u64 buf=0;
48 k_u8 *end=start+len-1;
49 while(start<=end){
50 if(!u_a_is_digit(*start)) return 0;
51 buf=buf*10+(*start-'0');
52 ++start;
53 }
54 //overflow, max is 9999999999 way below what can do a u32
55 if(buf&0xffffffff00000000) return 0;
56 *dest=(k_u32)buf;
57 return 1;
58 }
59
34 60 //strict unsigned decimal ascii str to u64 //strict unsigned decimal ascii str to u64
35 61 //C version //C version
36 62 //caller must provide a valid pointer with readable data //caller must provide a valid pointer with readable data
File ulinux/utils/ascii/string/conv/decimal/decimal.h changed (mode: 100644) (index bbf2599..4da3c40)
1 //**********************************************************************************************
1 //******************************************************************************
2 2 //*this code is protected by the GNU affero GPLv3 //*this code is protected by the GNU affero GPLv3
3 3 //*author:Sylvain BERTRAND (sylvain.bertrand AT gmail dot com) //*author:Sylvain BERTRAND (sylvain.bertrand AT gmail dot com)
4 //**********************************************************************************************
4 //* <digital.ragnarok AT gmail dot com>
5 //******************************************************************************
5 6 #ifndef ULINUX_UTILS_ASCII_STRING_CONV_DECIMAL_DECIMAL_H #ifndef ULINUX_UTILS_ASCII_STRING_CONV_DECIMAL_DECIMAL_H
6 7 #define ULINUX_UTILS_ASCII_STRING_CONV_DECIMAL_DECIMAL_H #define ULINUX_UTILS_ASCII_STRING_CONV_DECIMAL_DECIMAL_H
7 8 extern k_ut u_a_strict_dec2u16(k_u16 *dest,k_u8 *start); extern k_ut u_a_strict_dec2u16(k_u16 *dest,k_u8 *start);
9 extern k_ut u_a_strict_dec2u32(k_u32 *dest,k_u8 *start);
8 10 extern k_ut u_a_strict_dec2u64(k_u64 *dest,k_u8 *start); extern k_ut u_a_strict_dec2u64(k_u64 *dest,k_u8 *start);
9 11 #endif #endif
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