shithub: patch

Download patch

ref: 330f505ad7a0e2c19512293ad6a3694cf38e59f6
parent: 912c8621bb5da24236a65a5360057659fc04d67e
author: qwx <qwx@sciops.net>
date: Mon Nov 3 04:22:26 EST 2025

add cron-ori-dmexcl: fix lockfile usage in cron (thanks ori)

--- /dev/null
+++ b/cron-ori-dmexcl
@@ -1,0 +1,65 @@
+diff b5344401da6ab27d87a5b6e6defc65d73dfdf31e uncommitted
+--- a/sys/src/cmd/auth/cron.c
++++ b/sys/src/cmd/auth/cron.c
+@@ -114,33 +114,23 @@
+ }
+ 
+ static int
+-openlock(char *file)
+-{
+-	return create(file, ORDWR, 0600);
+-}
+-
+-static int
+ mklock(char *file)
+ {
+ 	int fd, try;
+-	Dir *dir;
++	Dir d;
+ 
+-	fd = openlock(file);
+-	if (fd >= 0) {
+-		/* make it a lock file if it wasn't */
+-		dir = dirfstat(fd);
+-		if (dir == nil)
+-			error("%s vanished: %r", file);
+-		dir->mode |= DMEXCL;
+-		dir->qid.type |= QTEXCL;
+-		dirfwstat(fd, dir);
+-		free(dir);
+-
+-		/* reopen in case it wasn't a lock file at last open */
+-		close(fd);
+-	}
+-	for (try = 0; try < 65 && (fd = openlock(file)) < 0; try++)
++	fd = -1;
++	nulldir(&d);
++	for (try = 0; try < 650; try++){
++		if((fd = create(file, ORDWR, 0600|DMEXCL)) >= 0){
++			/* In case the file existed but wasn't DMEXCL */
++			d.mode = DMEXCL|0600;
++			d.qid.type = QTEXCL;
++			dirfwstat(fd, &d);
++			break;
++		}
+ 		sleep(10*1000);
++	}
+ 	return fd;
+ }
+ 
+@@ -681,12 +671,10 @@
+ 	char *cap;
+ 	int rv;
+ 
+-	cap = mkcap(getuser(), new);
+-	if(cap == nil)
++	if((cap = mkcap(getuser(), new)) == nil)
+ 		return -1;
+-	rv = usecap(cap);
++	if((rv = usecap(cap)) != -1)
++		rv = newns(new, nil);
+ 	free(cap);
+-
+-	newns(new, nil);
+ 	return rv;
+ }
--