Subversion Repositories Kolibri OS

Rev

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
}