Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

  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. }
  88.