8
8
*
9
9
*
10
10
* IDENTIFICATION
11
- * $Header: /cvsroot/pgsql/src/backend/utils/fmgr/dfmgr.c,v 1.64 2003/08/04 02:40:06 momjian Exp $
11
+ * $Header: /cvsroot/pgsql/src/backend/utils/fmgr/dfmgr.c,v 1.65 2003/09/07 02:18:01 tgl Exp $
12
12
*
13
13
*-------------------------------------------------------------------------
14
14
*/
@@ -96,7 +96,8 @@ load_external_function(char *filename, char *funcname,
96
96
if (stat (fullname , & stat_buf ) == -1 )
97
97
ereport (ERROR ,
98
98
(errcode_for_file_access (),
99
- errmsg ("could not access file \"%s\": %m" , fullname )));
99
+ errmsg ("could not access file \"%s\": %m" ,
100
+ fullname )));
100
101
101
102
for (file_scanner = file_list ;
102
103
file_scanner != (DynamicFileList * ) NULL &&
177
178
load_file (char * filename )
178
179
{
179
180
DynamicFileList * file_scanner ,
180
- * p ;
181
+ * prv ,
182
+ * nxt ;
181
183
struct stat stat_buf ;
182
184
char * fullname ;
183
185
@@ -196,31 +198,27 @@ load_file(char *filename)
196
198
(errcode_for_file_access (),
197
199
errmsg ("could not access file \"%s\": %m" , fullname )));
198
200
199
- if (file_list != (DynamicFileList * ) NULL )
201
+ /*
202
+ * We have to zap all entries in the list that match on either filename
203
+ * or inode, else load_external_function() won't do anything.
204
+ */
205
+ prv = NULL ;
206
+ for (file_scanner = file_list ; file_scanner != NULL ; file_scanner = nxt )
200
207
{
201
- if (SAME_INODE (stat_buf , * file_list ))
208
+ nxt = file_scanner -> next ;
209
+ if (strcmp (fullname , file_scanner -> filename ) == 0 ||
210
+ SAME_INODE (stat_buf , * file_scanner ))
202
211
{
203
- p = file_list ;
204
- file_list = p -> next ;
205
- pg_dlclose (p -> handle );
206
- free ((char * ) p );
212
+ if (prv )
213
+ prv -> next = nxt ;
214
+ else
215
+ file_list = nxt ;
216
+ pg_dlclose (file_scanner -> handle );
217
+ free ((char * ) file_scanner );
218
+ /* prv does not change */
207
219
}
208
220
else
209
- {
210
- for (file_scanner = file_list ;
211
- file_scanner -> next != (DynamicFileList * ) NULL ;
212
- file_scanner = file_scanner -> next )
213
- {
214
- if (SAME_INODE (stat_buf , * (file_scanner -> next )))
215
- {
216
- p = file_scanner -> next ;
217
- file_scanner -> next = p -> next ;
218
- pg_dlclose (p -> handle );
219
- free ((char * ) p );
220
- break ;
221
- }
222
- }
223
- }
221
+ prv = file_scanner ;
224
222
}
225
223
226
224
load_external_function (fullname , (char * ) NULL , false, (void * ) NULL );
0 commit comments