From: Unknown <> Date: Thu, 31 Aug 2006 01:36:25 +0000 (+0000) Subject: add files for 2006-08-31T01:36:25Z X-Git-Tag: imap-2007a1~248 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=a380965f2a55085742b8f1c6c40408e03c59f71f;p=uw-imap add files for 2006-08-31T01:36:25Z --- diff --git a/src/osdep/unix/crx_nfs.c b/src/osdep/unix/crx_nfs.c new file mode 100644 index 0000000..7e60e63 --- /dev/null +++ b/src/osdep/unix/crx_nfs.c @@ -0,0 +1,79 @@ +/* ======================================================================== + * Copyright 1988-2006 University of Washington + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * + * ======================================================================== + */ + +/* + * Program: Exclusive create of a file, NFS kludge version + * + * Author: Mark Crispin + * Networks and Distributed Computing + * Computing & Communications + * University of Washington + * Administration Building, AG-44 + * Seattle, WA 98195 + * Internet: MRC@CAC.Washington.EDU + * + * Date: 17 December 1999 + * Last Edited: 30 August 2006 + */ + + +/* SUN-OS had an NFS, As kludgy as an albatross; + * And everywhere that it was installed, It was a total loss. + * -- MRC 9/25/91 + */ + +/* Exclusive create of a file + * Accepts: file name + * Return: T if success, NIL if failed, -1 if retry + */ + +long crexcl (char *name) +{ + long ret = -1; + int i; + char hitch[MAILTMPLEN]; + struct stat sb; + int mask = umask (0); + /* build hitching post file name */ + sprintf (hitch,"%s.%lu.%d.",name,(unsigned long) time (0),getpid ()); + i = strlen (hitch); /* append local host name */ + gethostname (hitch + i,(MAILTMPLEN - i) - 1); + /* try to get hitching-post file */ + if ((i = open (hitch,O_WRONLY|O_CREAT|O_EXCL,(int) shlock_mode)) >= 0) { + close (i); /* close the hitching-post */ + /* Note: link() may return an error even if it actually succeeded. So we + * always check for success via the link count, and ignore the error if + * the link count is right. + */ + /* tie hitching-post to lock */ + i = link (hitch,name) ? errno : 0; + /* success if link count now 2 */ + if (!stat (hitch,&sb) && (sb.st_nlink == 2)) ret = LONGT; + else if (i == EPERM) { /* links not allowed? */ + /* Probably a FAT filesystem on Linux. It can't be NFS, so try creating + * the lock file directly. + */ + if ((i = open (name,O_WRONLY|O_CREAT|O_EXCL,(int) shlock_mode)) >= 0){ + close (i); /* close the file */ + ret = LONGT; /* success */ + } + /* fail unless error is EEXIST */ + else if (errno != EEXIST) ret = NIL; + } + unlink (hitch); /* flush hitching post */ + } + /* fail unless error is EEXIST */ + else if (errno != EEXIST) ret = NIL; + umask (mask); /* restore previous mask */ + return ret; +}