tweaks: don't bother using the exclusive flag when creating a lock file
One microsecond earlier, the lock file has been deleted (if it existed), so, if between our unlink() and our open() some other process managed to recreate the lock file... well, we want to delete it *again*. So, just overwrite and truncate the lock file (if it exists). When the lock file did NOT exist (a few microseconds earlier, when checking in do_lockfile(), before calling write_lockfile()), then the user expects the lock file to be written, so: just write it. That between the check and the actual writing of the lock file there is a small window of opportunity for other processes to write this lock file is unfortunate, but it is not a reason to bother the user with an error message when it happens.master
parent
c45df589fa
commit
b4299f4f4e
15
src/files.c
15
src/files.c
|
@ -129,7 +129,6 @@ bool write_lockfile(const char *lockfilename, const char *filename, bool modifie
|
||||||
struct passwd *mypwuid = getpwuid(myuid);
|
struct passwd *mypwuid = getpwuid(myuid);
|
||||||
char myhostname[32];
|
char myhostname[32];
|
||||||
struct stat fileinfo;
|
struct stat fileinfo;
|
||||||
int fd;
|
|
||||||
FILE *filestream;
|
FILE *filestream;
|
||||||
char *lockdata;
|
char *lockdata;
|
||||||
size_t wroteamt;
|
size_t wroteamt;
|
||||||
|
@ -151,22 +150,12 @@ bool write_lockfile(const char *lockfilename, const char *filename, bool modifie
|
||||||
if (!delete_lockfile(lockfilename))
|
if (!delete_lockfile(lockfilename))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
/* Try to create the lockfile. */
|
/* Create lock file (or truncate existing one) and open it for writing. */
|
||||||
fd = open(lockfilename, O_CREAT|O_EXCL|O_WRONLY, RW_FOR_ALL);
|
filestream = fopen(lockfilename, "wb");
|
||||||
|
|
||||||
if (fd < 0) {
|
|
||||||
statusline(MILD, _("Error writing lock file %s: %s"),
|
|
||||||
lockfilename, strerror(errno));
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Try to associate a stream with the now open lockfile. */
|
|
||||||
filestream = fdopen(fd, "wb");
|
|
||||||
|
|
||||||
if (filestream == NULL) {
|
if (filestream == NULL) {
|
||||||
statusline(MILD, _("Error writing lock file %s: %s"),
|
statusline(MILD, _("Error writing lock file %s: %s"),
|
||||||
lockfilename, strerror(errno));
|
lockfilename, strerror(errno));
|
||||||
close(fd);
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue