|
6 | 6 | * Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group |
7 | 7 | * Portions Copyright (c) 1994, Regents of the University of California |
8 | 8 | * |
9 | | - * $PostgreSQL: pgsql/src/backend/commands/user.c,v 1.133 2004/01/26 22:35:32 tgl Exp $ |
| 9 | + * $PostgreSQL: pgsql/src/backend/commands/user.c,v 1.134 2004/02/02 00:17:21 momjian Exp $ |
10 | 10 | * |
11 | 11 | *------------------------------------------------------------------------- |
12 | 12 | */ |
@@ -139,7 +139,11 @@ write_group_file(Relation grel) |
139 | 139 | bufsize = strlen(filename) + 12; |
140 | 140 | tempname = (char *) palloc(bufsize); |
141 | 141 | snprintf(tempname, bufsize, "%s.%d", filename, MyProcPid); |
142 | | - |
| 142 | +#if defined(WIN32) || defined(CYGWIN) |
| 143 | + filename = repalloc(filename, strlen(filename) + 1 + strlen(".new"); |
| 144 | + strcat(filename, ".new"); |
| 145 | +#endif |
| 146 | + |
143 | 147 | oumask = umask((mode_t) 077); |
144 | 148 | fp = AllocateFile(tempname, "w"); |
145 | 149 | umask(oumask); |
@@ -286,6 +290,10 @@ write_user_file(Relation urel) |
286 | 290 | bufsize = strlen(filename) + 12; |
287 | 291 | tempname = (char *) palloc(bufsize); |
288 | 292 | snprintf(tempname, bufsize, "%s.%d", filename, MyProcPid); |
| 293 | +#if defined(WIN32) || defined(CYGWIN) |
| 294 | + filename = repalloc(filename, strlen(filename) + 1 + strlen(".new"); |
| 295 | + strcat(filename, ".new"); |
| 296 | +#endif |
289 | 297 |
|
290 | 298 | oumask = umask((mode_t) 077); |
291 | 299 | fp = AllocateFile(tempname, "w"); |
@@ -457,13 +465,37 @@ AtEOXact_UpdatePasswordFile(bool isCommit) |
457 | 465 | user_file_update_needed = false; |
458 | 466 | write_user_file(urel); |
459 | 467 | heap_close(urel, NoLock); |
| 468 | +#if defined(WIN32) || defined(CYGWIN) |
| 469 | + { |
| 470 | + /* Rename active file while not holding an exclusive lock */ |
| 471 | + char *filename = user_getfilename(), *filename_new; |
| 472 | + |
| 473 | + filename_new = palloc(strlen(filename) + 1 + strlen(".new"))); |
| 474 | + sprintf(filename_new, "%s.new", filename); |
| 475 | + rename(filename_new, filename); |
| 476 | + pfree(filename); |
| 477 | + pfree(filename_new); |
| 478 | + } |
| 479 | +#endif |
460 | 480 | } |
461 | 481 |
|
462 | 482 | if (group_file_update_needed) |
463 | 483 | { |
464 | 484 | group_file_update_needed = false; |
465 | 485 | write_group_file(grel); |
466 | 486 | heap_close(grel, NoLock); |
| 487 | +#if defined(WIN32) || defined(CYGWIN) |
| 488 | + { |
| 489 | + /* Rename active file while not holding an exclusive lock */ |
| 490 | + char *filename = group_getfilename(), *filename_new; |
| 491 | + |
| 492 | + filename_new = palloc(strlen(filename) + 1 + strlen(".new"))); |
| 493 | + sprintf(filename_new, "%s.new", filename); |
| 494 | + rename(filename_new, filename); |
| 495 | + pfree(filename); |
| 496 | + pfree(filename_new); |
| 497 | + } |
| 498 | +#endif |
467 | 499 | } |
468 | 500 |
|
469 | 501 | /* |
|
0 commit comments