1
0
mirror of https://github.com/samba-team/samba.git synced 2024-12-22 13:34:15 +03:00

r17944: Handle locking madness.

Jeremy.
(This used to be commit 408267a2d7)
This commit is contained in:
Jeremy Allison 2006-08-31 01:27:51 +00:00 committed by Gerald (Jerry) Carter
parent 6fada7a82a
commit cceb492250

View File

@ -477,6 +477,7 @@ BOOL create_local_private_krb5_conf_for_domain(const char *realm, const char *do
char *fname = talloc_asprintf(NULL, "%s/smb_krb5.conf.%s", lp_private_dir(), domain);
char *file_contents = NULL;
size_t flen = 0;
int loopcount = 0;
if (!fname) {
return False;
@ -493,17 +494,37 @@ BOOL create_local_private_krb5_conf_for_domain(const char *realm, const char *do
}
flen = strlen(file_contents);
xfp = x_fopen(fname, O_CREAT|O_WRONLY, 0600);
if (!xfp) {
TALLOC_FREE(fname);
return False;
}
/* Lock the file. */
if (!fcntl_lock(xfp->fd, F_SETLKW, 0, 1, F_WRLCK)) {
unlink(fname);
x_fclose(xfp);
TALLOC_FREE(fname);
return False;
while (loopcount < 10) {
SMB_STRUCT_STAT st;
xfp = x_fopen(fname, O_CREAT|O_WRONLY, 0600);
if (!xfp) {
TALLOC_FREE(fname);
return False;
}
/* Lock the file. */
if (!fcntl_lock(xfp->fd, F_SETLKW, 0, 1, F_WRLCK)) {
unlink(fname);
x_fclose(xfp);
TALLOC_FREE(fname);
return False;
}
/* We got the lock. Is the file still there ? */
if (sys_stat(fname,&st)==-1) {
if (errno == ENOENT) {
/* Nope - try again up to 10x */
x_fclose(xfp);
loopcount++;
continue;
}
unlink(fname);
x_fclose(xfp);
TALLOC_FREE(fname);
return False;
}
break;
}
if (x_fwrite(file_contents, flen, 1, xfp) != flen) {