Go to most recent revision | Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
4973 | right-hear | 1 | #include"loader.h" |
2 | |||
3 | extern char __menuet__app_param_area[]; |
||
4 | |||
5 | static char program_name[1024]; |
||
6 | static char * argp; |
||
7 | |||
8 | static void extract_base_program_name(void) |
||
9 | { |
||
10 | char * p; |
||
11 | int i; |
||
12 | p=strchr(__menuet__app_param_area,' '); |
||
13 | if(!p) |
||
14 | { |
||
15 | i=strlen(__menuet__app_param_area); |
||
16 | } else { |
||
17 | i=((long)p)-((long)__menuet__app_param_area); |
||
18 | if(!i) |
||
19 | { |
||
20 | __libclog_printf("No program name supplied\n"); |
||
21 | exit(-1); |
||
22 | } |
||
23 | } |
||
24 | memcpy(program_name,__menuet__app_param_area,i); |
||
25 | program_name[i]='\0'; |
||
26 | argp=&program_name[i+1]; |
||
27 | } |
||
28 | |||
29 | dll_t * main_program,*dll; |
||
30 | char ** dll_load_table; |
||
31 | |||
32 | static char tmp[1024]; |
||
33 | |||
34 | dll_t * try_load_dll(char * dllname) |
||
35 | { |
||
36 | if(dllname[0]=='/') return load_dll(dllname); |
||
37 | sprintf(tmp,"/RD/1/%s",dllname); |
||
38 | if(!(dll=load_dll(tmp))) return; |
||
39 | sprintf(tmp,"/HD/1/MENUETOS/%s",dllname); |
||
40 | if(!(dll=load_dll(tmp))) return; |
||
41 | sprintf(tmp,"/HD/1/MENUETOS/DLL/%s",dllname); |
||
42 | if(!(dll=load_dll(tmp))) return; |
||
43 | return load_dll(dllname); |
||
44 | } |
||
45 | |||
46 | int (* xmain)(void); |
||
47 | |||
48 | void main(void) |
||
49 | { |
||
50 | __libclog_printf("Supplied parameters:\n"); |
||
51 | __libclog_printf("|%s|\n",__menuet__app_param_area); |
||
52 | extract_base_program_name(); |
||
53 | init_dll(); |
||
54 | main_program=load_dll(program_name); |
||
55 | if(!main_program) |
||
56 | { |
||
57 | __libclog_printf("Unable to open main program\n"); |
||
58 | exit(-1); |
||
59 | } |
||
60 | dll_load_table=(char **)mcoff_get_ref(main_program->obj,"__required_dll"); |
||
61 | if(dll_load_table) |
||
62 | { |
||
63 | int i; |
||
64 | for(i=0;dll_load_table[i];i++) |
||
65 | { |
||
66 | if(!(dll=try_load_dll(dll_load_table[i]))) |
||
67 | { |
||
68 | __libclog_printf("Unable to load dll '%s'\n",dll_load_table[i]); |
||
69 | exit(-1); |
||
70 | } |
||
71 | xmain=(void *)mcoff_get_ref(dll->obj,"_DllMain"); |
||
72 | if(xmain) xmain(); |
||
73 | } |
||
74 | } |
||
75 | if(relocate_dlls()!=0) |
||
76 | { |
||
77 | __libclog_printf("Unable to relocate dynamic objects\n"); |
||
78 | exit(-1); |
||
79 | } |
||
80 | xmain=(void *)mcoff_get_ref(main_program->obj,"_app_main"); |
||
81 | if(!xmain) |
||
82 | { |
||
83 | __libclog_printf("Unable to find _app_main symbol in main program"); |
||
84 | exit(-1); |
||
85 | } |
||
86 | exit(xmain()); |
||
87 | } |