| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | /*************************************************************************
 | 
					
						
							|  |  |  | *									 * | 
					
						
							|  |  |  | *	 YAP Prolog 							 * | 
					
						
							|  |  |  | *									 * | 
					
						
							|  |  |  | *	Yap Prolog was developed at NCCUP - Universidade do Porto	 * | 
					
						
							|  |  |  | *									 * | 
					
						
							|  |  |  | * Copyright L.Damas, V.S.Costa and Universidade do Porto 1985-1997	 * | 
					
						
							|  |  |  | *									 * | 
					
						
							|  |  |  | ************************************************************************** | 
					
						
							|  |  |  | *									 * | 
					
						
							|  |  |  | * File:		load_dl.c						 * | 
					
						
							|  |  |  | * comments:	dl based dynamic loader  of external routines		 * | 
					
						
							|  |  |  | *               tested on i486-linuxelf					 * | 
					
						
							|  |  |  | *************************************************************************/ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "Yap.h"
 | 
					
						
							|  |  |  | #include "Yatom.h"
 | 
					
						
							| 
									
										
										
										
											2009-10-23 14:22:17 +01:00
										 |  |  | #include "YapHeap.h"
 | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | #include "yapio.h"
 | 
					
						
							|  |  |  | #include "Foreign.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-31 10:17:19 +00:00
										 |  |  | #if _WIN32
 | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | #include <windows.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /*
 | 
					
						
							| 
									
										
										
										
											2002-09-23 17:06:13 +00:00
										 |  |  |  *   YAP_FindExecutable(argv[0]) should be called on yap initialization to | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |  *   locate the executable of Yap | 
					
						
							|  |  |  | */ | 
					
						
							| 
									
										
										
										
											2013-01-19 11:47:14 +00:00
										 |  |  | char * | 
					
						
							|  |  |  | Yap_FindExecutable(void) | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2014-03-04 12:00:13 +00:00
										 |  |  |   enum { BUFFERSIZE = 1024 }; | 
					
						
							|  |  |  |   char *buf = malloc(BUFFERSIZE); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   if (!GetModuleFileName(NULL, buf, BUFFERSIZE-1)) | 
					
						
							|  |  |  |     return NULL; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   return buf; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-06-17 00:29:01 +01:00
										 |  |  | void * | 
					
						
							|  |  |  | Yap_LoadForeignFile(char *file, int flags) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2017-02-20 15:28:46 +00:00
										 |  |  |   char *buf = malloc(1024); | 
					
						
							|  |  |  |   void *ptr= (void *)LoadLibrary(file); | 
					
						
							| 
									
										
										
										
											2013-11-11 10:32:55 +00:00
										 |  |  |  if (!ptr) { | 
					
						
							|  |  |  |    FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, | 
					
						
							| 
									
										
										
										
											2017-02-22 21:28:05 +00:00
										 |  |  | 		 NULL, GetLastError(), | 
					
						
							| 
									
										
										
										
											2017-02-20 15:28:46 +00:00
										 |  |  | 		 MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), buf, 1023, | 
					
						
							| 
									
										
										
										
											2013-11-11 10:32:55 +00:00
										 |  |  | 		 NULL); | 
					
						
							| 
									
										
										
										
											2017-02-20 15:28:46 +00:00
										 |  |  | 		 } | 
					
						
							| 
									
										
										
										
											2013-11-11 10:32:55 +00:00
										 |  |  |  return ptr; | 
					
						
							| 
									
										
										
										
											2010-06-17 00:29:01 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | int | 
					
						
							|  |  |  | Yap_CallForeignFile(void *handle, char *f) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   YapInitProc proc = (YapInitProc)GetProcAddress((HMODULE)handle, f); | 
					
						
							|  |  |  |   if (!proc) | 
					
						
							|  |  |  |     return FALSE; | 
					
						
							|  |  |  |   (*proc)(); | 
					
						
							|  |  |  |   return TRUE; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | int | 
					
						
							|  |  |  | Yap_CloseForeignFile(void *handle) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   return FreeLibrary((HMODULE)handle); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | /*
 | 
					
						
							|  |  |  |  * LoadForeign(ofiles,libs,proc_name,init_proc) dynamically loads foreign | 
					
						
							|  |  |  |  * code files and libraries and locates an initialization routine | 
					
						
							|  |  |  | */ | 
					
						
							| 
									
										
										
										
											2002-11-11 17:38:10 +00:00
										 |  |  | static Int | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | LoadForeign(StringList ofiles, StringList libs, | 
					
						
							| 
									
										
										
										
											2017-02-22 21:28:05 +00:00
										 |  |  | 	       const char *proc_name,	YapInitProc *init_proc) | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2012-06-29 15:35:52 -05:00
										 |  |  |   CACHE_REGS | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |   while (ofiles) { | 
					
						
							|  |  |  |     HINSTANCE handle; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-22 21:28:05 +00:00
										 |  |  |     if (*init_proc == NULL && | 
					
						
							|  |  |  |       (*init_proc = (YapInitProc)GetProcAddress((HMODULE)handle, proc_name))) | 
					
						
							|  |  |  |        { | 
					
						
							|  |  |  |          YapInitProc f = *init_proc; | 
					
						
							|  |  |  |         f(); | 
					
						
							|  |  |  |         return true; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-10 08:33:44 +01:00
										 |  |  |     const char *file = AtomName(ofiles->name); | 
					
						
							| 
									
										
										
										
											2017-02-20 15:28:46 +00:00
										 |  |  |     if (Yap_findFile(file, NULL, NULL, LOCAL_FileNameBuf, true, YAP_OBJ, true, true) && | 
					
						
							| 
									
										
										
										
											2011-05-23 16:19:47 +01:00
										 |  |  | 	(handle=LoadLibrary(LOCAL_FileNameBuf)) != 0) | 
					
						
							| 
									
										
										
										
											2009-07-20 20:55:22 -07:00
										 |  |  |       { | 
					
						
							| 
									
										
										
										
											2016-11-08 01:37:36 -06:00
										 |  |  |        LOCAL_ErrorMessage = NULL; | 
					
						
							| 
									
										
										
										
											2009-07-20 20:55:22 -07:00
										 |  |  | 	if (*init_proc == NULL) | 
					
						
							|  |  |  | 	  *init_proc = (YapInitProc)GetProcAddress((HMODULE)handle, proc_name); | 
					
						
							|  |  |  |       } else { | 
					
						
							| 
									
										
										
										
											2017-02-22 21:28:05 +00:00
										 |  |  |       char *buf = malloc(1024); | 
					
						
							| 
									
										
										
										
											2017-02-20 15:28:46 +00:00
										 |  |  |    FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, | 
					
						
							| 
									
										
										
										
											2017-02-22 21:28:05 +00:00
										 |  |  | 		 NULL, GetLastError(), | 
					
						
							| 
									
										
										
										
											2017-02-20 15:28:46 +00:00
										 |  |  | 		 MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), buf, 1023, | 
					
						
							|  |  |  | 		 NULL); | 
					
						
							| 
									
										
										
										
											2013-11-11 10:32:55 +00:00
										 |  |  | 	//fprintf(stderr,"WinError: %s\n", LOCAL_ErrorSay);
 | 
					
						
							| 
									
										
										
										
											2009-07-20 20:55:22 -07:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     ofiles = ofiles->next; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   /* load libraries first so that their symbols are available to
 | 
					
						
							|  |  |  |      other routines */ | 
					
						
							|  |  |  |   while (libs) { | 
					
						
							|  |  |  |     HINSTANCE handle; | 
					
						
							| 
									
										
										
										
											2016-01-31 10:17:19 +00:00
										 |  |  |     const char * s = AtomName(libs->name); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-12-12 18:28:55 +00:00
										 |  |  |     if (s[0] == '-') { | 
					
						
							| 
									
										
										
										
											2011-05-23 16:19:47 +01:00
										 |  |  |       strcat(LOCAL_FileNameBuf,s+2); | 
					
						
							|  |  |  |       strcat(LOCAL_FileNameBuf,".dll"); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     } else { | 
					
						
							| 
									
										
										
										
											2011-05-23 16:19:47 +01:00
										 |  |  |       strcpy(LOCAL_FileNameBuf,s); | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-05-23 16:19:47 +01:00
										 |  |  |     if((handle=LoadLibrary(LOCAL_FileNameBuf)) == 0) | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2011-05-23 16:19:47 +01:00
										 |  |  | /*      strcpy(LOCAL_ErrorSay,dlerror());*/ | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |       return LOAD_FAILLED; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (*init_proc == NULL) | 
					
						
							|  |  |  |       *init_proc = (YapInitProc)GetProcAddress((HMODULE)handle, proc_name); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     libs = libs->next; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   if(*init_proc == NULL) { | 
					
						
							| 
									
										
										
										
											2016-11-08 01:37:36 -06:00
										 |  |  |     LOCAL_ErrorMessage = "Could not locate initialization routine"; | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  |     return LOAD_FAILLED; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   return LOAD_SUCCEEDED; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-11 17:38:10 +00:00
										 |  |  | Int | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  | Yap_LoadForeign(StringList ofiles, StringList libs, | 
					
						
							| 
									
										
										
										
											2002-11-11 17:38:10 +00:00
										 |  |  | 	       char *proc_name,	YapInitProc *init_proc) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   return LoadForeign(ofiles, libs, proc_name, init_proc); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-22 21:28:05 +00:00
										 |  |  | void | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  | Yap_ShutdownLoadForeign(void) | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | { | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Int | 
					
						
							| 
									
										
										
										
											2002-11-18 18:18:05 +00:00
										 |  |  | Yap_ReLoadForeign(StringList ofiles, StringList libs, | 
					
						
							| 
									
										
										
										
											2001-04-09 19:54:03 +00:00
										 |  |  | 	       char *proc_name,	YapInitProc *init_proc) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   return(LoadForeign(ofiles,libs, proc_name, init_proc)); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #endif
 |