]> granicus.if.org Git - postgresql/commitdiff
Marginal code cleanups in pg_logdir_ls: use ReadDir not readdir,
authorTom Lane <tgl@sss.pgh.pa.us>
Fri, 20 Oct 2006 00:59:03 +0000 (00:59 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Fri, 20 Oct 2006 00:59:03 +0000 (00:59 +0000)
and avoid scribbling on its result (might be safe but why risk it)

contrib/adminpack/adminpack.c

index 4749bd1a9269b6b38df561fa322373702a81350e..4716dd8150ee715df35c10668825b0f896268818 100644 (file)
@@ -8,7 +8,7 @@
  * Author: Andreas Pflug <pgadmin@pse-consulting.de>
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/contrib/adminpack/adminpack.c,v 1.6 2006/10/19 18:32:45 tgl Exp $
+ *       $PostgreSQL: pgsql/contrib/adminpack/adminpack.c,v 1.7 2006/10/20 00:59:03 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
 #include <sys/file.h>
 #include <sys/stat.h>
 #include <unistd.h>
-#include <dirent.h>
 
-#include "miscadmin.h"
 #include "catalog/pg_type.h"
 #include "funcapi.h"
+#include "miscadmin.h"
 #include "postmaster/syslogger.h"
 #include "storage/fd.h"
 #include "utils/datetime.h"
@@ -303,7 +302,7 @@ pg_logdir_ls(PG_FUNCTION_ARGS)
                                (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
                                 (errmsg("only superuser can list the log directory"))));
 
-       if (memcmp(Log_filename, "postgresql-%Y-%m-%d_%H%M%S.log", 30) != 0)
+       if (strcmp(Log_filename, "postgresql-%Y-%m-%d_%H%M%S.log") != 0)
                ereport(ERROR,
                                (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
                                 (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)
 
                fctx = palloc(sizeof(directory_fctx));
                if (is_absolute_path(Log_directory))
-                       fctx->location = Log_directory;
+                       fctx->location = pstrdup(Log_directory);
                else
                {
                        fctx->location = palloc(strlen(DataDir) + strlen(Log_directory) + 2);
@@ -346,14 +345,11 @@ pg_logdir_ls(PG_FUNCTION_ARGS)
        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)) != NULL)
+       while ((de = ReadDir(fctx->dirdesc, fctx->location)) != NULL)
        {
                char       *values[2];
                HeapTuple       tuple;
-
+               char            timestampbuf[32];
                char       *field[MAXDATEFIELDS];
                char            lowstr[MAXDATELEN + 1];
                int                     dtype;
@@ -367,25 +363,27 @@ pg_logdir_ls(PG_FUNCTION_ARGS)
                 * Default format: postgresql-YYYY-MM-DD_HHMMSS.log
                 */
                if (strlen(de->d_name) != 32
-                       || memcmp(de->d_name, "postgresql-", 11)
+                       || strncmp(de->d_name, "postgresql-", 11) != 0
                        || de->d_name[21] != '_'
-                       || strcmp(de->d_name + 28, ".log"))
+                       || strcmp(de->d_name + 28, ".log") != 0)
                        continue;
 
-               values[1] = palloc(strlen(fctx->location) + strlen(de->d_name) + 2);
-               sprintf(values[1], "%s/%s", fctx->location, de->d_name);
-
-               values[0] = de->d_name + 11;    /* timestamp */
-               values[0][17] = 0;
+               /* extract timestamp portion of filename */
+               strcpy(timestampbuf, de->d_name + 11);
+               timestampbuf[17] = '\0';
 
-               /* parse and decode expected timestamp */
-               if (ParseDateTime(values[0], lowstr, MAXDATELEN, field, ftype, MAXDATEFIELDS, &nf))
+               /* parse and decode expected timestamp to verify it's OK format */
+               if (ParseDateTime(timestampbuf, lowstr, MAXDATELEN, field, ftype, MAXDATEFIELDS, &nf))
                        continue;
 
                if (DecodeDateTime(field, ftype, nf, &dtype, &date, &fsec, &tz))
                        continue;
 
-               /* Seems the format fits the expected format; feed it into the tuple */
+               /* Seems the timestamp is OK; prepare and return tuple */
+
+               values[0] = timestampbuf;
+               values[1] = palloc(strlen(fctx->location) + strlen(de->d_name) + 2);
+               sprintf(values[1], "%s/%s", fctx->location, de->d_name);
 
                tuple = BuildTupleFromCStrings(funcctx->attinmeta, values);