+ if (err == ENOSYS || err == LINKS_MIGHT_NOT_WORK || err == ENAMETOOLONG)
+ {
+ static char const nonce_base[] = ".#-emacsXXXXXX";
+ char *last_slash = strrchr (lfname, '/');
+ ptrdiff_t lfdirlen = last_slash + 1 - lfname;
+ USE_SAFE_ALLOCA;
+ char *nonce = SAFE_ALLOCA (lfdirlen + sizeof nonce_base);
+ int fd;
+ bool need_fchmod;
+ mode_t world_readable = S_IRUSR | S_IRGRP | S_IROTH;
+ memcpy (nonce, lfname, lfdirlen);
+ strcpy (nonce + lfdirlen, nonce_base);
+
+#if HAVE_MKSTEMP
+ /* Prefer mkstemp if available, as it avoids a race between
+ mktemp and emacs_open. */
+ fd = mkstemp (nonce);
+ need_fchmod = 1;
+#else
+ mktemp (nonce);
+ fd = emacs_open (nonce, O_WRONLY | O_CREAT | O_EXCL | O_BINARY,
+ world_readable);
+ need_fchmod = 0;
+#endif
+
+ if (fd < 0)
+ err = errno;
+ else
+ {
+ ptrdiff_t lock_info_len = strlen (lock_info_str);
+ err = 0;
+ if (emacs_write (fd, lock_info_str, lock_info_len) != lock_info_len
+ || (need_fchmod && fchmod (fd, world_readable) != 0))
+ err = errno;
+ if (emacs_close (fd) != 0)
+ err = errno;
+ if (!err && rename_lock_file (nonce, lfname, force) != 0)
+ err = errno;
+ if (err)
+ unlink (nonce);
+ }
+
+ SAFE_FREE ();
+ }
+
+ return err;