From 3a6e2ff08a73e08efe2e1c44a32e56d84ff41dfd Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Wed, 30 Aug 2006 18:06:27 +0000 Subject: [PATCH] Fix things so that fopen's, not only open's, pass FILE_SHARE_DELETE and other special flags on Windows. May fix intermittent 'Permission denied' errors. Magnus Hagander --- src/include/port.h | 9 ++++++--- src/port/open.c | 31 +++++++++++++++++++++++++++++-- 2 files changed, 35 insertions(+), 5 deletions(-) diff --git a/src/include/port.h b/src/include/port.h index 05bf691f5e..5f692db886 100644 --- a/src/include/port.h +++ b/src/include/port.h @@ -6,7 +6,7 @@ * Portions Copyright (c) 1996-2006, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $PostgreSQL: pgsql/src/include/port.h,v 1.96 2006/08/18 15:47:08 momjian Exp $ + * $PostgreSQL: pgsql/src/include/port.h,v 1.97 2006/08/30 18:06:27 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -264,12 +264,15 @@ extern bool rmtree(char *path, bool rmtopdir); #if defined(WIN32) && !defined(__CYGWIN__) -/* open() replacement to allow delete of held files and passing - * of special options. */ +/* open() and fopen() replacements to allow deletion of open files and + * passing of other special options. + */ extern int pgwin32_open(const char *, int,...); +extern FILE *pgwin32_fopen(const char *, const char *); #ifndef FRONTEND #define open(a,b,c) pgwin32_open(a,b,c) +#define fopen(a,b) pgwin32_fopen(a,b) #endif #define popen(a,b) _popen(a,b) diff --git a/src/port/open.c b/src/port/open.c index 4df74d8b51..268f2d31a2 100644 --- a/src/port/open.c +++ b/src/port/open.c @@ -6,7 +6,7 @@ * * Portions Copyright (c) 1996-2006, PostgreSQL Global Development Group * - * $PostgreSQL: pgsql/src/port/open.c,v 1.13 2006/06/25 00:18:24 momjian Exp $ + * $PostgreSQL: pgsql/src/port/open.c,v 1.14 2006/08/30 18:06:27 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -19,7 +19,6 @@ #include #include -int pgwin32_open(const char *fileName, int fileFlags,...); static int openFlagsToCreateFileFlags(int openFlags) @@ -112,4 +111,32 @@ pgwin32_open(const char *fileName, int fileFlags,...) return fd; } +FILE * +pgwin32_fopen(const char *fileName, const char *mode) +{ + int openmode = 0; + int fd; + + if (strstr(mode, "r+")) + openmode |= O_RDWR; + else if (strchr(mode, 'r')) + openmode |= O_RDONLY; + if (strstr(mode, "w+")) + openmode |= O_RDWR | O_CREAT | O_TRUNC; + else if (strchr(mode, 'w')) + openmode |= O_WRONLY | O_CREAT | O_TRUNC; + if (strchr(mode, 'a')) + openmode |= O_WRONLY | O_APPEND; + + if (strchr(mode, 'b')) + openmode |= O_BINARY; + if (strchr(mode, 't')) + openmode |= O_TEXT; + + fd = pgwin32_open(fileName, openmode); + if (fd == -1) + return NULL; + return _fdopen(fd, mode); +} + #endif