]> granicus.if.org Git - postgresql/blobdiff - src/backend/utils/init/miscinit.c
Seems some C compilers think 'restrict' is a fully reserved word.
[postgresql] / src / backend / utils / init / miscinit.c
index f75d013a810fed7703acdb63299782acd2d5998a..2d979afeada2f72952cf97d1d7d39b397c2fcf65 100644 (file)
@@ -3,12 +3,12 @@
  * miscinit.c
  *       miscellaneous initialization support stuff
  *
- * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2006, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/utils/init/miscinit.c,v 1.153 2006/01/05 10:07:46 petere Exp $
+ *       $PostgreSQL: pgsql/src/backend/utils/init/miscinit.c,v 1.158 2006/08/16 04:32:48 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -30,7 +30,6 @@
 #endif
 
 #include "catalog/pg_authid.h"
-#include "libpq/libpq-be.h"
 #include "miscadmin.h"
 #include "postmaster/autovacuum.h"
 #include "storage/fd.h"
@@ -40,7 +39,6 @@
 #include "storage/procarray.h"
 #include "utils/builtins.h"
 #include "utils/guc.h"
-#include "utils/lsyscache.h"
 #include "utils/syscache.h"
 
 
@@ -1099,24 +1097,31 @@ ValidatePgVersion(const char *path)
  *-------------------------------------------------------------------------
  */
 
-typedef void (*func_ptr) ();
+/* 
+ * GUC variables: lists of library names to be preloaded at postmaster
+ * start and at backend start
+ */
+char      *shared_preload_libraries_string = NULL;
+char      *local_preload_libraries_string = NULL;
 
 /*
- * process any libraries that should be preloaded and
- * optionally pre-initialized
+ * load the shared libraries listed in 'libraries'
+ *
+ * 'gucname': name of GUC variable, for error reports
+ * 'restricted': if true, force libraries to be in $libdir/plugins/
  */
-void
-process_preload_libraries(char *preload_libraries_string)
+static void
+load_libraries(const char *libraries, const char *gucname, bool restricted)
 {
        char       *rawstring;
        List       *elemlist;
        ListCell   *l;
 
-       if (preload_libraries_string == NULL)
-               return;
+       if (libraries == NULL || libraries[0] == '\0')
+               return;                                 /* nothing to do */
 
        /* Need a modifiable copy of string */
-       rawstring = pstrdup(preload_libraries_string);
+       rawstring = pstrdup(libraries);
 
        /* Parse string into list of identifiers */
        if (!SplitIdentifierString(rawstring, ',', &elemlist))
@@ -1126,63 +1131,57 @@ process_preload_libraries(char *preload_libraries_string)
                list_free(elemlist);
                ereport(LOG,
                                (errcode(ERRCODE_SYNTAX_ERROR),
-                errmsg("invalid list syntax for parameter \"preload_libraries\"")));
+                                errmsg("invalid list syntax in parameter \"%s\"",
+                                               gucname)));
                return;
        }
 
        foreach(l, elemlist)
        {
                char       *tok = (char *) lfirst(l);
-               char       *sep = strstr(tok, ":");
-               char       *filename = NULL;
-               char       *funcname = NULL;
-               func_ptr        initfunc;
-
-               if (sep)
-               {
-                       /*
-                        * a colon separator implies there is an initialization function
-                        * that we need to run in addition to loading the library
-                        */
-                       size_t          filename_len = sep - tok;
-                       size_t          funcname_len = strlen(tok) - filename_len - 1;
-
-                       filename = (char *) palloc(filename_len + 1);
-                       memcpy(filename, tok, filename_len);
-                       filename[filename_len] = '\0';
-
-                       funcname = (char *) palloc(funcname_len + 1);
-                       strcpy(funcname, sep + 1);
-               }
-               else
-               {
-                       /*
-                        * no separator -- just load the library
-                        */
-                       filename = pstrdup(tok);
-                       funcname = NULL;
-               }
+               char       *filename;
 
+               filename = pstrdup(tok);
                canonicalize_path(filename);
-               initfunc = (func_ptr) load_external_function(filename, funcname,
-                                                                                                        true, NULL);
-               if (initfunc)
-                       (*initfunc) ();
-
-               if (funcname)
-                       ereport(LOG,
-                                       (errmsg("preloaded library \"%s\" with initialization function \"%s\"",
-                                                       filename, funcname)));
-               else
-                       ereport(LOG,
-                                       (errmsg("preloaded library \"%s\"",
-                                                       filename)));
+               /* If restricting, insert $libdir/plugins if not mentioned already */
+               if (restricted && first_dir_separator(filename) == NULL)
+               {
+                       char   *expanded;
 
+                       expanded = palloc(strlen("$libdir/plugins/") + strlen(filename) + 1);
+                       strcpy(expanded, "$libdir/plugins/");
+                       strcat(expanded, filename);
+                       pfree(filename);
+                       filename = expanded;
+               }
+               load_file(filename, restricted);
+               ereport(LOG,
+                               (errmsg("loaded library \"%s\"", filename)));
                pfree(filename);
-               if (funcname)
-                       pfree(funcname);
        }
 
        pfree(rawstring);
        list_free(elemlist);
 }
+
+/*
+ * process any libraries that should be preloaded at postmaster start
+ */
+void
+process_shared_preload_libraries(void)
+{
+       load_libraries(shared_preload_libraries_string,
+                                  "shared_preload_libraries",
+                                  false);
+}
+
+/*
+ * process any libraries that should be preloaded at backend start
+ */
+void
+process_local_preload_libraries(void)
+{
+       load_libraries(local_preload_libraries_string,
+                                  "local_preload_libraries",
+                                  true);
+}