PostgreSQL Source Code  git master
pgfnames.c
Go to the documentation of this file.
1 /*-------------------------------------------------------------------------
2  *
3  * pgfnames.c
4  * directory handling functions
5  *
6  * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group
7  * Portions Copyright (c) 1994, Regents of the University of California
8  *
9  * IDENTIFICATION
10  * src/common/pgfnames.c
11  *
12  *-------------------------------------------------------------------------
13  */
14 
15 #ifndef FRONTEND
16 #include "postgres.h"
17 #else
18 #include "postgres_fe.h"
19 #endif
20 
21 #include <dirent.h>
22 
23 #ifndef FRONTEND
24 #define pg_log_warning(...) elog(WARNING, __VA_ARGS__)
25 #else
26 #include "common/logging.h"
27 #endif
28 
29 /*
30  * pgfnames
31  *
32  * return a list of the names of objects in the argument directory. Caller
33  * must call pgfnames_cleanup later to free the memory allocated by this
34  * function.
35  */
36 char **
37 pgfnames(const char *path)
38 {
39  DIR *dir;
40  struct dirent *file;
41  char **filenames;
42  int numnames = 0;
43  int fnsize = 200; /* enough for many small dbs */
44 
45  dir = opendir(path);
46  if (dir == NULL)
47  {
48  pg_log_warning("could not open directory \"%s\": %m", path);
49  return NULL;
50  }
51 
52  filenames = (char **) palloc(fnsize * sizeof(char *));
53 
54  while (errno = 0, (file = readdir(dir)) != NULL)
55  {
56  if (strcmp(file->d_name, ".") != 0 && strcmp(file->d_name, "..") != 0)
57  {
58  if (numnames + 1 >= fnsize)
59  {
60  fnsize *= 2;
61  filenames = (char **) repalloc(filenames,
62  fnsize * sizeof(char *));
63  }
64  filenames[numnames++] = pstrdup(file->d_name);
65  }
66  }
67 
68  if (errno)
69  pg_log_warning("could not read directory \"%s\": %m", path);
70 
71  filenames[numnames] = NULL;
72 
73  if (closedir(dir))
74  pg_log_warning("could not close directory \"%s\": %m", path);
75 
76  return filenames;
77 }
78 
79 
80 /*
81  * pgfnames_cleanup
82  *
83  * deallocate memory used for filenames
84  */
85 void
86 pgfnames_cleanup(char **filenames)
87 {
88  char **fn;
89 
90  for (fn = filenames; *fn; fn++)
91  pfree(*fn);
92 
93  pfree(filenames);
94 }
int closedir(DIR *)
Definition: dirent.c:127
struct dirent * readdir(DIR *)
Definition: dirent.c:78
DIR * opendir(const char *)
Definition: dirent.c:33
char * pstrdup(const char *in)
Definition: mcxt.c:1695
void pfree(void *pointer)
Definition: mcxt.c:1520
void * repalloc(void *pointer, Size size)
Definition: mcxt.c:1540
void * palloc(Size size)
Definition: mcxt.c:1316
void pgfnames_cleanup(char **filenames)
Definition: pgfnames.c:86
char ** pgfnames(const char *path)
Definition: pgfnames.c:37
#define pg_log_warning(...)
Definition: pgfnames.c:24
Definition: dirent.c:26
Definition: dirent.h:10
char d_name[MAX_PATH]
Definition: dirent.h:15
static void * fn(void *arg)
Definition: thread-alloc.c:119