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-2025, 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 */
36char **
37pgfnames(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 = palloc_array(char *, fnsize);
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 = repalloc_array(filenames, char *, fnsize);
62 }
63 filenames[numnames++] = pstrdup(file->d_name);
64 }
65 }
66
67 if (errno)
68 pg_log_warning("could not read directory \"%s\": %m", path);
69
70 filenames[numnames] = NULL;
71
72 if (closedir(dir))
73 pg_log_warning("could not close directory \"%s\": %m", path);
74
75 return filenames;
76}
77
78
79/*
80 * pgfnames_cleanup
81 *
82 * deallocate memory used for filenames
83 */
84void
85pgfnames_cleanup(char **filenames)
86{
87 char **fn;
88
89 for (fn = filenames; *fn; fn++)
90 pfree(*fn);
91
92 pfree(filenames);
93}
int closedir(DIR *)
Definition: dirent.c:127
struct dirent * readdir(DIR *)
Definition: dirent.c:78
DIR * opendir(const char *)
Definition: dirent.c:33
#define repalloc_array(pointer, type, count)
Definition: fe_memutils.h:78
#define palloc_array(type, count)
Definition: fe_memutils.h:76
char * pstrdup(const char *in)
Definition: mcxt.c:1759
void pfree(void *pointer)
Definition: mcxt.c:1594
void pgfnames_cleanup(char **filenames)
Definition: pgfnames.c:85
#define pg_log_warning(...)
Definition: pgfnames.c:24
char ** pgfnames(const char *path)
Definition: pgfnames.c:37
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