88 * Author: Andreas Pflug <pgadmin@pse-consulting.de>
99 *
1010 * IDENTIFICATION
11- * $PostgreSQL: pgsql/contrib/adminpack/adminpack.c,v 1.6 2006/10/19 18:32:45 tgl Exp $
11+ * $PostgreSQL: pgsql/contrib/adminpack/adminpack.c,v 1.7 2006/10/20 00:59:03 tgl Exp $
1212 *
1313 *-------------------------------------------------------------------------
1414 */
1717#include <sys/file.h>
1818#include <sys/stat.h>
1919#include <unistd.h>
20- #include <dirent.h>
2120
22- #include "miscadmin.h"
2321#include "catalog/pg_type.h"
2422#include "funcapi.h"
23+ #include "miscadmin.h"
2524#include "postmaster/syslogger.h"
2625#include "storage/fd.h"
2726#include "utils/datetime.h"
@@ -303,7 +302,7 @@ pg_logdir_ls(PG_FUNCTION_ARGS)
303302(errcode (ERRCODE_INSUFFICIENT_PRIVILEGE ),
304303 (errmsg ("only superuser can list the log directory" ))));
305304
306- if (memcmp (Log_filename ,"postgresql-%Y-%m-%d_%H%M%S.log" , 30 )!= 0 )
305+ if (strcmp (Log_filename ,"postgresql-%Y-%m-%d_%H%M%S.log" )!= 0 )
307306ereport (ERROR ,
308307(errcode (ERRCODE_INVALID_PARAMETER_VALUE ),
309308 (errmsg ("the log_filename parameter must equal 'postgresql-%%Y-%%m-%%d_%%H%%M%%S.log'" ))));
@@ -318,7 +317,7 @@ pg_logdir_ls(PG_FUNCTION_ARGS)
318317
319318fctx = palloc (sizeof (directory_fctx ));
320319if (is_absolute_path (Log_directory ))
321- fctx -> location = Log_directory ;
320+ fctx -> location = pstrdup ( Log_directory ) ;
322321else
323322{
324323fctx -> location = palloc (strlen (DataDir )+ strlen (Log_directory )+ 2 );
@@ -346,14 +345,11 @@ pg_logdir_ls(PG_FUNCTION_ARGS)
346345funcctx = SRF_PERCALL_SETUP ();
347346fctx = (directory_fctx * )funcctx -> user_fctx ;
348347
349- if (!fctx -> dirdesc )/* not a readable directory */
350- SRF_RETURN_DONE (funcctx );
351-
352- while ((de = readdir (fctx -> dirdesc ))!= NULL )
348+ while ((de = ReadDir (fctx -> dirdesc ,fctx -> location ))!= NULL )
353349{
354350char * values [2 ];
355351HeapTuple tuple ;
356-
352+ char timestampbuf [ 32 ];
357353char * field [MAXDATEFIELDS ];
358354char lowstr [MAXDATELEN + 1 ];
359355int dtype ;
@@ -367,25 +363,27 @@ pg_logdir_ls(PG_FUNCTION_ARGS)
367363 * Default format: postgresql-YYYY-MM-DD_HHMMSS.log
368364 */
369365if (strlen (de -> d_name )!= 32
370- || memcmp (de -> d_name ,"postgresql-" ,11 )
366+ || strncmp (de -> d_name ,"postgresql-" ,11 )!= 0
371367|| de -> d_name [21 ]!= '_'
372- || strcmp (de -> d_name + 28 ,".log" ))
368+ || strcmp (de -> d_name + 28 ,".log" )!= 0 )
373369continue ;
374370
375- values [1 ]= palloc (strlen (fctx -> location )+ strlen (de -> d_name )+ 2 );
376- sprintf (values [1 ],"%s/%s" ,fctx -> location ,de -> d_name );
377-
378- values [0 ]= de -> d_name + 11 ;/* timestamp */
379- values [0 ][17 ]= 0 ;
371+ /* extract timestamp portion of filename */
372+ strcpy (timestampbuf ,de -> d_name + 11 );
373+ timestampbuf [17 ]= '\0' ;
380374
381- /* parse and decode expected timestamp */
382- if (ParseDateTime (values [ 0 ] ,lowstr ,MAXDATELEN ,field ,ftype ,MAXDATEFIELDS ,& nf ))
375+ /* parse and decode expected timestampto verify it's OK format */
376+ if (ParseDateTime (timestampbuf ,lowstr ,MAXDATELEN ,field ,ftype ,MAXDATEFIELDS ,& nf ))
383377continue ;
384378
385379if (DecodeDateTime (field ,ftype ,nf ,& dtype ,& date ,& fsec ,& tz ))
386380continue ;
387381
388- /* Seems the format fits the expected format; feed it into the tuple */
382+ /* Seems the timestamp is OK; prepare and return tuple */
383+
384+ values [0 ]= timestampbuf ;
385+ values [1 ]= palloc (strlen (fctx -> location )+ strlen (de -> d_name )+ 2 );
386+ sprintf (values [1 ],"%s/%s" ,fctx -> location ,de -> d_name );
389387
390388tuple = BuildTupleFromCStrings (funcctx -> attinmeta ,values );
391389