diff --git a/src/backend/storage/file/fd.c b/src/backend/storage/file/fd.c index 05abcf72d6..88004c6fae 100644 --- a/src/backend/storage/file/fd.c +++ b/src/backend/storage/file/fd.c @@ -622,6 +622,33 @@ pg_flush_data(int fd, off_t offset, off_t nbytes) #endif } +/* + * Truncate a file to a given length by name. + */ +int +pg_truncate(const char *path, off_t length) +{ +#ifdef WIN32 + int save_errno; + int ret; + int fd; + + fd = OpenTransientFile(path, O_RDWR | PG_BINARY); + if (fd >= 0) + { + ret = ftruncate(fd, 0); + save_errno = errno; + CloseTransientFile(fd); + errno = save_errno; + } + else + ret = -1; + + return ret; +#else + return truncate(path, length); +#endif +} /* * fsync_fname -- fsync a file or directory, handling errors properly diff --git a/src/backend/storage/smgr/md.c b/src/backend/storage/smgr/md.c index c697af00d9..9889ad6ad8 100644 --- a/src/backend/storage/smgr/md.c +++ b/src/backend/storage/smgr/md.c @@ -294,19 +294,8 @@ do_truncate(const char *path) { int save_errno; int ret; - int fd; - /* truncate(2) would be easier here, but Windows hasn't got it */ - fd = OpenTransientFile(path, O_RDWR | PG_BINARY); - if (fd >= 0) - { - ret = ftruncate(fd, 0); - save_errno = errno; - CloseTransientFile(fd); - errno = save_errno; - } - else - ret = -1; + ret = pg_truncate(path, 0); /* Log a warning here to avoid repetition in callers. */ if (ret < 0 && errno != ENOENT) diff --git a/src/include/storage/fd.h b/src/include/storage/fd.h index e209f047e8..4e1cc12e23 100644 --- a/src/include/storage/fd.h +++ b/src/include/storage/fd.h @@ -153,6 +153,7 @@ extern int pg_fsync_no_writethrough(int fd); extern int pg_fsync_writethrough(int fd); extern int pg_fdatasync(int fd); extern void pg_flush_data(int fd, off_t offset, off_t amount); +extern int pg_truncate(const char *path, off_t length); extern void fsync_fname(const char *fname, bool isdir); extern int fsync_fname_ext(const char *fname, bool isdir, bool ignore_perm, int elevel); extern int durable_rename(const char *oldfile, const char *newfile, int loglevel);