tcsh/tcsh-6.22.02-local-dotlock.dif

83 lines
1.8 KiB
Plaintext

Avoid left over dot lock file after reboot
---
dotlock.c | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 50 insertions(+)
--- dotlock.c
+++ dotlock.c 2020-02-17 11:16:22.785018224 +0000
@@ -30,8 +30,38 @@
#define O_SYNC 0
#endif
+#if defined(__linux__)
+# include <sys/statfs.h>
+# include <unistd.h>
+# ifndef TMPFS_MAGIC
+# define TMPFS_MAGIC 0x01021994
+# endif
+#endif
+
#include "dotlock.h"
+#if defined(__linux__)
+static char *sys_tmpdir;
+static int
+dosys_tmpdir ()
+{
+ static char *shm = "/dev/shm";
+ struct statfs fs;
+ static int doshm;
+
+ if (doshm)
+ return (sys_tmpdir != NULL);
+
+ doshm++;
+
+ if (statfs(shm, &fs) < 0 || fs.f_type != TMPFS_MAGIC || eaccess(shm, W_OK|X_OK))
+ return 0;
+
+ sys_tmpdir = shm;
+ return 1;
+}
+#endif
+
static int create_exclusive(const char *);
/*
* Create a unique file. O_EXCL does not really work over NFS so we follow
@@ -140,7 +170,17 @@ dot_lock(const char *fname, int pollinte
(void)sigaddset(&nset, SIGTSTP);
(void)sigaddset(&nset, SIGCHLD);
+#if defined(__linux__)
+ const char *ptr;
+ if ((ptr = strrchr(fname, '/')) && dosys_tmpdir()) {
+ ptr++;
+ fname = ptr;
+ (void)snprintf(path, sizeof(path), "%s/%s.lock", sys_tmpdir, fname);
+ } else
+ (void)snprintf(path, sizeof(path), "%s.lock", fname);
+#else
(void)snprintf(path, sizeof(path), "%s.lock", fname);
+#endif
retval = -1;
for (;;) {
@@ -174,6 +214,16 @@ dot_unlock(const char *fname)
{
char path[MAXPATHLEN];
+#if defined(__linux__)
+ const char *ptr;
+ if ((ptr = strrchr(fname, '/')) && dosys_tmpdir()) {
+ ptr++;
+ fname = ptr;
+ (void)snprintf(path, sizeof(path), "%s/%s.lock", sys_tmpdir, fname);
+ } else
+ (void)snprintf(path, sizeof(path), "%s.lock", fname);
+#else
(void)snprintf(path, sizeof(path), "%s.lock", fname);
+#endif
(void)unlink(path);
}