diff options
author | Michael Paquier <michael@paquier.xyz> | 2024-01-12 12:04:51 +0900 |
---|---|---|
committer | Michael Paquier <michael@paquier.xyz> | 2024-01-12 12:04:51 +0900 |
commit | e72a37528ddaadd796be73fe9b0a0c08b18476d2 (patch) | |
tree | f1e827966b3b0e02ed56b6cfbe96e9f266d6e610 /src/backend/storage/file/fd.c | |
parent | 08c3ad27eb5348d0cbffa843a3edb11534f9904a (diff) |
Refactor code checking for file existence
jit.c and dfgr.c had a copy of the same code to check if a file exists
or not, with a twist: jit.c did not check for EACCES when failing the
stat() call for the path whose existence is tested. This refactored
routine will be used by an upcoming patch.
Reviewed-by: Ashutosh Bapat
Discussion: https://postgr.es/m/ZTiV8tn_MIb_H2rE@paquier.xyz
Diffstat (limited to 'src/backend/storage/file/fd.c')
-rw-r--r-- | src/backend/storage/file/fd.c | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/src/backend/storage/file/fd.c b/src/backend/storage/file/fd.c index 8917c6004ac..43d2b2a156e 100644 --- a/src/backend/storage/file/fd.c +++ b/src/backend/storage/file/fd.c @@ -494,6 +494,29 @@ retry: } /* + * pg_file_exists -- check that a file exists. + * + * This requires an absolute path to the file. Returns true if the file is + * not a directory, false otherwise. + */ +bool +pg_file_exists(const char *name) +{ + struct stat st; + + Assert(name != NULL); + + if (stat(name, &st) == 0) + return !S_ISDIR(st.st_mode); + else if (!(errno == ENOENT || errno == ENOTDIR || errno == EACCES)) + ereport(ERROR, + (errcode_for_file_access(), + errmsg("could not access file \"%s\": %m", name))); + + return false; +} + +/* * pg_flush_data --- advise OS that the described dirty data should be flushed * * offset of 0 with nbytes 0 means that the entire file should be flushed |