/[tewi]/Server/module.c
ViewVC logotype

Contents of /Server/module.c

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph


Revision 1.2 - (show annotations)
Sun Nov 3 10:40:12 2024 UTC (11 days, 20 hours ago) by nishi
Branch: MAIN
CVS Tags: HEAD
Changes since 1.1: +2 -2 lines
Content type: text/x-c
amiga

1 /* $Id: module.c 402 2024-11-03 10:39:59Z nishi $ */
2
3 #define SOURCE
4
5 #include "tw_module.h"
6
7 #include "tw_config.h"
8
9 #include <cm_string.h>
10 #include <cm_log.h>
11
12 #include <string.h>
13 #include <stdlib.h>
14 #if !defined(_MSC_VER) && !defined(__BORLANDC__)
15 #include <unistd.h>
16 #endif
17
18 extern struct tw_config config;
19
20 #if defined(_PSP) || defined(__PPU__) || defined(__ps2sdk__) || defined(__NeXT__) || defined(__DOS__) || defined(__amiga__)
21 void* tw_module_load(const char* path) { return NULL; }
22
23 void* tw_module_symbol(void* mod, const char* sym) { return NULL; }
24
25 int tw_module_init(void* mod) { return 1; }
26
27 #else
28
29 #if defined(__MINGW32__) || defined(_MSC_VER) || defined(__BORLANDC__) || defined(__WATCOMC__)
30 #ifdef __OS2__
31 #define INCL_DOSMODULEMGR
32 #define INCL_DOSERRORS
33 #include <os2.h>
34 #elif defined(__NETWARE__)
35 #include <nwadv.h>
36 #include <nwthread.h>
37 #else
38 #include <windows.h>
39 #include <direct.h>
40 #endif
41 #else
42 #include <dlfcn.h>
43 #endif
44
45 void* tw_module_load(const char* path) {
46 char* p = getcwd(NULL, 0);
47 void* lib;
48 char tmp[512];
49 #ifdef __OS2__
50 HMODULE mod;
51 #elif defined(__NETWARE__)
52 unsigned int* hnd = malloc(sizeof(*hnd));
53 #endif
54 chdir(config.server_root);
55 #if defined(__MINGW32__) || defined(_MSC_VER) || defined(__BORLANDC__) || defined(__WATCOMC__)
56 #ifdef __OS2__
57 if(DosLoadModule(tmp, 512, path, &mod) != NO_ERROR) {
58 return NULL;
59 }
60 lib = (void*)mod;
61 #elif defined(__NETWARE__)
62 *hnd = FindNLMHandle(path);
63 if(*hnd == 0){
64 free(hnd);
65 hnd = NULL;
66 }
67 lib = (void*)hnd;
68 #else
69 lib = LoadLibraryA(path);
70 #endif
71 #else
72 lib = dlopen(path, RTLD_LAZY);
73 #endif
74 if(lib == NULL) {
75 cm_log("Module", "Could not load %s", path);
76 }
77 chdir(p);
78 free(p);
79 return lib;
80 }
81
82 void* tw_module_symbol(void* mod, const char* sym) {
83 #if defined(__MINGW32__) || defined(_MSC_VER) || defined(__BORLANDC__) || defined(__WATCOMC__)
84 #ifdef __OS2__
85 void* ret;
86 APIRET rc;
87 if((rc = DosQueryProcAddr((HMODULE)mod, 0, sym, (PFN*)&ret)) != NO_ERROR) {
88 cm_log("Module", "OS/2 error %d", (int)rc);
89 return NULL;
90 }
91 return ret;
92 #elif defined(__NETWARE__)
93 return ImportSymbol(*(unsigned int*)mod, sym);
94 #else
95 return GetProcAddress(mod, sym);
96 #endif
97 #else
98 return dlsym(mod, sym);
99 #endif
100 }
101
102 int tw_module_init(void* mod) {
103 tw_mod_init_t mod_init = (tw_mod_init_t)tw_module_symbol(mod, "mod_init");
104 if(mod_init == NULL) {
105 cm_log("Module", "Could not find a init call");
106 return 1;
107 } else {
108 struct tw_tool tools;
109 tw_init_tools(&tools);
110 return mod_init(&config, &tools);
111 }
112 }
113 #endif
114
115 void tw_add_version(const char* string) {
116 if(config.extension == NULL) {
117 config.extension = cm_strcat(" ", string);
118 } else {
119 char* tmp = config.extension;
120 config.extension = cm_strcat3(tmp, " ", string);
121 free(tmp);
122 }
123 }
124
125 void tw_add_define(const char* string) {
126 int i;
127 for(i = 0; config.defined[i] != NULL; i++) {
128 if(strcmp(config.defined[i], string) == 0) {
129 return;
130 }
131 }
132 for(i = 0; config.defined[i] != NULL; i++)
133 ;
134 config.defined[i] = cm_strdup(string);
135 config.defined[i + 1] = NULL;
136 }
137
138 void tw_delete_define(const char* string) {
139 int i;
140 for(i = 0; config.defined[i] != NULL; i++) {
141 if(strcmp(config.defined[i], string) == 0) {
142 free(config.defined[i]);
143 for(; config.defined[i] != NULL; i++) {
144 config.defined[i] = config.defined[i + 1];
145 }
146 break;
147 }
148 }
149 }
150
151 void tw_init_tools(struct tw_tool* tools) {
152 tools->log = cm_log;
153 tools->add_version = tw_add_version;
154 tools->add_define = tw_add_define;
155 }

nishi@chaotic.ninja
ViewVC Help
Powered by ViewVC 1.3.0-dev