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,
9696 if (stat (fullname , & stat_buf ) == -1 )
9797 ereport (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
101102 for (file_scanner = file_list ;
102103 file_scanner != (DynamicFileList * ) NULL &&
177178load_file (char * filename )
178179{
179180 DynamicFileList * file_scanner ,
180- * p ;
181+ * prv ,
182+ * nxt ;
181183 struct stat stat_buf ;
182184 char * fullname ;
183185
@@ -196,31 +198,27 @@ load_file(char *filename)
196198 (errcode_for_file_access (),
197199 errmsg ("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 }
208220 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 ;
224222 }
225223
226224 load_external_function (fullname , (char * ) NULL , false, (void * ) NULL );
0 commit comments