diff options
Diffstat (limited to 'src/common/lock.cpp')
-rw-r--r-- | src/common/lock.cpp | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/src/common/lock.cpp b/src/common/lock.cpp new file mode 100644 index 0000000..2ba9a0a --- /dev/null +++ b/src/common/lock.cpp @@ -0,0 +1,36 @@ +#include <unistd.h> +#include <stdio.h> +#include "lock.hpp" +#include "socket.hpp" + +/// Protected file writing +/// (Until the file is closed, it keeps the old file) + +// Start writing a tmpfile +FILE *lock_fopen (const char *filename, int *info) +{ + char newfile[512]; + FILE *fp; + int no = getpid (); + + // Get a filename that doesn't already exist + do + { + sprintf (newfile, "%s_%d.tmp", filename, no++); + } + while ((fp = fopen_ (newfile, "r")) && (fclose_ (fp), 1)); + *info = --no; + return fopen_ (newfile, "w"); +} + +// Delete the old file and rename the new file +void lock_fclose (FILE * fp, const char *filename, int *info) +{ + char newfile[512]; + if (fp) + { + fclose_ (fp); + sprintf (newfile, "%s_%d.tmp", filename, *info); + rename (newfile, filename); + } +} |