88 *
99 *
1010 * 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 $
1212 *
1313 *-------------------------------------------------------------------------
1414 */
@@ -96,7 +96,8 @@ load_external_function(char *filename, char *funcname,
9696if (stat (fullname ,& stat_buf )== -1 )
9797ereport (ERROR ,
9898(errcode_for_file_access (),
99- errmsg ("could not access file \"%s\": %m" ,fullname )));
99+ errmsg ("could not access file \"%s\": %m" ,
100+ fullname )));
100101
101102for (file_scanner = file_list ;
102103file_scanner != (DynamicFileList * )NULL &&
177178load_file (char * filename )
178179{
179180DynamicFileList * file_scanner ,
180- * p ;
181+ * prv ,
182+ * nxt ;
181183struct stat stat_buf ;
182184char * fullname ;
183185
@@ -196,31 +198,27 @@ load_file(char *filename)
196198(errcode_for_file_access (),
197199errmsg ("could not access file \"%s\": %m" ,fullname )));
198200
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 )
200207{
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 ))
202211{
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 */
207219}
208220else
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 ;
224222}
225223
226224load_external_function (fullname , (char * )NULL , false, (void * )NULL );