Age Owner TLA Line data Source code
1 : /*-------------------------------------------------------------------------
2 : *
3 : * pgfnames.c
4 : * directory handling functions
5 : *
6 : * Portions Copyright (c) 1996-2023, 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 **
3460 peter_e 37 UBC 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 : {
1469 peter 48 0 : pg_log_warning("could not open directory \"%s\": %m", path);
3460 peter_e 49 0 : return NULL;
50 : }
51 :
52 0 : filenames = (char **) palloc(fnsize * sizeof(char *));
53 :
3306 bruce 54 0 : while (errno = 0, (file = readdir(dir)) != NULL)
55 : {
3460 peter_e 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 = (char **) repalloc(filenames,
62 : fnsize * sizeof(char *));
63 : }
64 0 : filenames[numnames++] = pstrdup(file->d_name);
65 : }
66 : }
67 :
68 0 : if (errno)
1469 peter 69 0 : pg_log_warning("could not read directory \"%s\": %m", path);
70 :
3460 peter_e 71 0 : filenames[numnames] = NULL;
72 :
3306 bruce 73 0 : if (closedir(dir))
1469 peter 74 0 : pg_log_warning("could not close directory \"%s\": %m", path);
75 :
3460 peter_e 76 0 : return filenames;
77 : }
78 :
79 :
80 : /*
81 : * pgfnames_cleanup
82 : *
83 : * deallocate memory used for filenames
84 : */
85 : void
86 0 : pgfnames_cleanup(char **filenames)
87 : {
88 : char **fn;
89 :
90 0 : for (fn = filenames; *fn; fn++)
91 0 : pfree(*fn);
92 :
93 0 : pfree(filenames);
94 0 : }
|