Line data Source code
1 : /*-------------------------------------------------------------------------
2 : *
3 : * pgfnames.c
4 : * directory handling functions
5 : *
6 : * Portions Copyright (c) 1996-2026, 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 0 : pgfnames(const char *path)
38 : {
39 : DIR *dir;
40 : struct dirent *file;
41 : char **filenames;
42 0 : int numnames = 0;
43 0 : int fnsize = 200; /* enough for many small dbs */
44 :
45 0 : dir = opendir(path);
46 0 : if (dir == NULL)
47 : {
48 0 : pg_log_warning("could not open directory \"%s\": %m", path);
49 0 : return NULL;
50 : }
51 :
52 0 : filenames = palloc_array(char *, fnsize);
53 :
54 0 : while (errno = 0, (file = readdir(dir)) != NULL)
55 : {
56 0 : if (strcmp(file->d_name, ".") != 0 && strcmp(file->d_name, "..") != 0)
57 : {
58 0 : if (numnames + 1 >= fnsize)
59 : {
60 0 : fnsize *= 2;
61 0 : filenames = repalloc_array(filenames, char *, fnsize);
62 : }
63 0 : filenames[numnames++] = pstrdup(file->d_name);
64 : }
65 : }
66 :
67 0 : if (errno)
68 0 : pg_log_warning("could not read directory \"%s\": %m", path);
69 :
70 0 : filenames[numnames] = NULL;
71 :
72 0 : if (closedir(dir))
73 0 : pg_log_warning("could not close directory \"%s\": %m", path);
74 :
75 0 : return filenames;
76 : }
77 :
78 :
79 : /*
80 : * pgfnames_cleanup
81 : *
82 : * deallocate memory used for filenames
83 : */
84 : void
85 0 : pgfnames_cleanup(char **filenames)
86 : {
87 : char **fn;
88 :
89 0 : for (fn = filenames; *fn; fn++)
90 0 : pfree(*fn);
91 :
92 0 : pfree(filenames);
93 0 : }
|