@@ -17,28 +17,16 @@ size_t highmem = 0;
1717
1818jmp_buf jb ;
1919
20- void
21- loader_main (struct loader_callbacks * cb , void * arg , int version , int ndisks )
20+ struct args loader_args = {
21+ .kernel_filename = NULL
22+ };
23+
24+ uint32_t
25+ parse_args (struct args * args )
2226{
2327 const char * var , * delim , * value ;
24- void * kernfile = NULL ;
25- int mode = 0 , uid = 0 , gid = 0 ;
26-
27- size_t kernsz = 0 , resid = 0 ;
28- void * kernel = NULL ;
29- struct multiboot * mb = NULL ;
3028 int i = 0 ;
3129
32- if (version < USERBOOT_VERSION )
33- abort ();
34-
35- callbacks = cb ;
36- callbacks_arg = arg ;
37-
38- /* setjmp error anchor */
39- if (setjmp (jb ))
40- return ;
41-
4230 /* iterate over environment */
4331 while ( (var = CALLBACK (getenv , i ++ )) ) {
4432 delim = strchr (var , '=' );
@@ -54,16 +42,45 @@ loader_main(struct loader_callbacks *cb, void *arg, int version, int ndisks)
5442 if (!strncmp (var , "kernel" , delim - var )) {
5543 if (!value ) {
5644 ERROR (EINVAL ,"no kernel filename provided" );
57- goto error ;
45+ return EINVAL ;
5846 }
5947
60- if (callbacks -> open (callbacks_arg , value , & kernfile )) {
61- ERROR (errno , "could not open kernel" );
62- goto error ;
63- }
48+ args -> kernel_filename = value ;
6449 }
6550 }
6651
52+ return 0 ;
53+ }
54+
55+ void
56+ loader_main (struct loader_callbacks * cb , void * arg , int version , int ndisks )
57+ {
58+ void * kernfile = NULL ;
59+ int mode = 0 , uid = 0 , gid = 0 ;
60+
61+ size_t kernsz = 0 , resid = 0 ;
62+ void * kernel = NULL ;
63+ struct multiboot * mb = NULL ;
64+
65+ if (version < USERBOOT_VERSION )
66+ abort ();
67+
68+ callbacks = cb ;
69+ callbacks_arg = arg ;
70+
71+ /* setjmp error anchor */
72+ if (setjmp (jb ))
73+ return ;
74+
75+ if (parse_args (& loader_args ))
76+ goto error ;
77+
78+ if (callbacks -> open (callbacks_arg , loader_args .kernel_filename , & kernfile ))
79+ {
80+ ERROR (errno , "could not open kernel" );
81+ goto error ;
82+ }
83+
6784 /* Get the memory layout */
6885 callbacks -> getmem (callbacks_arg , & lowmem , & highmem );
6986 printf ("lowmem = %lu, highmem = %lu\r\n" , lowmem , highmem );
@@ -90,7 +107,7 @@ loader_main(struct loader_callbacks *cb, void *arg, int version, int ndisks)
90107 goto error ;
91108 }
92109
93- /* Check that a kernel file was provided */
110+ /* Scan for the multiboot header */
94111 if (!(mb = mb_scan (kernel , kernsz ))) {
95112 ERROR (EINVAL , "No multiboot header found." );
96113 goto error ;
0 commit comments