Add files to do read I/O on the cluster directory:
authorBruce Momjian
Fri, 12 Aug 2005 03:25:13 +0000 (03:25 +0000)
committerBruce Momjian
Fri, 12 Aug 2005 03:25:13 +0000 (03:25 +0000)
pg_stat_file()
pg_read_file()
pg_ls_dir()
pg_reload_conf()
pg_rotate_logfile()

Dave Page
Andreas Pflug

doc/src/sgml/func.sgml
src/backend/postmaster/postmaster.c
src/backend/postmaster/syslogger.c
src/backend/utils/adt/Makefile
src/backend/utils/adt/genfile.c [new file with mode: 0644]
src/backend/utils/adt/misc.c
src/include/catalog/pg_proc.h
src/include/storage/pmsignal.h
src/include/utils/builtins.h

index 7dc9a3b597888d740e4472b85c49b97541c37696..177717ff88b5414a7707a23ade487b38e3185de8 100644 (file)
@@ -1,5 +1,5 @@
 
 
@@ -9061,6 +9061,9 @@ SELECT set_config('log_statement_stats', 'off', false);
    
     pg_cancel_backend
    
+   
+    pg_reload_conf
+   
 
    
     signal
@@ -9068,7 +9071,7 @@ SELECT set_config('log_statement_stats', 'off', false);
    
 
    
-    The function shown in 
+    The functions shown in 
     linkend="functions-admin-signal-table"> sends control signals to
     other server processes.  Use of this function is restricted
     to superusers.
@@ -9090,26 +9093,36 @@ SELECT set_config('log_statement_stats', 'off', false);
        int
        Cancel a backend's current query
       
+      
+       
+        pg_reload_conf()
+        
+       int
+       Causes server processes to reload their configuration files
+      
      
     
    
 
    
-    This function returns 1 if successful, 0 if not successful.
+    These functions return 1 if successful, 0 if not successful.
     The process ID (pid) of an active backend can be found
     from the procpid column in the
     pg_stat_activity view, or by listing the postgres
     processes on the server with ps.
    
+   
+    pg_reload_conf sends a SIGHUP signal to the
+    postmaster, causing the reload of the configuration files
+    in all backend processes.
+   
 
    
     pg_start_backup
    
-
    
     pg_stop_backup
    
-
    
     backup
    
@@ -9309,6 +9322,113 @@ SELECT set_config('log_statement_stats', 'off', false);
     appropriate.
    
 
+   
+    The functions shown in 
+    linkend="functions-admin-genfile"> provide native file access to
+    files on the machine hosting the server. Only files relative to
+    the cluster directory are allowed, and the logfile directory,
+    because the logfile directory might be stored outside the 
+    cluster directory.  Use of these functions is restricted to 
+    superusers.
+   
+
+   
+    Generic File Access Functions
+    
+     
+      Name Return Type Description
+      
+     
+
+     
+      
+       
+        pg_file_length(filename_text)
+         
+          pg_file_length
+        
+       
+       int8
+       Returns the file length
+      
+      
+       
+        pg_ls_dir(dirname_text,fullpath_bool)
+        
+         pg_ls_dir
+        
+       
+       setof text
+       List the contents of a directory
+      
+      
+       
+        pg_read_file(filename_text,
+        offset_int8,length_int8)
+       
+       text
+       Returns the contents of a text file
+      
+      
+       
+        pg_stat_file(filename_text)
+       
+       record
+       Returns information about the file
+      
+     
+    
+   
+
+   
+    pg_read_file
+   
+   
+    pg_read_file() returns part of a textfile, starting
+    at the given offset, returning length bytes.  If offset is negative, 
+    it is treated relative to the end of the file.
+   
+
+   
+    pg_stat_file
+   
+   
+    pg_stat_file() returns a record containing the
+    length, last accessed timestamp, last modified timestamp, 
+    creation timestamp, and a flag indicating if it is a directory.
+   
+
+   
+    The function shown in 
+    linkend="functions-admin-logfile"> forces the server
+    logfile to be rotated if redirect_stderr
+    is used for logging.   Use of this functions is restricted
+    to superusers.
+   
+
+   
+    Backend Logfile Functions
+    
+     
+      Name Return Type Description
+      
+     
+
+     
+      
+       
+        pg_rotate_logfile()
+        
+         pg_rotate_logfile
+        
+        
+       int
+       Rotate logfile
+      
+     
+    
+   
+
   
 
 
