Age Owner Branch data TLA Line data Source code
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 **
3831 peter_e@gmx.net 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 : : {
1840 peter@eisentraut.org 48 [ # # ]: 0 : pg_log_warning("could not open directory \"%s\": %m", path);
3831 peter_e@gmx.net 49 : 0 : return NULL;
50 : : }
51 : :
52 : 0 : filenames = (char **) palloc(fnsize * sizeof(char *));
53 : :
3677 bruce@momjian.us 54 [ # # ]: 0 : while (errno = 0, (file = readdir(dir)) != NULL)
55 : : {
3831 peter_e@gmx.net 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)
1840 peter@eisentraut.org 69 [ # # ]: 0 : pg_log_warning("could not read directory \"%s\": %m", path);
70 : :
3831 peter_e@gmx.net 71 : 0 : filenames[numnames] = NULL;
72 : :
3677 bruce@momjian.us 73 [ # # ]: 0 : if (closedir(dir))
1840 peter@eisentraut.org 74 [ # # ]: 0 : pg_log_warning("could not close directory \"%s\": %m", path);
75 : :
3831 peter_e@gmx.net 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 : }
|