70
71void *dlopen(
char
*filename,
int
flags)
72{
73
HMODULE
hm;
74 DLLchain tmp;
75
char
err[256];
76
char
*errtxt;
77
int
rc = 0, set_chain = 0;
78
79
for
(tmp = dlload; tmp; tmp = tmp->next)
80
if
(strnicmp(tmp->name, filename, 999) == 0)
81
break
;
82
83
if
(!tmp)
84 {
85 tmp = (DLLchain)
malloc
(
sizeof
(tDLLchain));
86
if
(!tmp)
87
goto
nomem;
88 tmp->name = strdup(filename);
89 tmp->next = dlload;
90 set_chain = 1;
91 }
92
93
switch
(rc = DosLoadModule((PSZ)&err,
sizeof
(err), filename, &hm))
94 {
95
case
NO_ERROR:
96 tmp->handle = hm;
97
if
(set_chain)
98 {
99
do
100 last_id++;
101
while
((last_id == 0) || (find_id(last_id)));
102 tmp->id = last_id;
103 dlload = tmp;
104 }
105
return
tmp->id;
106
case
ERROR_FILE_NOT_FOUND:
107
case
ERROR_PATH_NOT_FOUND:
108 errtxt =
"module `%s' not found"
;
109
break
;
110
case
ERROR_TOO_MANY_OPEN_FILES:
111
case
ERROR_NOT_ENOUGH_MEMORY:
112
case
ERROR_SHARING_BUFFER_EXCEEDED:
113nomem:
114 errtxt =
"out of system resources"
;
115
break
;
116
case
ERROR_ACCESS_DENIED:
117 errtxt =
"access denied"
;
118
break
;
119
case
ERROR_BAD_FORMAT:
120
case
ERROR_INVALID_SEGMENT_NUMBER:
121
case
ERROR_INVALID_ORDINAL:
122
case
ERROR_INVALID_MODULETYPE:
123
case
ERROR_INVALID_EXE_SIGNATURE:
124
case
ERROR_EXE_MARKED_INVALID:
125
case
ERROR_ITERATED_DATA_EXCEEDS_64K:
126
case
ERROR_INVALID_MINALLOCSIZE:
127
case
ERROR_INVALID_SEGDPL:
128
case
ERROR_AUTODATASEG_EXCEEDS_64K:
129
case
ERROR_RELOCSRC_CHAIN_EXCEEDS_SEGLIMIT:
130 errtxt =
"invalid module format"
;
131
break
;
132
case
ERROR_INVALID_NAME:
133 errtxt =
"filename doesn't match module name"
;
134
break
;
135
case
ERROR_SHARING_VIOLATION:
136
case
ERROR_LOCK_VIOLATION:
137 errtxt =
"sharing violation"
;
138
break
;
139
case
ERROR_INIT_ROUTINE_FAILED:
140 errtxt =
"module initialization failed"
;
141
break
;
142
default
:
143 errtxt =
"cause `%s', error code = %d"
;
144
break
;
145 }
146 snprintf(dlerr,
sizeof
(dlerr), errtxt, &err, rc);
147
if
(tmp)
148 {
149
if
(tmp->name)
150
free
(tmp->name);
151
free
(tmp);
152 }
153
return
0;
154}