1/*-------------------------------------------------------------------------
5 * Portions Copyright (c) 1996-2025, PostgreSQL Global Development Group
6 * Portions Copyright (c) 1994, Regents of the University of California
11 *-------------------------------------------------------------------------
27 #define pg_log_warning(...) elog(WARNING, __VA_ARGS__)
28 #define LOG_LEVEL WARNING
29 #define OPENDIR(x) AllocateDir(x)
30 #define CLOSEDIR(x) FreeDir(x)
33#define LOG_LEVEL PG_LOG_WARNING
34#define OPENDIR(x) opendir(x)
35#define CLOSEDIR(x) closedir(x)
41 * Delete a directory tree recursively.
42 * Assumes path points to a valid directory.
43 * Deletes everything under path.
44 * If rmtopdir is true deletes the directory too.
45 * Returns true if successful, false if there was any problem.
46 * (The details of the problem are reported already, so caller
47 * doesn't really have to say anything more, but most do.)
50 rmtree(
const char *path,
bool rmtopdir)
56 size_t dirnames_size = 0;
57 size_t dirnames_capacity = 8;
67 dirnames = (
char **)
palloc(
sizeof(
char *) * dirnames_capacity);
69 while (errno = 0, (de =
readdir(dir)))
71 if (strcmp(de->
d_name,
".") == 0 ||
72 strcmp(de->
d_name,
"..") == 0)
78 /* already logged, press on */
83 * Defer recursion until after we've closed this directory, to
84 * avoid using more than one file descriptor at a time.
86 if (dirnames_size == dirnames_capacity)
89 sizeof(
char *) * dirnames_capacity * 2);
90 dirnames_capacity *= 2;
92 dirnames[dirnames_size++] =
pstrdup(pathbuf);
95 if (unlink(pathbuf) != 0 && errno != ENOENT)
112 /* Now recurse into the subdirectories we found. */
113 for (
size_t i = 0;
i < dirnames_size; ++
i)
115 if (!
rmtree(dirnames[
i],
true))
122 if (rmdir(path) != 0)
struct dirent * readdir(DIR *)
PGFileType get_dirent_type(const char *path, const struct dirent *de, bool look_through_symlinks, int elevel)
char * pstrdup(const char *in)
void * repalloc(void *pointer, Size size)
void pfree(void *pointer)
bool rmtree(const char *path, bool rmtopdir)
#define pg_log_warning(...)