index 110b5816c4e32d7a48e80757835d31dea6cbe323..0c7dc354208e861cb65ac6abb119f82d96896cbe 100644 (file)
@@ -37,7 +37,7 @@
  *
  *
  * IDENTIFICATION
- *   $PostgreSQL: pgsql/src/backend/postmaster/postmaster.c,v 1.462 2005/08/11 21:11:44 tgl Exp $
+ *   $PostgreSQL: pgsql/src/backend/postmaster/postmaster.c,v 1.463 2005/08/12 03:23:51 momjian Exp $
  *
  * NOTES
  *
@@ -3394,6 +3394,9 @@ sigusr1_handler(SIGNAL_ARGS)
        }
    }
 
+   if (CheckPostmasterSignal(PMSIGNAL_ROTATE_LOGFILE) && SysLoggerPID != 0)
+       kill(SysLoggerPID, SIGUSR1);
+
    PG_SETMASK(&UnBlockSig);
 
    errno = save_errno;
index a97a4183df4831c4bc1dec7bbe1b95ba8bf35394..e5aa153dd47a7218377c8e8c521f7844382a87f6 100644 (file)
@@ -18,7 +18,7 @@
  *
  *
  * IDENTIFICATION
- *   $PostgreSQL: pgsql/src/backend/postmaster/syslogger.c,v 1.18 2005/07/21 18:06:12 momjian Exp $
+ *   $PostgreSQL: pgsql/src/backend/postmaster/syslogger.c,v 1.19 2005/08/12 03:23:51 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -101,6 +101,7 @@ static CRITICAL_SECTION sysfileSection;
  * Flags set by interrupt handlers for later service in the main loop.
  */
 static volatile sig_atomic_t got_SIGHUP = false;
+static volatile sig_atomic_t rotation_requested = false;
 
 
 /* Local subroutines */
@@ -117,6 +118,7 @@ static void logfile_rotate(bool time_based_rotation);
 static char *logfile_getname(pg_time_t timestamp);
 static void set_next_rotation_time(void);
 static void sigHupHandler(SIGNAL_ARGS);
