summaryrefslogtreecommitdiff
path: root/src/backend/commands/user.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/commands/user.c')
-rw-r--r--src/backend/commands/user.c36
1 files changed, 34 insertions, 2 deletions
diff --git a/src/backend/commands/user.c b/src/backend/commands/user.c
index 6a9ba6f529a..33eb3c39b2f 100644
--- a/src/backend/commands/user.c
+++ b/src/backend/commands/user.c
@@ -6,7 +6,7 @@
* Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
- * $PostgreSQL: pgsql/src/backend/commands/user.c,v 1.133 2004/01/26 22:35:32 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/commands/user.c,v 1.134 2004/02/02 00:17:21 momjian Exp $
*
*-------------------------------------------------------------------------
*/
@@ -139,7 +139,11 @@ write_group_file(Relation grel)
bufsize = strlen(filename) + 12;
tempname = (char *) palloc(bufsize);
snprintf(tempname, bufsize, "%s.%d", filename, MyProcPid);
-
+#if defined(WIN32) || defined(CYGWIN)
+ filename = repalloc(filename, strlen(filename) + 1 + strlen(".new");
+ strcat(filename, ".new");
+#endif
+
oumask = umask((mode_t) 077);
fp = AllocateFile(tempname, "w");
umask(oumask);
@@ -286,6 +290,10 @@ write_user_file(Relation urel)
bufsize = strlen(filename) + 12;
tempname = (char *) palloc(bufsize);
snprintf(tempname, bufsize, "%s.%d", filename, MyProcPid);
+#if defined(WIN32) || defined(CYGWIN)
+ filename = repalloc(filename, strlen(filename) + 1 + strlen(".new");
+ strcat(filename, ".new");
+#endif
oumask = umask((mode_t) 077);
fp = AllocateFile(tempname, "w");
@@ -457,6 +465,18 @@ AtEOXact_UpdatePasswordFile(bool isCommit)
user_file_update_needed = false;
write_user_file(urel);
heap_close(urel, NoLock);
+#if defined(WIN32) || defined(CYGWIN)
+ {
+ /* Rename active file while not holding an exclusive lock */
+ char *filename = user_getfilename(), *filename_new;
+
+ filename_new = palloc(strlen(filename) + 1 + strlen(".new")));
+ sprintf(filename_new, "%s.new", filename);
+ rename(filename_new, filename);
+ pfree(filename);
+ pfree(filename_new);
+ }
+#endif
}
if (group_file_update_needed)
@@ -464,6 +484,18 @@ AtEOXact_UpdatePasswordFile(bool isCommit)
group_file_update_needed = false;
write_group_file(grel);
heap_close(grel, NoLock);
+#if defined(WIN32) || defined(CYGWIN)
+ {
+ /* Rename active file while not holding an exclusive lock */
+ char *filename = group_getfilename(), *filename_new;
+
+ filename_new = palloc(strlen(filename) + 1 + strlen(".new")));
+ sprintf(filename_new, "%s.new", filename);
+ rename(filename_new, filename);
+ pfree(filename);
+ pfree(filename_new);
+ }
+#endif
}
/*