+static void sigUsr1Handler(SIGNAL_ARGS);
 
 
 /*
@@ -200,7 +202,7 @@ SysLoggerMain(int argc, char *argv[])
    pqsignal(SIGQUIT, SIG_IGN);
    pqsignal(SIGALRM, SIG_IGN);
    pqsignal(SIGPIPE, SIG_IGN);
-   pqsignal(SIGUSR1, SIG_IGN);
+   pqsignal(SIGUSR1, sigUsr1Handler);  /* request log rotation */
    pqsignal(SIGUSR2, SIG_IGN);
 
    /*
@@ -235,7 +237,6 @@ SysLoggerMain(int argc, char *argv[])
    /* main worker loop */
    for (;;)
    {
-       bool        rotation_requested = false;
        bool        time_based_rotation = false;
 
 #ifndef WIN32
@@ -726,6 +727,8 @@ logfile_rotate(bool time_based_rotation)
    char       *filename;
    FILE       *fh;
 
+   rotation_requested = false;
+
    /*
     * When doing a time-based rotation, invent the new logfile name based
     * on the planned rotation time, not current time, to avoid "slippage"
@@ -876,3 +879,10 @@ sigHupHandler(SIGNAL_ARGS)
 {
    got_SIGHUP = true;
 }
+
+/* SIGUSR1: set flag to rotate logfile */
+static void
+sigUsr1Handler(SIGNAL_ARGS)
+{
+   rotation_requested = true;
+}
index a0b4bf7dfd44aa5dbb0c9cc34ae73de2d19f1a43..294fd9de49b757e745bfb4343bc14982b0d931ab 100644 (file)
@@ -1,7 +1,7 @@
 #
 # Makefile for utils/adt
 #
-# $PostgreSQL: pgsql/src/backend/utils/adt/Makefile,v 1.58 2005/07/29 14:46:57 momjian Exp $
+# $PostgreSQL: pgsql/src/backend/utils/adt/Makefile,v 1.59 2005/08/12 03:24:08 momjian Exp $
 #
 
 subdir = src/backend/utils/adt
@@ -24,7 +24,7 @@ OBJS = acl.o arrayfuncs.o array_userfuncs.o arrayutils.o bool.o \
    tid.o timestamp.o varbit.o varchar.o varlena.o version.o xid.o \
    network.o mac.o inet_net_ntop.o inet_net_pton.o \
    ri_triggers.o pg_lzcompress.o pg_locale.o formatting.o \
-   ascii.o quote.o pgstatfuncs.o encode.o dbsize.o
+   ascii.o quote.o pgstatfuncs.o encode.o dbsize.o genfile.o
 
 like.o: like.c like_match.c
 
diff --git a/src/backend/utils/adt/genfile.c b/src/backend/utils/adt/genfile.c
new file mode 100644 (file)
index 0000000..cd34b54
--- /dev/null
@@ -0,0 +1,258 @@
+/*-------------------------------------------------------------------------
+ *
+ * genfile.c
+ *
+ *
+ * Copyright (c) 2004, PostgreSQL Global Development Group
+ * 
+ * Author: Andreas Pflug 
+ *
+ * IDENTIFICATION
+ *   $PostgreSQL: pgsql/src/backend/utils/adt/genfile.c,v 1.1 2005/08/12 03:24:08 momjian Exp $
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres.h"
+
+#include 
+#include 
+#include 
+#include 
+
+#include "utils/builtins.h"
+#include "miscadmin.h"
+#include "storage/fd.h"
+#include "catalog/pg_type.h"
+#include "funcapi.h"
+
+extern  char *Log_directory;
+
+typedef struct 
+{
+   char    *location;
+   DIR     *dirdesc;
+} directory_fctx;
+
+/*
+ * Return an absolute path. Argument may be absolute or 
+ * relative to the DataDir.
+ */
+static char *check_and_make_absolute(text *arg)
+{
+   int datadir_len = strlen(DataDir);
+   int filename_len = VARSIZE(arg) - VARHDRSZ;
+   char *filename = palloc(filename_len + 1);
+   
+   memcpy(filename, VARDATA(arg), filename_len);
+   filename[filename_len] = '\0';
+
+   canonicalize_path(filename);
+   filename_len = strlen(filename);    /* recompute */
+
+   /*
+    *  Prevent reference to the parent directory.
+    *  "..a.." is a valid file name though.
+    */
+   if (strcmp(filename, "..") == 0 ||                          /* beginning */
+       strncmp(filename, "../", 3) == 0 ||                     /* beginning */
+       strcmp(filename, "/..") == 0 ||                         /* beginning */
+       strncmp(filename, "../", 3) == 0 ||                     /* beginning */
+       strstr(filename, "/../") != NULL ||                     /* middle */
+       strncmp(filename + filename_len - 3, "/..", 3) == 0)    /* end */
+           ereport(ERROR,
+                 (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
+                  (errmsg("Reference to a parent directory (\"..\") not allowed"))));
+
+   if (is_absolute_path(filename))
+   {
+       /* The log directory might be outside our datadir, but allow it */
+       if (is_absolute_path(Log_directory) &&
+           strncmp(filename, Log_directory, strlen(Log_directory)) == 0 &&
+           (filename[strlen(Log_directory)] == '/' ||
+            filename[strlen(Log_directory)] == '\0'))
+           return filename;
+
+       ereport(ERROR,
+               (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
+                (errmsg("Absolute paths not allowed"))));
+       return NULL;
+   }
+   else
+   {
+       char *absname = palloc(datadir_len + filename_len + 2);
+       sprintf(absname, "%s/%s", DataDir, filename);
+       pfree(filename);
+       return absname;
+   }
+}
+
+
+Datum pg_read_file(PG_FUNCTION_ARGS)
+{
+   int64       bytes_to_read = PG_GETARG_INT64(2);
+   int64       seek_offset = PG_GETARG_INT64(1);
+   char        *buf = 0;
+   size_t      nbytes;
+   FILE        *file;
+   char        *filename;
+
+   if (!superuser())
+       ereport(ERROR,
+               (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
+                (errmsg("must be superuser to read files"))));
+
+   filename = check_and_make_absolute(PG_GETARG_TEXT_P(0));
+
+   if ((file = AllocateFile(filename, PG_BINARY_R)) == NULL)
+   {
+       ereport(ERROR,
+               (errcode_for_file_access(),
+                errmsg("could not open file %s for reading: %m", filename)));
+       PG_RETURN_NULL();
+   }
+
+   if (fseeko(file, (off_t)seek_offset,
+       (seek_offset >= 0) ? SEEK_SET : SEEK_END) != 0)
+   {
+       ereport(ERROR,
+               (errcode_for_file_access(),
+                errmsg("could not seek in file %s: %m", filename)));
+       PG_RETURN_NULL();
+   }
+
+   if (bytes_to_read < 0)
+   {
+       ereport(ERROR,
+           (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+                errmsg("length cannot be negative")));
+   }
+   
+   buf = palloc(bytes_to_read + VARHDRSZ);
+
+   nbytes = fread(VARDATA(buf), 1, bytes_to_read, file);
+
+   if (nbytes < 0)
+   {
+       ereport(ERROR,
+               (errcode_for_file_access(),
+                errmsg("could not read file %s: %m", filename)));
+       PG_RETURN_NULL();
+   }
+   VARATT_SIZEP(buf) = nbytes + VARHDRSZ;
+
+   pfree(filename);
+   FreeFile(file);
+   PG_RETURN_TEXT_P(buf);
+}
+
+
+Datum pg_stat_file(PG_FUNCTION_ARGS)
+{
+   AttInMetadata *attinmeta;
+   char        *filename = check_and_make_absolute(PG_GETARG_TEXT_P(0));
+   struct stat fst;
+   char        lenbuf[30], cbuf[30], abuf[30], mbuf[30], dirbuf[2];
+   char        *values[5] = {lenbuf, cbuf, abuf, mbuf, dirbuf};
+   pg_time_t   timestamp;
+   HeapTuple   tuple;
+   TupleDesc   tupdesc = CreateTemplateTupleDesc(5, false);
+
+   if (!superuser())
+       ereport(ERROR,
+               (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
+                (errmsg("must be superuser to get file information"))));
+
+   TupleDescInitEntry(tupdesc, (AttrNumber) 1, "length", INT8OID, -1, 0);
+   TupleDescInitEntry(tupdesc, (AttrNumber) 2, "atime", TIMESTAMPOID, -1, 0);
+   TupleDescInitEntry(tupdesc, (AttrNumber) 3, "mtime", TIMESTAMPOID, -1, 0);
+   TupleDescInitEntry(tupdesc, (AttrNumber) 4, "ctime", TIMESTAMPOID, -1, 0);
+   TupleDescInitEntry(tupdesc, (AttrNumber) 5, "isdir", BOOLOID, -1, 0);
+   attinmeta = TupleDescGetAttInMetadata(tupdesc);
+
+   if (stat(filename, &fst) < 0)
+   {
+       ereport(ERROR,
+               (errcode_for_file_access(),
+                errmsg("could not stat file %s: %m", filename)));
+       PG_RETURN_NULL();
+   }
+   else
+   {
+       snprintf(lenbuf, 30, INT64_FORMAT, (int64)fst.st_size);
+
+       timestamp = fst.st_atime;
+       pg_strftime(abuf, 30, "%F %T", pg_localtime(×tamp, global_timezone));
+
+       timestamp = fst.st_mtime;
+       pg_strftime(mbuf, 30, "%F %T", pg_localtime(×tamp, global_timezone));
+
+       timestamp = fst.st_ctime;
+       pg_strftime(cbuf, 30, "%F %T", pg_localtime(×tamp, global_timezone));
+
+       if (fst.st_mode & S_IFDIR)
+           strcpy(dirbuf, "t");
+       else
+           strcpy(dirbuf, "f");
+
+       tuple = BuildTupleFromCStrings(attinmeta, values);
+       pfree(filename);
+       PG_RETURN_DATUM(HeapTupleGetDatum(tuple));
+   }
+}
+
+
+Datum pg_ls_dir(PG_FUNCTION_ARGS)
+{
+   FuncCallContext *funcctx;
+   struct dirent   *de;
+   directory_fctx  *fctx;
+
+   if (!superuser())
+       ereport(ERROR,
+               (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
+                (errmsg("must be superuser to get directory listings"))));
+
+   if (SRF_IS_FIRSTCALL())
+   {
+       MemoryContext oldcontext;
+
+       funcctx = SRF_FIRSTCALL_INIT();
+       oldcontext = MemoryContextSwitchTo(funcctx->multi_call_memory_ctx);
+
+       fctx = palloc(sizeof(directory_fctx));
+       fctx->location = check_and_make_absolute(PG_GETARG_TEXT_P(0));
+
+       fctx->dirdesc = AllocateDir(fctx->location);
+
+       if (!fctx->dirdesc)
+           ereport(ERROR,
+                   (errcode_for_file_access(),
+                    errmsg("%s is not browsable: %m", fctx->location)));
+
+       funcctx->user_fctx = fctx;
+       MemoryContextSwitchTo(oldcontext);
+   }
+
+   funcctx = SRF_PERCALL_SETUP();
+   fctx = (directory_fctx*) funcctx->user_fctx;
+
+   if (!fctx->dirdesc)  /* not a readable directory  */
+       SRF_RETURN_DONE(funcctx);
+
+   while ((de = ReadDir(fctx->dirdesc, fctx->location)) != NULL)
+   {
+       int         len = strlen(de->d_name);
+       text        *result = palloc(len + VARHDRSZ);
+
+       if (strcmp(de->d_name, ".") == 0 || strcmp(de->d_name, "..") == 0)
+           continue;
+
+       VARATT_SIZEP(result) = len + VARHDRSZ;
+       memcpy(VARDATA(result), de->d_name, len);
+
+       SRF_RETURN_NEXT(funcctx, PointerGetDatum(result));
+   }
+
+   FreeDir(fctx->dirdesc);
+   SRF_RETURN_DONE(funcctx);
+}
index 867f7da7e2a7d8187bc15770f2591082d7be9d51..40b4c64cd12dc57fc732ab4400d3c33c533aeac1 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *   $PostgreSQL: pgsql/src/backend/utils/adt/misc.c,v 1.45 2005/07/04 04:51:50 tgl Exp $
+ *   $PostgreSQL: pgsql/src/backend/utils/adt/misc.c,v 1.46 2005/08/12 03:24:08 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
 #include "commands/dbcommands.h"
 #include "miscadmin.h"
 #include "storage/procarray.h"
+#include "storage/pmsignal.h"
 #include "storage/fd.h"
 #include "utils/builtins.h"
+#include "utils/elog.h"
 #include "funcapi.h"
 #include "catalog/pg_type.h"
 #include "catalog/pg_tablespace.h"
+#include "postmaster/syslogger.h"
 
 #define atooid(x)  ((Oid) strtoul((x), NULL, 10))
 
+typedef struct 
+{
+   char    *location;
+   DIR     *dirdesc;
+} directory_fctx;
+
 
 /*
  * Check if data is Null
@@ -107,6 +116,51 @@ pg_cancel_backend(PG_FUNCTION_ARGS)
    PG_RETURN_INT32(pg_signal_backend(PG_GETARG_INT32(0), SIGINT));
 }
 
+
+Datum
+pg_reload_conf(PG_FUNCTION_ARGS)
+{
+   if (!superuser()) 
+       ereport(ERROR,
+               (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
+                (errmsg("must be superuser to signal the postmaster"))));
+
+   if (kill(PostmasterPid, SIGHUP))
+   {
+       ereport(WARNING,
+               (errmsg("failed to send signal to postmaster: %m")));
+
+       PG_RETURN_INT32(0);
+   }
+
+   PG_RETURN_INT32(1);
+}
+
+
+/*
+ * Rotate log file
+ */
+Datum
+pg_rotate_logfile(PG_FUNCTION_ARGS)
+{
+   if (!superuser()) 
+       ereport(ERROR,
+               (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
+                (errmsg("must be superuser to rotate log files"))));
+
+   if (!Redirect_stderr)
+   {
+       ereport(NOTICE,
+               (errcode(ERRCODE_WARNING),
+                errmsg("no logfile configured; rotation not supported")));
+       PG_RETURN_INT32(0);
+   }
+
+   SendPostmasterSignal(PMSIGNAL_ROTATE_LOGFILE);
+
+   PG_RETURN_INT32(0);
+}
+
 #ifdef NOT_USED
 
 /* Disabled in 8.0 due to reliability concerns; FIXME someday */
index 71f51172dc5cde99eea9fdd079ff6c420f385f8e..c677e43c1950c1915f3aa546850f9cf58540604d 100644 (file)
@@ -7,7 +7,7 @@
  * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/catalog/pg_proc.h,v 1.380 2005/08/02 16:11:57 tgl Exp $
+ * $PostgreSQL: pgsql/src/include/catalog/pg_proc.h,v 1.381 2005/08/12 03:24:22 momjian Exp $
  *
  * NOTES
  *   The script catalog/genbki.sh reads this file and generates .bki
@@ -3049,6 +3049,23 @@ DESCR("Prepare for taking an online backup");
 DATA(insert OID = 2173 ( pg_stop_backup            PGNSP PGUID 12 f f t f v 0 25 "" _null_ _null_ _null_ pg_stop_backup - _null_ ));
 DESCR("Finish taking an online backup");
 
+DATA(insert OID = 2621 ( pg_reload_conf         PGNSP PGUID 12 f f t f v 0 23 "" _null_ _null_ _null_ pg_reload_conf - _null_ ));
+DESCR("Reload configuration files");
+
+DATA(insert OID = 2622 ( pg_rotate_logfile     PGNSP PGUID 12 f f t f v 0 23 "" _null_ _null_ _null_ pg_rotate_logfile - _null_ ));
+DESCR("Rotate log file");
+
+
+DATA(insert OID = 2623 ( pg_stat_file      PGNSP PGUID 12 f f t f v 1 2249 "25" _null_ _null_ _null_ pg_stat_file - _null_ ));
+DESCR("Return file information");
+DATA(insert OID = 2624 ( pg_file_length        PGNSP PGUID 14 f f t f v 1 20 "25" _null_ _null_ _null_ "SELECT len FROM pg_stat_file($1) AS s(len int8, c timestamp, a timestamp, m timestamp, i bool)" - _null_ ));
+DESCR("Return file length");
+DATA(insert OID = 2625 ( pg_read_file      PGNSP PGUID 12 f f t f v 3 25 "25 20 20" _null_ _null_ _null_ pg_read_file - _null_ ));
+DESCR("Read text from a file");
+DATA(insert OID = 2626 ( pg_ls_dir         PGNSP PGUID 12 f f t t v 1 25 "25" _null_ _null_ _null_ pg_ls_dir - _null_ ));
+DESCR("List all file in a directory");
+
+  
 /* Aggregates (moved here from pg_aggregate for 7.3) */
 
 DATA(insert OID = 2100 (  avg              PGNSP PGUID 12 t f f f i 1 1700 "20" _null_ _null_ _null_  aggregate_dummy - _null_ ));
index d7956d94105153ac02ce6a53a76f5d1253b6955c..3bd3268edde54c8518e787d59df126b13895969c 100644 (file)
@@ -7,7 +7,7 @@
  * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/storage/pmsignal.h,v 1.12 2005/06/28 19:51:25 tgl Exp $
+ * $PostgreSQL: pgsql/src/include/storage/pmsignal.h,v 1.13 2005/08/12 03:24:43 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -25,6 +25,7 @@ typedef enum
    PMSIGNAL_PASSWORD_CHANGE,   /* pg_auth file has changed */
    PMSIGNAL_WAKEN_CHILDREN,    /* send a SIGUSR1 signal to all backends */
    PMSIGNAL_WAKEN_ARCHIVER,    /* send a NOTIFY signal to xlog archiver */
+   PMSIGNAL_ROTATE_LOGFILE,    /* send SIGUSR1 to syslogger to rotate logfile */
 
    NUM_PMSIGNALS               /* Must be last value of enum! */
 } PMSignalReason;
index 96681e085090b2f4c61b8b9954e51ea103ad9a71..685d70f05bae8fb62b400e9d398a5c2c5868870b 100644 (file)
@@ -7,7 +7,7 @@
  * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/utils/builtins.h,v 1.262 2005/07/29 14:47:04 momjian Exp $
+ * $PostgreSQL: pgsql/src/include/utils/builtins.h,v 1.263 2005/08/12 03:25:13 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -374,12 +374,19 @@ extern Datum pg_complete_relation_size_oid(PG_FUNCTION_ARGS);
 extern Datum pg_complete_relation_size_name(PG_FUNCTION_ARGS);
 extern Datum pg_size_pretty(PG_FUNCTION_ARGS);
 
+/* genfile.c */
+extern Datum pg_stat_file(PG_FUNCTION_ARGS);
+extern Datum pg_read_file(PG_FUNCTION_ARGS);
+extern Datum pg_ls_dir(PG_FUNCTION_ARGS);
+
 /* misc.c */
 extern Datum nullvalue(PG_FUNCTION_ARGS);
 extern Datum nonnullvalue(PG_FUNCTION_ARGS);
 extern Datum current_database(PG_FUNCTION_ARGS);
 extern Datum pg_cancel_backend(PG_FUNCTION_ARGS);
+extern Datum pg_reload_conf(PG_FUNCTION_ARGS);
 extern Datum pg_tablespace_databases(PG_FUNCTION_ARGS);
+extern Datum pg_rotate_logfile(PG_FUNCTION_ARGS);
 
 /* not_in.c */
 extern Datum int4notin(PG_FUNCTION_ARGS);